Gå til innhold

C#: Forslag til øvingsprogrammer/oppgaver


Anbefalte innlegg

Hei.

 

Driver for tiden og lærer meg C#. Hittil har jeg stort sett skrevet inn eksemplene i bøkene jeg har kikket i (bl.a. Head First C#), og av og til gjort noen små forandringer på dem og prøvd meg litt fram, men ellers lite programmering på egenhånd.

 

Saken er at programmene jeg ser for meg for øyeblikket, føles litt kompliserte for en nybegynner. Trenger derfor forslag til noen enkle småprogrammer eller oppgaver jeg kan begynne med, slik at jeg får komt meg i litt i gang med programmeringen og får bygd opp erfaring.

Lenke til kommentar
Videoannonse
Annonse

Hva er det du sikter mot da? Forms? WPF? Spill?

 

Og med "driver for tiden og lærer meg C#", betyr det at du ikke kan programmere i det hele tatt? Antar kanskje det; og du burde da få objekter inn i fingerspissene.

 

OM du har vært borti java eller noe annet før er det trygt å bare kaste set uti det :D hehe. Ya'll look a like (C#, java). :D

Lenke til kommentar

Det er i grunn ikke så nøye om det er snakk om WPF/Forms, console eller spill, så lenge det er enkle program som er god trening for nybegynnere.

 

Ved et søk fant jeg blandt annet denne siden, Project Euler. Her er iallefall min løsning på "Problem 1" der.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Problem1
{
   class Program
   {
       static void Main(string[] args)
       {
           int sum = 0;
           const int NumberRange = 1000;

           for (int i = 1; i < NumberRange; i++)
           {
               if (i % 3 == 0 || i % 5 == 0)
                   sum += i;
           }
           Console.WriteLine("The sum of all multiples of 3 or 5 below " + NumberRange + ", is " + sum);
       }
   }
}

 

Akkurat den der var vel helst litt for lett. Kunne tenkt meg noen oppgaver som gir god trening i objektorientert programmering, men som ikke er altfor innviklet for en nybegynner. Noen forslag eller forslag til sider jeg kan finne slike? Begynte først å lære meg Java i 2-3 uker, før jeg gikk over til C# og har holdt på med det et par uker nå. Har vel sånn ca. en måneds Java/C# erfaring tilsammen.

 

Utenom det, så har det vært noen sporadiske forsøk på programmering opp igjennom årene, fra AmigaBASIC og AMOS BASIC, til C/C++ for noen år siden. Denne gangen føler jeg meg mye mer motivert og interressert, og C# virker som et veldig greit språk (selv om det kan gå litt i surr i blandt å få hodet med på diverse konsepter innen objektorientert programmering :) ).

 

Apropos objektorientert programmering, noen forslag til programmer/verktøy til å planlegge klasser/objekter og lage diagrammer for å planlegge et program før en setter i gang å programmere?

Lenke til kommentar

Apropos objektorientert programmering, noen forslag til programmer/verktøy til å planlegge klasser/objekter og lage diagrammer for å planlegge et program før en setter i gang å programmere?

Dette følger med Visual Studio, men ikke express versjonene. Ellers kan OpenOffice og MS Office også fint brukes til dette, selv bruker jeg Open Office Draw til dette. Selvsagt genererer disse ikke kode eller kan lage diagrammer utifra kode, men det er en fin måte å organisere tankene litt.

Lenke til kommentar

Prøv FizzBuzz... Har sett et par arbeidsgivere som har benyttet den som test ved rekruttering...

 

Tar dette fra hodet så det er ikke sikkert det er helt rikig (google det)

 

Du skal lage et program som teller fra 1 og oppover med inkrementer på 1 (1,2,3,4,5 osv)

Når telleren er delelig med 3 skal du skrive "Fizz" til konsollet, når telleren er delelig med 5 skal du skrive "Buzz" til konsollet. Og hvis den er delelig med begge deler skal du skrive "FizzBuzz" til konsollet.

 

Cluet er å få koden til å være så liten som mulig.

 

EDIT: Fant lenken: http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html

