Helt kört fast på uppgift i nybörjar-programmering; C#...

Trädvy Permalänk
Medlem
Registrerad
Okt 2018

Helt kört fast på uppgift i nybörjar-programmering; C#...

Hej! Har nåt läget att hur mycket jag än tittar på vad jag gjort eller andra gjort så fattar jag inte vart det blir fel... Poängen är enkel och jag gör det troligtvis svårare än vad det är vilket lämnar mig arg och frustrerade. All hjälp mottages tacksamt innan datorn flyger med sladden först ut genom fönstret.

Man ska alltså ha ett nr mellan 1-25 och spelet ska random dra ett nr som sen ska jämföras med de tio nr som spelaren får välja. Här är min kod just nu;

namespace Lottodragning { class Program { static void Main(string[] args) { Console.WriteLine("Välkommen till Lottodragningen; vänligen skriv in de 10 tal du vill tävla med: "); Console.WriteLine("Välj siffror mellan 1-25; tryck enter mellan varje siffra du väljer : "); int[] guestNr = new int[10]; try { guestNr[0] = int.Parse(Console.ReadLine()); guestNr[1] = int.Parse(Console.ReadLine()); guestNr[2] = int.Parse(Console.ReadLine()); guestNr[3] = int.Parse(Console.ReadLine()); guestNr[4] = int.Parse(Console.ReadLine()); guestNr[5] = int.Parse(Console.ReadLine()); guestNr[6] = int.Parse(Console.ReadLine()); guestNr[7] = int.Parse(Console.ReadLine()); guestNr[8] = int.Parse(Console.ReadLine()); guestNr[9] = int.Parse(Console.ReadLine()); } catch (Exception) { Console.WriteLine("Använd bara siffror mellan 1-25"); } Console.WriteLine("Let the Game begin!"); Random randomness = new Random(); int victoryNr = randomness.Next(1, 25); for (int i = 0; i < 25; i++) if (victoryNr == guestNr[i]) { Console.WriteLine("Grattis! Rätt nummer var " + victoryNr + " och du lyckades pricka in den!"); break; } else { Console.WriteLine("Rätt nummer blev " + victoryNr + " Bättre lycka nästa gång!"); break; }

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@IKnowLessThanJohnSnow: Det underlättar alltid om du faktiskt talar om vad som är fel, men det uppenbara felet jag kan se är att du avslutar den sista loopen redan i första iterationen oavsett om siffran var rätt eller inte (du har med andra ord break i båda grenarna av if-satsen). Du kan inte avgöra om spelaren har gissat fel förrän du gått igenom alla spelarens siffror, d.v.s. använd for-loopen enbart för att avgöra om spelaren har gissat rätt eller inte och ha utskrifterna efter loopen istället.

Du loopar även för många gånger, antalet gissningar är bara 10 och inte 25. Använd hellre guestNr.Length som villkor i for-loopen istället (varför heter arrayen guestNr förresten, ska det kanske vara guessNr?). Passa gärna på att ändra så att du använder en for-loop även för inläsningen till arrayen, istället för att upprepa Console.ReadLine. Du bör med andra sträva efter att kunna ändra antalet gissningar på ett enda ställe i koden, och allt ska fungera korrekt.

Sist men inte minst, använd gärna code-taggar när du postar kod här, så blir den mycket lättare att läsa. D.v.s.:
[code]
Kod här
[/code]

Tillägg: Förresten, gör dig själv en tjänst och lär dig använda debuggern, här är t.ex. en kort video som visar hur det fungerar. Det kommer spara dig väldigt mycket tid om du bara tar några minuter och lär dig hur det fungerar, eftersom debuggern låter dig stega igenom din kod rad för rad och se exakt vad koden gör.

Trädvy Permalänk
Medlem
Plats
Staffanstorp
Registrerad
Okt 2001

Förutom ovanstående så skulle jag vilja tillägga att du aldrig gör en kontroll om det guestNr faktiskt är mellan 1 och 25, dvs 2 till och med 24. Int.Parse kontrollerar bara om inmatningen är en korrekt int, vilket även 1679 är...

Skickades från m.sweclockers.com

WS: i7-2600k på vatten | GTX 970 på luft | Corsair AX860W | Corsair Obsidian 750D | 3x Dell U2414H
HTPC1: Pentium G2020 | GT520 | Seasonic X-400 Fanless | FD Node 605 | Noctua NH-L9i
HTPC2: Intel NUC3217IYE | 8GB | 120GB mSATA
Server1: HP N54L Microserver | Server2: Fujitsu Primergy Tx1310 M1 | Dell R210 II

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Apr 2010
Skrivet av whisky:

Förutom ovanstående så skulle jag vilja tillägga att du aldrig gör en kontroll om det guestNr faktiskt är mellan 1 och 25, dvs 2 till och med 24. Int.Parse kontrollerar bara om inmatningen är en korrekt int, vilket även 1679 är...

Skickades från m.sweclockers.com

Kontroller på variabler är sällan nybörjargrej. Men en bra grej att kunna.

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Trädvy Permalänk
Medlem
Plats
Staffanstorp
Registrerad
Okt 2001

@freddyfresh: Jag tänkte mest på att TS hade en try/catch, men felmeddelandet som skrevs ut var inte helt sanningsenligt. Eftersom uppgiften dessutom var att användaren skulle mata in ett tal mellan 1 och 25 så måste det kontrolleras att det är det användaren gör, annars följs inte uppgiften.

WS: i7-2600k på vatten | GTX 970 på luft | Corsair AX860W | Corsair Obsidian 750D | 3x Dell U2414H
HTPC1: Pentium G2020 | GT520 | Seasonic X-400 Fanless | FD Node 605 | Noctua NH-L9i
HTPC2: Intel NUC3217IYE | 8GB | 120GB mSATA
Server1: HP N54L Microserver | Server2: Fujitsu Primergy Tx1310 M1 | Dell R210 II

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Apr 2010

Förstår hur du tänker nu Det går lätt att lösa däremot.

Om man skulle lagrat en variabel temporärt som t.ex. "input" som ligger före.

