Permalänk
Medlem

Lottobollarna C#

Hej.

jag går i en intensivkurs i programmering 1. Jag arbetar med en uppgift där man ska göra en lottomaskin lägger in länk till uppgiften.

Uppgift

Jag tror jag fått till allt rätt i A och C uppgiftdelen men är nu på A delen som säger
Betyg A)
För denna nivå ska man slumpa fram flera tal.
De talen som slumpas fram ska också lagras i en vektor.
Alla tal ska alltså testat mot alla.
Ni får inte använda några ”hjälpmetoder” utan detta ska lösas enbart med vanliga loopar.
Utöver detta gäller kraven för betyget C och överlag att det ställs högre krav på säker kodning,
användarinteraktion etc.

Mitt aktiva problem blir att få koden att testa alla tal mot alla tal. Här är den kod jag har nu:

using System; namespace Del_3 { class Vektorn { static void Main(string[] args) { //================================// // Vektorer // //================================// int[] Tal = new int[10];//skapar en vektor med Size som är användarens int för mängden tal. Console.WriteLine("============================Välkommen till BINGO!!============================"); Console.WriteLine("Du har 10 nummerplatser, vad för nummer ska det vara i varje plats?"); for (int i = 0; i < Tal.Length; i++)//startar en For loop för att lägga in tal i vektorn. { //läser in värdena och gör dom till heltalen Console.WriteLine("Vad ska vara i plats " + i + ": "); string storlek = Console.ReadLine(); int element = Convert.ToInt32(storlek); {//Gör en loop ifall användaren ger siffra utanför 1 eller 25 så den blir meddelad att det inte är okej. if (element < 1 || element > 25) { Console.WriteLine("Var snäll och bara ange tal mellan 1 och 25."); i--; } else {//lägger in det accepterade talet i vektorn Tal[i] = element; } } }//Vektor för slumptalen som hamnar mellan 1 och 25 int[] LoTal = new int[10]; for (int i = 0; i < LoTal.Length; i++) { Random lotto = new Random(); int j = lotto.Next(1, 26); LoTal[i] = j; } for (int list = 0; list < 10; list++)//gör en for loop så jag kan få fram en lista. { Console.WriteLine("Indexposition {0} har värdet {1}", list, Tal[list]);//lista för användarens tal. Console.WriteLine("Bingoposition {0} har värdet {1}", list, LoTal[list]);//lista för random talen. if (Tal[list] == LoTal[list])//avgör att om nummer stämmer blir det bingo. { Console.WriteLine("Bingo!"); } else { Console.WriteLine("Tyvärr! det blev inge bingo."); } Console.WriteLine(" "); } } } }

Så min fråga hur skulle jag kunna skriva vidare för att få den att läsa varje tal mot varje tal? Funderar om jag måste göra en annan sorts For loop eller en Foreach loop men jag vill ju ha kvar listan mot slutet.

mvh
Rickard

Permalänk
Moderator

Du behöver två nestade for loopar. Tänk typ att du börjar med att titta på första talet i den ena listan och jämför det mot vart och ett av talen i den andra listan, sedan tittar du på andra talet i första listan och jämför osv.

Permalänk
Medlem

Kolla också över hur man använder slumptalsgeneratorn. Så som koden är skriven här är inte rätt sätt att göra det på.

Läs t.ex. här:
https://csharpindepth.com/articles/Random

Permalänk
Medlem

Nesta

Skrivet av giplet:

Du behöver två nestade for loopar. Tänk typ att du börjar med att titta på första talet i den ena listan och jämför det mot vart och ett av talen i den andra listan, sedan tittar du på andra talet i första listan och jämför osv.

Okej, men hur går jag till väga för det? Jag menar nu när jag gjort den som listor så vet jag inte hur jag kan singulära varje del för varje lista. Jag tänkte om man skrev Tal[1] eller Tal{1} men det verkar inte fungera. Jag är helt ny till programmering och helt ny till forlooparna med nu så är inte helt med på allt in i minsta detalj.

Antar att jag måste ta bort listorna som jag har nu och köra om men på nått sätt.. fick fram listorna genom att skolan hänvisade mig till Oscar Antbrings videos och där gjorde han listorna så jag slängde ihop dom där ifrån utan att riktigt förstå helt vad som gör att {0} och {1} fungerar som de gör.

Oscars video

Permalänk
Medlem

Random generator

Skrivet av MickeBoy:

Kolla också över hur man använder slumptalsgeneratorn. Så som koden är skriven här är inte rätt sätt att göra det på.

Läs t.ex. här:
https://csharpindepth.com/articles/Random

Så det de menar är att den blir lite små taskig då den kan ge ut flera av samma ganska lätt, har jag förstått rätt då?

Generellt fungerar den men inte optimal?

Permalänk
Moderator
Skrivet av Atrajs:

Okej, men hur går jag till väga för det? Jag menar nu när jag gjort den som listor så vet jag inte hur jag kan singulära varje del för varje lista. Jag tänkte om man skrev Tal[1] eller Tal{1} men det verkar inte fungera. Jag är helt ny till programmering och helt ny till forlooparna med nu så är inte helt med på allt in i minsta detalj.

Tal[1] är ju rätt. Du får nog skriva lite mer kod och visa hur du gör.

Din loop har just nu problemet att den bara jämför samma position i båda listorna. Du behöver två nestade loopar.

Permalänk
Medlem
Skrivet av Atrajs:

Så det de menar är att den blir lite små taskig då den kan ge ut flera av samma ganska lätt, har jag förstått rätt då?

Generellt fungerar den men inte optimal?

Om du kör ditt program, vilka 10 tal är det som slumpas fram?

Du kan göra det mycket bättre bara genom att flytta en enda kodrad.

Efter din ändring, blir det en skillnad i vilka tal som slumpas fram?

Permalänk
Medlem
Skrivet av Atrajs:

Okej, men hur går jag till väga för det? Jag menar nu när jag gjort den som listor så vet jag inte hur jag kan singulära varje del för varje lista. Jag tänkte om man skrev Tal[1] eller Tal{1} men det verkar inte fungera. Jag är helt ny till programmering och helt ny till forlooparna med nu så är inte helt med på allt in i minsta detalj.

Antar att jag måste ta bort listorna som jag har nu och köra om men på nått sätt.. fick fram listorna genom att skolan hänvisade mig till Oscar Antbrings videos och där gjorde han listorna så jag slängde ihop dom där ifrån utan att riktigt förstå helt vad som gör att {0} och {1} fungerar som de gör.

Oscars video

Läs på denna sidan. Exemplet med olika domäner är ett bra exempel

https://kodify.net/csharp/loop/nested-loop/

Permalänk
Medlem
Skrivet av giplet:

Tal[1] är ju rätt. Du får nog skriva lite mer kod och visa hur du gör.

Din loop har just nu problemet att den bara jämför samma position i båda listorna. Du behöver två nestade loopar.

Okej så jag har förstått vad du menar med en nestad loop, alltså en loop i en loop. Men jag står ändå helt still XD

Det jag funderar först var om en foreach loop vore rätt val då den ska kika i vektorn men då blir mitt nya problem att jag inte vet hur jag ska formulera koden. Annars om jag skulle göra en for loop i så måste jag ju göra så att den kopplar in i listan på någe vänster men det står helt still, skulle du kunna förklara på lite mer tydligare sätt hur man kan gå till väga?

Permalänk
Moderator
Skrivet av Atrajs:

Okej så jag har förstått vad du menar med en nestad loop, alltså en loop i en loop. Men jag står ändå helt still XD

Det jag funderar först var om en foreach loop vore rätt val då den ska kika i vektorn men då blir mitt nya problem att jag inte vet hur jag ska formulera koden. Annars om jag skulle göra en for loop i så måste jag ju göra så att den kopplar in i listan på någe vänster men det står helt still, skulle du kunna förklara på lite mer tydligare sätt hur man kan gå till väga?

Har du själv skrivit koden som du postat här? Du har ju en loop som skriver i listan redan. Att läsa görs på samma sätt.

Permalänk
Medlem
Skrivet av giplet:

Har du själv skrivit koden som du postat här? Du har ju en loop som skriver i listan redan. Att läsa görs på samma sätt.

Ja jag har skrivit koden själv, jag har utgått från de jag fått ur boken(Programmering 1 med C# V2018) och det jag fått från oscars videos. Listans loop tog jag från just oscars video som jag länkade, för att se hur det slutade för mig i det. jag måste ju utgå från någonstans för att förstå upplägget. Började för 2 vecka sedan och aldrig petat på kod innan så har inte precis förstått alla saker i helhet. Men hållit på och skriva kod sen 8 i morse med så är lite mör på det så jag kommer inte så långt just nu. jag har ju dragit mig hela vägen till C men tänkte det kunde vara kul att veta hur jag får den att läsa in mot varandra så som uppgiften säger. Det är kul med kod men det är väldigt mycket att lära sig speciellt i ord ni som kan kod är lite mer av språkvetare i slutändan.

nestad loop har vi inte ens pratat om, lite det som gör det svårt ibland med att förstå då det finns så mycket ord för saker. Men jag sökte upp på det och läste lite grann men jag har ingen aning hur jag ska skriva for loopen för att den ska läsa mot varje eller om jag måste göra en ändring i if delen.

Men ja jag får kika på det senare eller i morgon.

Tack för idag iallafall

Permalänk
Moderator

Du har fått en länk med exempel på nestade loopar. Skillnaden mot vad du vill göra är att i ska hålla reda på positionen i den ena listan och j ska hålla reda på positionen i den andra listan.

Permalänk
Medlem
Skrivet av MickeBoy:

Om du kör ditt program, vilka 10 tal är det som slumpas fram?

Du kan göra det mycket bättre bara genom att flytta en enda kodrad.

Efter din ändring, blir det en skillnad i vilka tal som slumpas fram?

Skrivet av giplet:

Du har fått en länk med exempel på nestade loopar. Skillnaden mot vad du vill göra är att i ska hålla reda på positionen i den ena listan och j ska hålla reda på positionen i den andra listan.

MickeBoy: Jag försöker förstå det men just nu har jag lite tidspress och är lagom korkad, men jag ska kika längre in på det där senare, har ju fått denna randomgeneratorn av våran lärare så jag känner att det är lika bra att gå vidare på den just nu. Kan inte gröta mig för mycket. Men tack för all hjälp och länkarna jag fått.

giplet: Jag fick till det! Jag är lagom seg i detta men skickar koden jag fått till så kan ni båda få göra er bedömning men nu fungerar det iallafall. Ville pilla mer men det får jag göra i framtiden ska börja med att planera för storprojekt om nån buss nu så det är full fart. Jag får iallafall tacka så hemskt mycket för din hjälp och antagligen kommer jag återkomma här på sweclockers med nya frågor snart

using System; namespace Del_3 { class Vektorn { static void Main(string[] args) { //================================// // Vektorer // //================================// int[] Tal = new int[10];//skapar en vektor med Size som är användarens int för mängden tal. Console.WriteLine("============================Välkommen till BINGO!!============================"); Console.WriteLine("Du har 10 nummerplatser, vad för nummer ska det vara i varje plats?"); for (int i = 0; i < Tal.Length; i++)//startar en For loop för att lägga in tal i vektorn. { //läser in värdena och gör dom till heltalen Console.WriteLine("Vad ska vara i plats " + i + ": "); string storlek = Console.ReadLine(); int element = Convert.ToInt32(storlek); {//Gör en loop ifall användaren ger siffra utanför 1 eller 25 så den blir meddelad att det inte är okej. if (element < 1 || element > 25) { Console.WriteLine("Var snäll och bara ange tal mellan 1 och 25."); i--; } else {//lägger in det accepterade talet i vektorn Tal[i] = element; } } }//Vektor för slumptalen som hamnar mellan 1 och 25 int[] LoTal = new int[10]; for (int i = 0; i < LoTal.Length; i++) { Random lotto = new Random(); int j = lotto.Next(1, 26); LoTal[i] = j; } for (int list = 0; list < 10; list++)//gör en for loop så jag kan få fram en lista. { Console.WriteLine("Lottorad {0} har värdet {1}", list, Tal[list]);//lista för användarens tal. Console.WriteLine("Bingorad {0} har värdet {1}", list, LoTal[list]);//lista för random talen. for (int Bingo = 0; Bingo < 10; Bingo++) if (Tal[list] == LoTal[Bingo])//avgör att om nummer stämmer blir det bingo. { Console.WriteLine("Du fick Bingo! På Bingorad {0}", Bingo, Tal[Bingo]); } { Console.WriteLine(" "); } } Console.WriteLine("Tack för denna gång"); Console.WriteLine("============================Game Over============================"); } } }

Permalänk
Medlem

Men uppgiften hette ju lottobollar, och du har utskrifter om Bingo? Även variabelnamn är benämnda med Bingo.

Permalänk
Medlem

@Atrajs: Grejen med slumpgeneratorn är egentligen ganska enkelt. En sån slumpgenerator genererar inte riktiga slumptal utan använder en algoritm för att generera tal som ser slumpmässiga ut (pseudorandom number generator). Man måste då använda någonting som startfrö (seed), och då används ofta det aktuella klockslaget eftersom det oftast är slumpmässigt vad klockan är när programmet körs. Startar man med samma frö så får man ut samma sekvens av slumptal.

Om du då skapar en ny slumpgenerator inne i en loop så kommer klockan troligtvis inte hinna "ticka" mellan varje iteration, vilket gör att du får ut samma "slumptal" om och om igen. Lösningen är då att skapa slumpgeneratorn utanför loopen så att samma slumpgenerator används hela tiden.

Permalänk
Medlem
Skrivet av MickeBoy:

Men uppgiften hette ju lottobollar, och du har utskrifter om Bingo? Även variabelnamn är benämnda med Bingo.

Skrivet av perost:

@Atrajs: Grejen med slumpgeneratorn är egentligen ganska enkelt. En sån slumpgenerator genererar inte riktiga slumptal utan använder en algoritm för att generera tal som ser slumpmässiga ut (pseudorandom number generator). Man måste då använda någonting som startfrö (seed), och då används ofta det aktuella klockslaget eftersom det oftast är slumpmässigt vad klockan är när programmet körs. Startar man med samma frö så får man ut samma sekvens av slumptal.

Om du då skapar en ny slumpgenerator inne i en loop så kommer klockan troligtvis inte hinna "ticka" mellan varje iteration, vilket gör att du får ut samma "slumptal" om och om igen. Lösningen är då att skapa slumpgeneratorn utanför loopen så att samma slumpgenerator används hela tiden.

MickeBoy: Allright jo det kan jag hålla med om XD började snöra in mig i annat så börja tänka bingobollar istället tror jag, men blir du mer nöjd om jag ändrar "Bingorad" till "Vinstrad" och "Bingo" variabeln till "Rätt" istället? Tack för korrektionerna.

perost: OOH! okej ja då förstår jag bättre så om jag flyttar bara själva Random lotto = new Random utanför loopen så kommer allt bli bättre angående slumpgenerator? Tack så hemskt mycket

Permalänk
Medlem
Skrivet av Atrajs:

perost: OOH! okej ja då förstår jag bättre så om jag flyttar bara själva Random lotto = new Random utanför loopen så kommer allt bli bättre angående slumpgenerator? Tack så hemskt mycket

Precis

Permalänk
Moderator

Jag hade ändrat koden så att utskriften av raderna var skild från kontrollen av antal rätt. Som du gör nu blir det grötigt både i koden och i utskriften. Du behöver inte vara rädd för att ha flera for-loopar.

Permalänk
Medlem
Skrivet av Atrajs:

MickeBoy: Allright jo det kan jag hålla med om XD började snöra in mig i annat så börja tänka bingobollar istället tror jag, men blir du mer nöjd om jag ändrar "Bingorad" till "Vinstrad" och "Bingo" variabeln till "Rätt" istället? Tack för korrektionerna.

Om jag hade rättat din uppgift så hade det varit lättare att inse att du vet vad du gör om variablerna i alla fall har rätt namn. Att de är på svenska och börjar med en stor bokstav kanske är sådant som får vara kvar i den första uppgiften.

Så min uppmaning blir att försöka använda variabelnamn som återspeglar uppgiften (och kanske även verkligheten).

Kanske är det gissadLottorad som användaren matar in och kanske är det slumpadVinstrad som innehåller den rätta raden. Du måste såklart inte ändra, men det ser ju snyggare ut.

Detsamma gäller också utskrifterna. Jag föreslår t.ex.

Console.WriteLine("Boll nummer {0} har värdet {1} i den rätta lottoraden.", list, LoTal[list]);//lista för random talen.