errgo Skrevet 10. mai 2010 Del Skrevet 10. mai 2010 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
South_Bridge Skrevet 10. mai 2010 Del Skrevet 10. mai 2010 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 hehe. Ya'll look a like (C#, java). Lenke til kommentar
errgo Skrevet 10. mai 2010 Forfatter Del Skrevet 10. mai 2010 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
GeirGrusom Skrevet 10. mai 2010 Del Skrevet 10. mai 2010 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
errgo Skrevet 10. mai 2010 Forfatter Del Skrevet 10. mai 2010 Jeg bruker Visual Studio 2010 Ultimate. Hvordan lager du slike diagrammer i VS? Lenke til kommentar
GeirGrusom Skrevet 10. mai 2010 Del Skrevet 10. mai 2010 Høyreklikk på prosjektet, add new item-> Class diagram Lenke til kommentar
Wattengård Skrevet 10. mai 2010 Del Skrevet 10. mai 2010 (endret) 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 10. mai 2010 av ChristianW Lenke til kommentar
errgo Skrevet 10. mai 2010 Forfatter Del Skrevet 10. mai 2010 (endret) 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 10. mai 2010 av errgo Lenke til kommentar
Wattengård Skrevet 10. mai 2010 Del Skrevet 10. mai 2010 Det er nok de flestes første utkast... Men du skal klare å korte det ned enda mer... -C- Lenke til kommentar
errgo Skrevet 11. mai 2010 Forfatter Del Skrevet 11. mai 2010 (endret) 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 11. mai 2010 av errgo Lenke til kommentar
South_Bridge Skrevet 11. mai 2010 Del Skrevet 11. mai 2010 (endret) Finn en måte å droppe modulustesten EDIT: Etter nærmere ettertanke er det garantert en uberway å gjøre det på. Jeg har ikke anledning eller gidd å sette meg ned å teste så min konklusjon er meget usikker Endret 11. mai 2010 av South_Bridge Lenke til kommentar
South_Bridge Skrevet 11. mai 2010 Del Skrevet 11. mai 2010 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
MailMan13 Skrevet 11. mai 2010 Del Skrevet 11. mai 2010 (endret) 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 11. mai 2010 av MailMan13 Lenke til kommentar
errgo Skrevet 11. mai 2010 Forfatter Del Skrevet 11. mai 2010 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
errgo Skrevet 11. mai 2010 Forfatter Del Skrevet 11. mai 2010 Eventuelt: static void Main(string[] args) { for (int i = 1; i <= 100; i++) Console.WriteLine( i % 15 == 0 ? "FizzBuzz" : i % 3 == 0 ? "Fizz" : i % 5 == 0 ? "Buzz" : i.ToString()); } Lenke til kommentar
South_Bridge Skrevet 11. mai 2010 Del Skrevet 11. mai 2010 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 mye rare svaralternativer som kom inn da Lenke til kommentar
MailMan13 Skrevet 11. mai 2010 Del Skrevet 11. mai 2010 If it's worth doing, it's worth overdoing. 8) Lenke til kommentar
errgo Skrevet 19. mai 2010 Forfatter Del Skrevet 19. mai 2010 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
MailMan13 Skrevet 19. mai 2010 Del Skrevet 19. mai 2010 (endret) 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 19. mai 2010 av MailMan13 Lenke til kommentar
errgo Skrevet 19. mai 2010 Forfatter Del Skrevet 19. mai 2010 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå