Permalänk
Medlem

Slumpa lottobollar i vektor

Hej! Jag har suttit fast på samma uppgift ett tag nu, så nu ber jag er om hjälp!
Jag har i uppgift att låta användaren skriva in 10 tal som ska lagras i en vektor, när användaren har skrivit in 10 tal så ska ett tal slumpas fram, koden ska nu läsa alla tal som användaren skrivit in (i vektorn) och testa tal för tal mot eventuella matchningar. Får man en matchning har man vunnit, d.v.s. att talet i vektorn är lika med talet som slumpats fram. Jag ska använda mig av for eller foreach. Jag ska loopa igenom vektorn tills användaren gissar rätt tal.

Jag är nybörjare inom programmering.

Så här se min kod ut hittills:

namespace Lotto_Bollar { class Program { static void Main(string[] args) { Console.WriteLine("Ange tio tal, talet ska vara mellan 0-25 "); int[] tal = new int[10]; //lagrar 10 tal i vektor for (int i = 0; i <= tal.Length; i++) { Console.WriteLine("Tal: "); //Mata in tal string tioTal = Console.ReadLine(); //läser in tal int element = Convert.ToInt32(tioTal); //omvandlar till heltal tal[i] = element; //(?) Random randomerare = new Random(); //skapar randomerare int slump = randomerare.Next(25); //Slumpa ett tal mellan 0 och 25 if (tal[i] == slump) { Console.WriteLine("Talet matchade! Bingo!" + slump); } } } } }

Det står ej något om vilken maxgräns det ska vara på slumptal så jag valde 0-25, det känns ju rätt rimligt.

Alla svar uppskattas!

Permalänk
Inaktiv

Metoden du har gör ju inte alls vad du säger att den skall göra.

Du gör ju motsvarande

Repetera 10 gånger läs in tal kolla om tal är lika med slumptal Sluta repetera

Medan du säger att du ska göra Repetera 10 gånger läs in tal Sluta repetera Kolla om tal innehåller slumptal

Låter också konstigt att uppgiften skulle vara utformad som du säger, är du säker på att du förstått och skrivit av den korrekt?

Permalänk
Medlem

Ta även en titt på hur många varv din loop kör, just nu ser du ut att köra 1 varv för mycket.

Permalänk
Medlem

@anon81912:

Uppgiften är utformad så här:

Uppgiften handlar om lottobollar.
I denna uppgift kommer ni få arbeta med vektorer och slumptal.
Vidare kommer ni få visa att ni kan loopa (iterera) genom en vektor på ett lämpligt sätt, och för vektorer
används då ofta for- eller foreach.
Grund-funktionalitet (Betyg E):
I uppgiften ska besökaren få skriva in 10 stycken tal som lagras i en vektor.
När användaren skrivit in 10 stycken tal börjar spelet.
Nu ska ett tal slumpas fram.
Koden ska nu läsa alla tal som användaren skrivit in (i vektorn) och testa tal för
tal mot eventuella matchningar. Får man en matchning har man vunnit, d.v.s.
att talet i vektorn är lika med talet som slumpats fram.

Jag tycker själv att uppgiften är lite otydlig. Men som jag förstår det vill dom att man skriver in 10 tal och sedan EFTER att användaren skrivit in talen, då slumpa ett tal och om det matchar med något utav talen har man vunnit, och skriver då ut Bingo och vilket tal det var som matchade.

Permalänk
Inaktiv
Skrivet av Bananeripyamas:

@Killbom:

Uppgiften är utformad så här:

Uppgiften handlar om lottobollar.
I denna uppgift kommer ni få arbeta med vektorer och slumptal.
Vidare kommer ni få visa att ni kan loopa (iterera) genom en vektor på ett lämpligt sätt, och för vektorer
används då ofta for- eller foreach.
Grund-funktionalitet (Betyg E):
I uppgiften ska besökaren få skriva in 10 stycken tal som lagras i en vektor.
När användaren skrivit in 10 stycken tal börjar spelet.
Nu ska ett tal slumpas fram.
Koden ska nu läsa alla tal som användaren skrivit in (i vektorn) och testa tal för
tal mot eventuella matchningar. Får man en matchning har man vunnit, d.v.s.
att talet i vektorn är lika med talet som slumpats fram.

Jag tycker själv att uppgiften är lite otydlig. Men som jag förstår det vill dom att man skriver in 10 tal och sedan EFTER att användaren skrivit in talen, då slumpa ett tal och om det matchar med något utav talen har man vunnit, och skriver då ut Bingo och vilket tal det var som matchade.

Så då är ju ditt nästa steg att flytta ut din random ur loopen, därefter se om din lista har talet du slumpade fram, hur går det då?

Permalänk
Medlem

Om tanken är att användaren ska kunna gissa 10ggr på ett och samma slumptal så måste slumptalet genereras innan loopen, som det är nu nollställer du slumpgeneratorn varje iteration i loopen.

Eftersom det bara är 10 element i arrayen så föreslår jag att du delar upp programmet i två moment, "inmatning och lagring" samt "generera nytt slumptal och jämför", där båda kan använda antingen en foreach eller en for-loop.

Annars finns det egentligen ingen poäng med att lagra alla tio talen i en array, när du lika gärna kan göra en direkt jämförelse efter varje inmatning (som du gör nu). Men sen å andra sidan är inte alltid skoluppgifter så genomtänkta

Permalänk
Testpilot
Skrivet av elBenko:

Om tanken är att användaren ska kunna gissa 10ggr på ett och samma slumptal så måste slumptalet genereras innan loopen, som det är nu nollställer du slumpgeneratorn varje iteration i loopen.

Eftersom det bara är 10 element i arrayen så föreslår jag att du delar upp programmet i två moment, "inmatning och lagring" samt "generera nytt slumptal och jämför", där båda kan använda antingen en foreach eller en for-loop.

Annars finns det egentligen ingen poäng med att lagra alla tio talen i en array, när du lika gärna kan göra en direkt jämförelse efter varje inmatning (som du gör nu). Men sen å andra sidan är inte alltid skoluppgifter så genomtänkta

Gör man en jämförelse efter varje inmatning så blir det ju ingen spänning iomed att man vet att man vunnit om exempelvis det femte inmatade talet matchar.

Skillnaden är att spela på tio hästar innan ett lopp mot att, som du föreslår, gissa efter loppet vilken häst som vann men ändå fortsätta gissa efter man eventuellt fått rätt.

Rubriken på tråden är lite missvisade då den säger att bollar (i plural) ska slumpas i en vektor, i själva verket ser uppgiften ut att gå ut på att lagra gissningar i en vektor och sen enbart slumpa ett enda tal som man söker i vektorn efter.

Permalänk
Entusiast
Skrivet av noyce:

Ta även en titt på hur många varv din loop kör, just nu ser du ut att köra 1 varv för mycket.

Yes. Ett klassiskt OBOE.

@Bananeripyamas, en for-loop ser generellt ut så här:

for (doFirst; requirement; doBetween) { doSomething; }

På svenska kan vi skriva samma kod så här:

