for-loop villkor och length c#

Permalänk
Medlem

for-loop villkor och length c#

Hej! Jag håller på med uppgiften lottobollar i programmering 1 och har ett par saker jag inte förstår jag gärna skulle vilja ha förklarat för mig. Jag har skrivit koden på E nivå och jobbar nu med delarna på C nivå.
1. I uppgiften på C nivå vill dom att man förutom i++ ska använda i-- i villkoren i for-loopen. Alltså så att om användaren skriver in ett giltigt tal ökar i med 1 och om svaret inte är giltigt ska den minska med 1. Men jag har inte hittat något exempel med hur man kan ha två villkor i villkoren i for-loopen. Eller har jag missförstått vad dom menar?
2. Efter att ha läst många många trådar om denna uppgift ser jag att många använder length i deras for-loop. Varken vår studieguide eller läroboken förklarar length på ett sätt så att jag förstår och jag har därför inte lagt in den i min kod eftersom jag inte vet hur den skulle påverka resten av koden. Och tyvärr har jag inte hittat något på internet som jag förstår, det känns som att alla sidor där length är med skriver de bara 1-2 meningar men inte ordentligt förklarar vad length har för funktion och hur man praktiskt använder den?

Detta är uppgiften på C-nivå:
Ni ska nu kontrollera så att användaren bara skriver in ett tal mellan 1 och 25. Detta lösas enklast genom att man styr inmatning till respektive position i vektorn med en for-loop. I for-loopen finns en variabel (förändring, exempelvis i) som kontrollerar vilken position man för närvarande ”pekar på” i vektorn. Om talet som användaren skriver in är under 1 eller över 25 kan man minska värdet i variabeln (i) som styr positionen med ett (1) enligt figuren nedan. Då ”backar” vi ett steg i vektorn. Alltså – för varje varv som for-loopen itererar så kommer värdet på variabeln som styr förändring att öka med ett (1). Men om vi skriver in ett ”olämpligt” värde så kommer värdet att minska med ett (1) i koden inuti loopen. Alternativet är att ni sparar det inmatade talet i en temporär variabel och lagrar det i vektorn om det uppnår kraven (det vill säga är mellan ett och tjugofem)

Detta är min kod hittills:

namespace Lottobollar { class Program { static void Main(string[] args) { int[] minvektor; //Hakparanteserna efter int visar att det ska vara en vektor. minvektor = new int[10]; //Vektorn har 10 positioner, det syns i hakparanteserna efter new. Random randomerare = new Random(); int slump_tal = randomerare.Next(1, 26); //slumpar ett tal mellan 1 och 25 Console.WriteLine("Välkommen till spelet Lottobollar! :)"); Console.WriteLine("Du har 10 försök på dig att gissa rätt nummer på lottobollen, Lycka till!"); for (int i = 0; i < 10; i++) //i står för index. loopen håller på medans index är mindre än 10 (0-9). för varje loop/varv adderas index med 1. { try { Console.WriteLine("Vänligen skriv in ett heltal mellan 1-25: "); minvektor[i] = Convert.ToInt32(Console.ReadLine()); //läser in användarens svar, konverterar det till int, och informationen sparas i vektorns index. } catch { Console.WriteLine("Du måste skriva ditt svar med siffror. Endast helttal är tillåtet."); } if (minvektor[i] == slump_tal) { Console.WriteLine("Grattis! Du gissade rätt, numret på lottobollen är " + slump_tal); } else if (minvektor[i] != slump_tal) { Console.WriteLine("Tyvärr har du slut på försök! Numret på lottobollen var " + slump_tal); } } } } }

Permalänk
Medlem

1. Du kan ändra på i var som helst inne i for-loopen, du behöver inte ha det i själva for-satsen. Istället för t.ex.:

for (int i = 0; i < 10; i++) { ... }

så kan du alltså skriva t.ex.:

for (int i = 0; i < 10; ) { ... i++; }

vilket är samma sak (men bättre att ha det i for-satsen i det fallet eftersom det är det förväntade sättet att skriva det på).

2. Length är en s.k. property för arrayer som helt enkelt returnerar storleken på arrayen. D.v.s. minvektor.Length är lika med 10 i det här fallet. Fördelen med att använda det istället för hårdkodade tal är att du då kan ändra på storleken på arrayen utan att behöva ändra på alla ställen där du hårdkodat t.ex. 10.

Notera bara att minvektor.Length alltid är 10 (eller hur stor arrayen nu är). Vissa nybörjare blir ibland förvirrade och tror att det är antalet element som de satt ett värde på i arrayen, men arrayer har alltid en fast storlek.

Permalänk
Medlem
Skrivet av perost:

1. Du kan ändra på i var som helst inne i for-loopen, du behöver inte ha det i själva for-satsen. Istället för t.ex.:

for (int i = 0; i < 10; i++) { ... }

så kan du alltså skriva t.ex.:

for (int i = 0; i < 10; ) { ... i++; }

vilket är samma sak (men bättre att ha det i for-satsen i det fallet eftersom det är det förväntade sättet att skriva det på).

2. Length är en s.k. property för arrayer som helt enkelt returnerar storleken på arrayen. D.v.s. minvektor.Length är lika med 10 i det här fallet. Fördelen med att använda det istället för hårdkodade tal är att du då kan ändra på storleken på arrayen utan att behöva ändra på alla ställen där du hårdkodat t.ex. 10.

Notera bara att minvektor.Length alltid är 10 (eller hur stor arrayen nu är). Vissa nybörjare blir ibland förvirrade och tror att det är antalet element som de satt ett värde på i arrayen, men arrayer har alltid en fast storlek.

Hej, tack!

Jag förstår dock inte hur jag ska kunna ha med både i++ och i-- inuti parentesen efter for. Eller är det meningen att jag ska använda dessa i tex if-satser inuti for-loopen? För det känns enklare men jag vet inte om det blir vad läraren är ute efter.

Permalänk
Medlem
Skrivet av Hubbiedub:

Hej, tack!

Jag förstår dock inte hur jag ska kunna ha med både i++ och i-- inuti parentesen efter for. Eller är det meningen att jag ska använda dessa i tex if-satser inuti for-loopen? För det känns enklare men jag vet inte om det blir vad läraren är ute efter.

Exakt så är det tänkt. Använd if-satser för att kolla om det inmatade värdet är korrekt. Om det inte är korrekt så använder du helt enkelt i-- för att köra om nuvarande iteration

Permalänk
Medlem
Skrivet av Pamudas:

Exakt så är det tänkt. Använd if-satser för att kolla om det inmatade värdet är korrekt. Om det inte är korrekt så använder du helt enkelt i-- för att köra om nuvarande iteration

Tusen tack! då var det ju inte så svårt som jag hade försökt att göra det till! xD Ha en bra kväll!

Permalänk
Medlem
Skrivet av Hubbiedub:

Tusen tack! då var det ju inte så svårt som jag hade försökt att göra det till! xD Ha en bra kväll!

Så är det i början, man brottas helt enkelt med syntax (dvs vad man kan skriva och på vilket ställe). Hoppas du fick till det

Permalänk
Medlem
Skrivet av Rekl3M:

Så är det i början, man brottas helt enkelt med syntax (dvs vad man kan skriva och på vilket ställe). Hoppas du fick till det

Tack! Ja jag har upptäckt att det svåraste är precis just sånt för mig! Jag har fått till allt det jag skrev om hjälp här nu. Såklart har man direkt stött på ett par andra mindre problem haha, men jag känner mig (ganska) säker att jag borde kunna lösa dom själv med lite tid..

Permalänk
Medlem

Hej igen alla! Jag har ett problem jag inte lyckats lösa. Det är den sista Console.Writeline som står i min kod högst upp i tråden, som alltså skrivs ut när användaren har slut på gissningar och inte har lyckats gissat rätt. Den skrivs inte ut och jag vet inte vad jag ska skriva inuti else if för att det ska funka. Hur skriver man för att referera till en index, i detta fall den sista, 9? minvektor[i] = 9 funkar inte, och jag gissar att det är för att den då kollar om värdet 9 finns i listan. Men jag menar ju plats 9 i listan.

Permalänk
Medlem

@Hubbiedub: Du använder helt enkelt minvektor[9] (eller minvektor[minvektor.Length - 1]) för att referera till det sista elementet, men det är inte vad du vill göra i det här fallet utan du vill snarare kolla om i är 9. minvektor[9] kommer ju inte tilldelas något värde förrän i den sista iterationen.

Men jag skulle rekommendera att inte ha utskrifterna för om användaren gissade rätt eller ej inne i loopen alls, utan istället använda en bool-variabel som du t.ex. initialiserar till false före loopen och sen sätter till true om användaren gissade rätt. Sen kan du använda den efter loopen för att skriva ut rätt meddelande.

Koden blir då lite enklare eftersom den först kollar om användaren gissade rätt och sen skriver ut ett meddelande, istället för att försöka göra båda sakerna samtidigt. Att försöka dela upp en uppgift i mindre delar är ofta en bra idé eftersom det blir enklare att resonera om vad koden gör då.

Tillägg: Kolla förresten om du verkligen gör som uppgiften säger, den jag sett säger att det korrekta svaret slumpas fram efter att användaren matat in sina gissningar medan du gör det före. Ditt sätt är bättre eftersom du då egentligen inte behöver lagra användarens gissningar utan bara jämföra varje gissning mot det korrekta svaret, men du uppfyller då inte uppgiftens krav.

Permalänk
Medlem
Skrivet av Hubbiedub:

Hur skriver man för att referera till en index, i detta fall den sista, 9? minvektor[i] = 9 funkar inte

= 9 är en tilldelning. == 9 är en jämförelse. Brukar rekommendera att istället skriva "9 == vector[i]" så att "9 = vector[i]" ger ett kompileringsfel.

Permalänk
Medlem
Skrivet av perost:

@Hubbiedub: Du använder helt enkelt minvektor[9] (eller minvektor[minvektor.Length - 1]) för att referera till det sista elementet, men det är inte vad du vill göra i det här fallet utan du vill snarare kolla om i är 9. minvektor[9] kommer ju inte tilldelas något värde förrän i den sista iterationen.

Men jag skulle rekommendera att inte ha utskrifterna för om användaren gissade rätt eller ej inne i loopen alls, utan istället använda en bool-variabel som du t.ex. initialiserar till false före loopen och sen sätter till true om användaren gissade rätt. Sen kan du använda den efter loopen för att skriva ut rätt meddelande.

Koden blir då lite enklare eftersom den först kollar om användaren gissade rätt och sen skriver ut ett meddelande, istället för att försöka göra båda sakerna samtidigt. Att försöka dela upp en uppgift i mindre delar är ofta en bra idé eftersom det blir enklare att resonera om vad koden gör då.

Tillägg: Kolla förresten om du verkligen gör som uppgiften säger, den jag sett säger att det korrekta svaret slumpas fram efter att användaren matat in sina gissningar medan du gör det före. Ditt sätt är bättre eftersom du då egentligen inte behöver lagra användarens gissningar utan bara jämföra varje gissning mot det korrekta svaret, men du uppfyller då inte uppgiftens krav.

Så smart, tack för svar! Och det är möjligt att du har rätt om att jag har missförstått uppgiften, jag har läst igenom den igen och instruktionerna för E och C nivå är så olika så jag vet inte exakt vad läraren är ute efter. Lämnade in uppgiften igår så nu är det som det är iaf

Permalänk
Medlem
Skrivet av hasenfrasen:

= 9 är en tilldelning. == 9 är en jämförelse. Brukar rekommendera att istället skriva "9 == vector[i]" så att "9 = vector[i]" ger ett kompileringsfel.

Tack! Jag skriver så ofta fel med alla tecken