Coding Horror er forresten en genial blogg for utviklere (da spesiellt C#)

 

-C-

Endret av ChristianW
Lenke til kommentar

Prøv FizzBuzz... Har sett et par arbeidsgivere som har benyttet den som test ved rekruttering...

 

Tar dette fra hodet så det er ikke sikkert det er helt rikig (google det)

 

Du skal lage et program som teller fra 1 og oppover med inkrementer på 1 (1,2,3,4,5 osv)

Når telleren er delelig med 3 skal du skrive "Fizz" til konsollet, når telleren er delelig med 5 skal du skrive "Buzz" til konsollet. Og hvis den er delelig med begge deler skal du skrive "FizzBuzz" til konsollet.

 

Cluet er å få koden til å være så liten som mulig.

 

EDIT: Fant lenken: http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html

Coding Horror er forresten en genial blogg for utviklere (da spesiellt C#)

 

-C-

 

Hva med denne?

using System;

namespace FizzBuzz
{
   class Program
   {
       static void Main(string[] args)
       {
           int range = 20;
           for (int i = 1; i < range; i++)
           {
               if (i % 3 == 0)
                   Console.Write("Fizz");
               if (i % 5 == 0)
                   Console.Write("Buzz");
               if (i % 3 == 0 || i % 5 == 0)
                   Console.WriteLine();
           }
       }
   }
}

Endret av errgo
Lenke til kommentar

using System;

namespace FizzBuzz
{
   class Program
   {
       static void Main(string[] args)
       {
           for (int i = 1; i <= 100; i++)
           {
               string line = "";
               if (i % 3 == 0)
                   line = "Fizz";
               if (i % 5 == 0)
                   line += "Buzz";
               if (line == "")
                   line = i.ToString();
                Console.WriteLine(line);
           }
       }
   }
}

 

Er jeg på rett spor?

Endret av errgo
Lenke til kommentar

Etter å ha googla det ser jeg det er flere løsninge.... Jeg likte denne:

 

HAI
CAN HAS STDIO?
I HAS A VAR IZ 0
IM IN YR LOOP
UPZ VAR!!1
IZ VAR BIGR THAN 100?
	GTFO.
KTHX
IZ VAR LEFTOVAR 15 LIEK 0?
	VISIBLE "FIZZBUZZ"
KTHX
ORLY?
IZ VAR LEFTOVAR 5 LIEK 0?
	VISIBLE "BUZZ"
KTHX
ORLY?
IZ VAR LEFTOVAR 3 LIEK 0?
	VISIBLE "FIZZ"
KTHX
NOWAI
	VISIBLE VAR
KTHX
KTHX
KTHXBYE

Lenke til kommentar

Hack'n'Slash, ett statement:

static void Main(string[] args) {
for(int i = 0; i++ < 100; Console.WriteLine( i % 15 == 0 ? "FizzBuzz" : i % 3 == 0 ? "Fizz" : i % 5 == 0 ? "Buzz" : i.ToString() )) ;
}

 

Alternativt, for lambda-junkies:

 

static void Main(string[] args) {
    Counter( 100 ).PrintAll( x => x % 15 == 0 ? "FizzBuzz" : x % 3 == 0 ? "Fizz" : x % 5 == 0 ? "Buzz" : x.ToString() );
}

static IEnumerable<int> Counter(int max) {
   for(int i = 0; i <= max; i++) 
       yield return i;
}

static void PrintAll<T>(this IEnumerable<T> el, Func<T,string> transform) {
   foreach(var s in el) 
       Console.WriteLine(transform(s));
}

Edit: erstattet linq.Select med transform via lambda, mye kulere og mer generisk PrintAll.

Endret av MailMan13
Lenke til kommentar

Takk for tipset MailMan13, jeg hadde helt glemt ut conditional operator :)

 

Tok og gjorde den litt penere og mer oversiktlig, samtidig som koden fortsatt er kort.

static void Main(string[] args)
       {
           for (int i = 1; i <= 100; i++)
           {
               string line = (i % 15 == 0 ? "FizzBuzz" : i % 3 == 0 ? "Fizz" : i % 5 == 0 ? "Buzz" : i.ToString());
               Console.WriteLine(line);
           }
       }

Lenke til kommentar

Jeg føler denne FizzBuzz prøver å bekjempe eleganse og lesbarhet. Klart "one line wonders" gir mindre kode og kanskje eksikverer raskere, men det går på bekostning av eleganse og lesbarhet.

 

Skal en demonstere finurligheter i matematikken og god kode bør en sette seg ned å finne seg et mer avansert problem og løse dette med et dataspråk. Husker en oppgave vi gjorde på skolen, finne en løsning for påskedagsalgoritmen, i assembly :D mye rare svaralternativer som kom inn da :D

Lenke til kommentar
  • 2 uker senere...

Nå har jeg prøvd meg på å lage en enkel kalkulator. Her er hva jeg har kommet fram til så langt.

public partial class Form1 : Form
   {
       private char function;
       private decimal decimal1;
       private decimal decimal2;
       private decimal sum;

       public Form1()
       {
           InitializeComponent();
           this.KeyUp += new KeyEventHandler(this.form1_KeyUp);
       }

       private void form1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
       {
           if (!textBox1.Focused)
           {
               if (e.KeyValue >= 48 && e.KeyValue <= 57)
                   textBox1.Text += (e.KeyValue - 48);
               if (e.KeyValue >= 96 && e.KeyValue <= 105)
                   textBox1.Text += (e.KeyValue - 96);
               if (e.KeyCode == Keys.Decimal || e.KeyCode == Keys.Oemcomma)
                   decimalSymbol_Click(sender, e);
           }
           switch (e.KeyCode)
           {
               case Keys.Add:
               case Keys.Oemplus:
                   add_Click(sender, e);
                   break;
               case Keys.Divide:
                   divide_Click(sender, e);
                   break;
               case Keys.Subtract:
               case Keys.OemMinus:
                   subtract_Click(sender, e);
                   break;
               case Keys.Multiply:
                   multiply_Click(sender, e);
                   break;
           }
       }

       private void zero_Click(object sender, EventArgs e)
       {
           if (textBox1.Text != "")
               textBox1.Text += "0";
       }

       private void one_Click(object sender, EventArgs e)
       {
           textBox1.Text += "1";
       }

       private void two_Click(object sender, EventArgs e)
       {
           textBox1.Text += "2";
       }

       private void three_Click(object sender, EventArgs e)
       {
           textBox1.Text += "3";
       }

       private void four_Click(object sender, EventArgs e)
       {
           textBox1.Text += "4";
       }

       private void five_Click(object sender, EventArgs e)
       {
           textBox1.Text += "5";
       }

       private void six_Click(object sender, EventArgs e)
       {
           textBox1.Text += "6";
       }

       private void seven_Click(object sender, EventArgs e)
       {
           textBox1.Text += "7";
       }

       private void eight_Click(object sender, EventArgs e)
       {
           textBox1.Text += "8";
       }

       private void nine_Click(object sender, EventArgs e)
       {
           textBox1.Text += "9";
       }

       private void decimalSymbol_Click(object sender, EventArgs e)
       {
           if (textBox1.Text != "" && !textBox1.Text.Contains(','))
               textBox1.Text += ",";
       }

       private void divide_Click(object sender, EventArgs e)
       {
           decimal1 = Convert.ToDecimal(textBox1.Text);
           function = '/';
           textBox1.Clear();
       }

       private void multiply_Click(object sender, EventArgs e)
       {
           decimal1 = Convert.ToDecimal(textBox1.Text);
           function = '*';
           textBox1.Clear();
       }

       private void subtract_Click(object sender, EventArgs e)
       {
           decimal1 = Convert.ToDecimal(textBox1.Text);
           function = '-';
           textBox1.Clear();
       }

       private void add_Click(object sender, EventArgs e)
       {
           decimal1 = Convert.ToDecimal(textBox1.Text);
           function = '+';
           textBox1.Clear();
       }

       private void sumEquals_Click(object sender, EventArgs e)
       {
           decimal2 = Convert.ToDecimal(textBox1.Text);
           switch (function)
           {
               case '/':
                   if (decimal2 == 0)
                   {
                       MessageBox.Show("Can't divide by zero");
                       return;
                   }
                   else
                   {
                       sum = decimal1 / decimal2;
                   }
                   break;
               case '*':
                   sum = decimal1 * decimal2;
                   break;
               case '-':
                   sum = decimal1 - decimal2;
                   break;
               case '+':
                   sum = decimal1 + decimal2;
                   break;
               case '%':
                   sum = decimal1 % decimal2;
                   break;
           }
           textBox1.Text = sum.ToString();
       }

       private void reset_Click(object sender, EventArgs e)
       {
           sum = 0;
           decimal1 = 0;
           textBox1.Clear();
       }

       private void modulus_Click(object sender, EventArgs e)
       {
           decimal1 = Convert.ToDecimal(textBox1.Text);
           function = '%';
           textBox1.Clear();
       }
   }

 

Hvordan ser det ut? Noe dere ville gjort annerledes/bedre?

Lenke til kommentar

Det er ihvertfall veldig lik kode repetert veldig mange ganger der. Det er en klassisk code smell som bør fås bukt med. Mange av knappene dine akkurat det samme, da kan det være lurt å håndtere dem i samme metode og bruke f.eks Tag-propertyet på knappene til å f.eks si hvilket tall som skal appendes.

 

Samme med operatorknappene. Heller ha en delegate i knappens tag som utfører operatoren så kan dem håndteres med èn metode også.

Endret av MailMan13
Lenke til kommentar

Har fått fjernet noen unødvendige event handlers nå. Skjønte ikke helt hva du mente med delegates på operatorene, har ikke vært borti det. Kan du forklare litt eller gi eksempel?

public partial class Form1 : Form
   {
       private string function;
       private decimal decimal1;
       private decimal decimal2;
       private decimal sum;

       public Form1()
       {
           InitializeComponent();
           this.KeyUp += new KeyEventHandler(this.form1_KeyUp);
       }

       private void form1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
       {
           if (!textBox1.Focused)
           {
               if (e.KeyValue >= 48 && e.KeyValue <= 57)
                   textBox1.Text += (e.KeyValue - 48);
               if (e.KeyValue >= 96 && e.KeyValue <= 105)
                   textBox1.Text += (e.KeyValue - 96);
               if (e.KeyCode == Keys.Decimal || e.KeyCode == Keys.Oemcomma)
                   decimalSymbol_Click(sender, e);
           }
           switch (e.KeyCode)
           {
               case Keys.Add:
               case Keys.Oemplus:
                   function = "+";
                   goto default;
               case Keys.Divide:
                   function = "/";
                   goto default;
               case Keys.Subtract:
               case Keys.OemMinus:
                   function = "-";
                   goto default;
               case Keys.Multiply:
                   function = "*";
                   goto default;
               default:
                   decimal1 = Convert.ToDecimal(textBox1.Text);
                   break;
           }
       }

       private void number_Click(object sender, EventArgs e)
       {
           Button button = (Button)sender;
           if (textBox1.Text == "" && button.Text == "0")
               return;
           textBox1.Text += button.Text;
       }

       private void decimalSymbol_Click(object sender, EventArgs e)
       {
           if (textBox1.Text != "" && !textBox1.Text.Contains(','))
               textBox1.Text += ",";
       }

       private void function_Click(object sender, EventArgs e)
       {
           Button button = (Button)sender;
           decimal1 = Convert.ToDecimal(textBox1.Text);
           function = button.Text;
           textBox1.Clear();
       }

       private void sumEquals_Click(object sender, EventArgs e)
       {
           decimal2 = Convert.ToDecimal(textBox1.Text);
           switch (function)
           {
               case "/":
                   if (decimal2 == 0)
                   {
                       MessageBox.Show("Can't divide by zero");
                       return;
                   }
                   else
                       sum = decimal1 / decimal2;
                   break;
               case "*":
                   sum = decimal1 * decimal2;
                   break;
               case "-":
                   sum = decimal1 - decimal2;
                   break;
               case "+":
                   sum = decimal1 + decimal2;
                   break;
               case "Mod":
                   sum = decimal1 % decimal2;
                   break;
           }
           textBox1.Text = sum.ToString();
       }

       private void reset_Click(object sender, EventArgs e)
       {
           sum = 0;
           textBox1.Clear();
       }
   }

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...