  1. Läs in värdet och spara det till en variabel (exempelvis "input")

  2. Kolla i en if-sats om den är större än (>) 0 och (&&) mindre än 26 (<)

  3. Tilldela den guestNr[9] = input;

  4. Repetera för varje (om man nu väljer att använda metoden ovan) (vore enklare med en for-loop).

Finns ganska många lösningar här, men kan du visa uppgiften du fick istället för att vi gissar oss fram?

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Trädvy Permalänk
Medlem
Registrerad
Okt 2016

for i = 0; i < 10; i++
num[i] = readline
if num[i] < 1 || num[i] > 25
print "dumbjävel"; i--

Lite snabb psedo kod, är inte krångligare så vida man inte vill hantera decimaltal också.

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Apr 2010
Skrivet av Sinery:

for i = 0; i < 10; i++
num[i] = readline
if num[i] < 1 || num[i] > 25
print "dumbjävel"; i--

Lite snabb psedo kod, är inte krångligare så vida man inte vill hantera decimaltal också.

Lite väl dömande eller?

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Trädvy Permalänk
Medlem
Registrerad
Nov 2010

det är break på else satsen som spökar där, oavsett vad som än händer så kommer den bara gå igenom for loopen en gång

Trädvy Permalänk
Medlem
Registrerad
Jan 2013

Uppenbara fel är att du breakar i båda samt att du loopar 25 gånger istället för 10. Tänk efter om du verkligen behöver ett else i for loopen eller inte. För övrigt bör du alltid använda måsvingar vid if, for loopar, while loopar osv. I denna uppgift är det väl lätt att se men vid eventuella större program är det dödsfällor.

Mvh