  1. doFirst.

  2. Om och endast om requirement är sant:

    • a. doSomething.

    • b. doBetween.

    • c. Gå till steg 2.

  3. Klar.

Låt för exemplets skull doFirst och doBetween vara uttryck med sidoeffekter, alltså som "får något att hända", och låt requirement vara ett uttryck som evalueras till en boolean (true eller false). Exempel:

doFirst

int i = 0

"Skapa heltalet i och sätt det till 0"

doBetween

i = i + 1

"Addera 1 till i"

requirement

i < 3

"i är mindre än 3"

Nu kan vi sätta in våra svenska beskrivningar av de färgade uttrycken i beskrivningen av hur en for-loop fungerar:

  1. Skapa heltalet i och sätt det till 0.

  2. Om och endast om i är mindre än 3 är sant:

    • a. doSomething.

    • b. Addera 1 till i.

    • c. Gå till steg 2.

  3. Klar.

Eller i själva koden:

for (int i = 0; i < 3; i = i + 1) { doSomething; }

(i = i + 1 kan och brukar skrivas i++.)

Det kanske kan hjälpa att observera en ekvivalent while-loop:

doFirst; while (requirement) { doSomething; doBetween; }

I båda fallen (for och while) gäller:

  • doSomething är det vi vill göra ett visst antal gånger.

  • doFirst görs först, innan vi börjar loopa.

  • requirement måste vara sant för att vi ska ta ett varv (till) i loopen, dvs för att vi ska göra doSomething (igen).

  • doBetween görs "mellan" varje varv i loopen.

Testa gärna skillnaden mellan i < 3 och i <= 3 och fundera över den.

Permalänk
Medlem

För ungefär en miljon år sedan så läste jag på Universitetet. I den absolut första programmeringskursen vi läste (Pascal) så fick man rita blockdiagram för att beskriva hur man ville att koden skulle fungera. När man väl är lite mer erfaren så behöver man inte det.
Jag tror det som killbom skriver i sitt första inlägg är bra. Du måste först bestämma HUR du vill att det skall fungera och sedan kodar du.

Permalänk
Medlem

@hunden: Nä precis, håller med, därför jag föreslog att man delar upp uppgiften i två moment, därmed får användaren mata in alla 10 tal innan jämförelsen påbörjas

Permalänk
Testpilot

@elBenko: Sant, läste nog ditt sista stycke lite separat från de två innan

Vill man vara ännu tydligare kan man väl säga att det är tre delar, själva genererandet och lagrandet av slumptalet är enligt mig en egen del, som dessutom valfritt kan utföras innan eller efter användaren matar in sina gissningar.

Permalänk
Medlem

Dela upp det I tre delar..

1. loop för att mata in talen.
2. Generera slumptal
3. loop för att jämföra inmatade talen mot slumptalet.

I första posten så generar du ju ett nytt slumptal och jämför det mot användarens siffra varje gång han skriver in ett värde.

Ps.
Jag antar att kursen är på nybörjarnivå men skulle jag få uppmaningen "Ange tio tal, talet ska vara mellan 0-25" skulle min första inmatning vara "Banan" bara för att test gränserna.

Permalänk
Medlem

Jag får fortfarande inte till det

Jag lyckas loopa igenom vektorn så att jag kan skriva in 10 tal, och sedan generera slump tal men jag vet inte hur jag ska jämföra de inmatade talen med slump talet. Jag har läst alla kommentarer och hållit på att ändra i texten i flera timmar men det verkar inte vilja funka hur jag än gör.
Jag har läst igenom era kommenterar men varje gång jag tänkt "ahaaa är det så man gör" så har det visat sig vara fel då också.

Min kod ser just nu ut så här:

static void Main(string[] args) { Console.WriteLine("Ange tio tal, talet ska vara mellan 0-25 "); int[] vektor = new int[10]; //lagrar 10 tal i vektor Console.WriteLine("Tal: "); //Mata in tal for (int i = 0; i < vektor.Length; i++) { string tal = Console.ReadLine(); //läser in tal int element = Convert.ToInt32(tal); //omvandlar till heltal vektor[i] = element; //(?) } Random randomerare = new Random(); //skapar randomerare int slump = randomerare.Next(20); // Slumpa mellan 0 - 20 Console.WriteLine("Det slumpade talet är: " + slump); }

Det är alltså nu efter att jag slumpat ett tal som jag inte vet hur jag ska gå till väga!

Tack för alla svar!

@hunden
@mikgus
@elBenko
@alling
@reteP
@anon81912
@noyce

Permalänk
Medlem

Som du säger ska du nu endast kolla om din vektor innehåller det slumpade talet. Detta kan göras på lite olika sätt, men ett enkelt är att göra ytterligare en loop (efter att du skapar din "randomerare" och genererar ett slumptal) som går igenom vektorn. Hur själva jämförelsen går till hade du redan klurat ut i ditt första inlägg.

Edit: sen får du också vara med på att talen kanske inte matchar, då du slumpar fram ditt jämförelsetal. Så kanske vill du även skriva ut något om ett tal inte matchar - bara för att vara extra tydlig?

Permalänk
Medlem

Nu funkar det!!!

@noyce: Tack så mycket! Nu funkar det!

Jag skulle dock även som du säger vilja skriva ut om ett tal inte matchar. Har försökt med det ett tag men inte fått det att fungera.

Såhär ser koden ut nu:

static void Main(string[] args) { Console.WriteLine("Ange tio tal, alla tal ska vara mellan 0-15 "); int[] vektor = new int[10]; //lagrar 10 tal i vektor Console.WriteLine("Tal: "); //Mata in tal for (int i = 0; i < vektor.Length; i++) { string tal = Console.ReadLine(); //läser in tal int element = Convert.ToInt32(tal); //omvandlar till heltal vektor[i] = element; //(?) } Random randomerare = new Random(); //skapar randomerare int slump = randomerare.Next(15); // Slumpa mellan 0 - 15 //Gå igenom vektor och skriv ut sträng om talet matchar for (int i = 0; i < vektor.Length; i++) { if (vektor[i] == slump) { Console.WriteLine("Talet matchade!" + "(" + slump + ") " + "Bingo!"); } } }

Permalänk
Hedersmedlem

@Bananeripyamas: Räkna efter hur många gånger du vinner. Om antalet gånger du vinner är 0 så skriver du ut att du inte vann.

Istället för att räkna kan du istället använda en bool som börjar som "false" och sedan sätter du den till true när du hittat en vinnare.

Permalänk
Medlem

@pv2b: Jag vet inte hur man gör det, jag vill bara skriva ut: "Du fick tyvärr inte Bingo!", om inget tal matchar. Kan du hjälpa mig med det?

Permalänk
Medlem

@bananeripyamas

Du får inte ge dig så lätt. @pv2b presenterade två olika sätt på hur du kan göra exakt det. Att skriva ut någonting verkar du ju redan kunna. Så hur kan du då lösa problemet med att veta om du hittat en vinnare? Kollen för om du hittat en vinnare har du ju faktiskt redan, där du nu endast skriver ut om du vunnit.

Vad händer efter om du kört igenom hela loopen och inte skrivit ut någonting, då bör du ju inte ha hittat något rätt. Så om du där går efter pv2b lösning och även sparar undan en variabel som säger om du vunnit eller inte, så kan du ju faktiskt även efter loopen veta hur det gick.

Testa lite, om det inte går så kan du ju alltid presentera det du gjort så kan vi guida dig efter det.

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av Bananeripyamas:

@noyce: Tack så mycket! Nu funkar det!

Jag skulle dock även som du säger vilja skriva ut om ett tal inte matchar. Har försökt med det ett tag men inte fått det att fungera.

Såhär ser koden ut nu:

static void Main(string[] args) { Console.WriteLine("Ange tio tal, alla tal ska vara mellan 0-15 "); int[] vektor = new int[10]; //lagrar 10 tal i vektor Console.WriteLine("Tal: "); //Mata in tal for (int i = 0; i < vektor.Length; i++) { string tal = Console.ReadLine(); //läser in tal int element = Convert.ToInt32(tal); //omvandlar till heltal vektor[i] = element; //(?) } Random randomerare = new Random(); //skapar randomerare int slump = randomerare.Next(15); // Slumpa mellan 0 - 15 //Gå igenom vektor och skriv ut sträng om talet matchar for (int i = 0; i < vektor.Length; i++) { if (vektor[i] == slump) { Console.WriteLine("Talet matchade!" + "(" + slump + ") " + "Bingo!"); } } }

Du har redan fått svaret i tråden, men innan din sista for-loop så kan du göra ett boolvärde (eller egentligen precis vad som helst, det är bara ett kontrollvärde). Inne i if-satsen (i nämnda for-loop) så ändrar du värdet på sagda bool-värde (eller vad det nu kan vara). Efter for-loopen så kan du lägga en if-sats som kontrollerar mot ditt nyinlagda värde.
Frågan du ställer är egentligen "hur vet jag om koden gått in i en if-sats", ett av de enklaste sätten att göra det är just att skapa ett värde innan if-satsen, ändra värdet i if-satsen och efter if-satsen kontrollerar du värdet.
Resten klurar du säkert ut själv.

Permalänk
Medlem
Skrivet av Bananeripyamas:

@pv2b: Jag vet inte hur man gör det, jag vill bara skriva ut: "Du fick tyvärr inte Bingo!", om inget tal matchar. Kan du hjälpa mig med det?

static void Main(string[] args) { Console.WriteLine("Ange tio tal, alla tal ska vara mellan 0-15 "); int[] vektor = new int[10]; //lagrar 10 tal i vektor Console.WriteLine("Tal: "); //Mata in tal for (int i = 0; i < vektor.Length; i++) { string tal = Console.ReadLine(); //läser in tal int element = Convert.ToInt32(tal); //omvandlar till heltal vektor[i] = element; //(?) } Random randomerare = new Random(); //skapar randomerare int slump = randomerare.Next(15); // Slumpa mellan 0 - 15 // 1. skapa boolvärde här, satt till falskt. //Gå igenom vektor och skriv ut sträng om talet matchar for (int i = 0; i < vektor.Length; i++) { if (vektor[i] == slump) { Console.WriteLine("Talet matchade!" + "(" + slump + ") " + "Bingo!"); // 2. sätt boolvärdet till sant här om vinnare hittas } } // 3. Skapa en if-sats här som skriver ut "förlorarmeddelande" om boolvärdet fortfarande är falskt }

Kolla kommentarerna med 1-2-3

Nu när du har ett i grunden fungerande program skulle du kunna förbättra felkontrollen vid inmatning, samt lotto/bingo brukar inte tillåta multipla nummer av samma värde per spelomgång

Permalänk
Medlem

@elBenko: @Bananeripyamas:

Kollar du lite på API:et, så ser du att det finns en "else-if" funktionallitet. Klurar du lite, kommer du nog på ett snyggt sätt att använda den på. (Så du slipper onödiga booleans, se inlägg ovan av @elBenko)

Permalänk
Medlem
Skrivet av Overwatch:

Kollar du lite på API:et, så ser du att det finns en "else-if" funktionallitet. Klurar du lite, kommer du nog på ett snyggt sätt att använda den på. (Så du slipper onödiga booleans, se inlägg ovan av @elBenko)

Om du tänker att man ska använda en else-sats i for-loopen så kommer ju meddelandet att skrivas ut för varje siffra som är fel, vilket nog inte är vad som önskas.

Permalänk
Medlem

@perost: Lusläser du min post, ser du nog att jag hänvisar till "ELSE-IF" och inte "ELSE".

Permalänk
Medlem

@Overwatch: Även med en else if så hade du behövt ett kontrollvärde för att begränsa antalet utskrifter.

Permalänk
Medlem

@elBenko: Nu hade jag ju tänkt mig att det var TS, som skulle jobba på lösningen. Men får väl klargöra att, ett "kontrollvärde" har vi, när vi befinner oss inuti for-loopen.
Ledningsfrågor: Vilket värde kan det vara? Och hur kan man använda det värdet? Vilken jämförelse ska man lägga till i "else-if" satsen för att utskriften endast ska ske en gång?

Permalänk
Medlem

@Overwatch: Varför så kryptisk?

Du kan begränsa det till en utskrift genom att kolla om du befinner dig på en specifik iteration, t.ex. sista iterationen, men din else-if har fortfarande ingen vetskap huruvida en matchning hittats i en tidigare iteration om inte detta lagras, den enda information din else-if har tillgång till är vad som sker per iterationsbasis.

Permalänk
Medlem

@elBenko: Återigen, allt vi behöver finns i for-loopen, inga extra variabler, externa eller interna behövs. Ger TS lite tid att försök att lösa det själv, om han vill dvs.

Permalänk
Medlem

Tror jag förstår vilken lösning Overwatch tänker på.
Jag kommer fortsätta följa tråden så får vi se om det visar sig om jag tänkt rätt.

Permalänk
Medlem

@Overwatch @Bananeripyamas @elBenko
Jag kan hålla med om att en sådan lösning är bättre (om vi tänker på samma), om man läser TS första inlägg verkar det ju faktiskt även som att det är något sådant som efterfrågas - "Jag ska loopa igenom vektorn tills användaren gissar rätt tal.".

Å andra sidan tycker jag att grunder som att första hur ens delar i programmet hänger ihop, i vilken ordning ens program körs, hur man sparar ned saker i variabler m.m bör man ha förståelse för först.

Permalänk
Medlem

@noyce: Jag får det inte att fungera.. Jag ger mig inte utan jag känner mig bara lite stressad över att jag har suttit fast på samma uppgift i tre dagar och att uppgiften ska lämnas in snart. Men ge mig, nä det tänker jag inte göra!

Jag har lekt runt lite i koden men jag lyckas inte lösa den.

Så här ser den ut nu:

static void Main(string[] args) { Console.WriteLine("Ange tio tal, alla tal ska vara mellan 0-15 "); int[] vektor = new int[10]; //lagrar 10 tal i vektor Console.WriteLine("Tal: "); //Mata in tal for (int i = 0; i < vektor.Length; i++) { string tal = Console.ReadLine(); //läser in tal int element = Convert.ToInt32(tal); //omvandlar till heltal vektor[i] = element; //(?) } Random randomerare = new Random(); //skapar randomerare int slump = randomerare.Next(15); // Slumpa mellan 0 - 15 //Gå igenom vektor och skriv ut sträng om talet matchar for (int i = 0; i < vektor.Length; i++) { if (vektor[i] == slump) { Console.WriteLine("Talet matchade!" + "(" + slump + ") " + "Bingo!"); } else if (vektor[i] != slump) { Console.WriteLine("Tyvärr, du fick inte Bingo!"); } } }

Problemet blir ju att koden skriver ut else if satsen varje gång ett tal inte matchar med det slumpade talet. Jag vet bara inte hur jag ska lösa det. Jag har även försökt med bool som ni sagt men jag får inte det att fungera heller.