2022-03-28, 19:55
  #1
Medlem
Hej p er,

Jag lser Prog 1 och jag har ftt i uppgift att skriva ett program som heter Lottobollar.
Man skall allts skapa en vektor som hller 10 st vrden, sedan skall programmet slumpa fram ett vrde mellan 1 och 21. Vrdena i vektorn skall sedan jmfras med det slumpade talet och har man gissat rtt s fr man bingo. Det mesta har gtt bra frutom en grej. Nr programmet jmfr talen s skriver den ut "Tyvrr, du fick inte bingo" fr varje tal som inte stmmer verens med det slumpade talet.
Om det tionde talet stmmer verens med det slumpade talet s skriver allts programmet ut "Tyvrr, du fick inte bingo" nio gnger fr ett sedan skriva ut "BINGO".

Jag har kollat hr p Flashback och jag hittade en gammal trd som handlade om samma uppgift och dr var det en person som hade skrivit else if (i == lottoRad.Length -1) lngst ner i andra kodblocket. Nr jag stter in detta i min kod s funkar den som den ska. Kan ngon frklara vad den strngen gr och varfr min kod matar ut svaret fr varje tal som jmfrs. Tack p frhand! Se kod nedan.

Kod:
Console.WriteLine("Vlkommen till Lotto");
Console.WriteLine("Skriv in 10 stycken tal mellan 1 och 21");

int[] lottoRad = new int[10];//Skapa vektorn.



for (int i = 0; i < lottoRad.Length; i++)// Itererar varje gng ett lottonummer skrivs in.
{
    string inPut = Console.ReadLine();
    int siffror = Convert.ToInt32(inPut);// Konverterar frn STR till INT.
    lottoRad[i] = siffror;



    if (siffror < 1 || siffror > 21)// r lottonumret lgre eller hgre n tilltet?
    {
        Console.WriteLine("Skriv in ett nummer mellan 1 och 21.");
        i--;//G tillbaka ett steg i vektorn.

    }

    else
    {
        continue;
    }


}


     Random random = new Random();
     int lottoBoll = random.Next(1, 22);//Slumpar fram ett tal mellan 1 och 21.


for (int i = 0; i < lottoRad.Length; i++)

{


    if (lottoRad[i] == lottoBoll)// BINGO
    {
        Console.WriteLine("*****BINGO*****BINGO*****BINGO***** ");
        Console.WriteLine("Rtt lottonummer var: " + lottoBoll);
        Console.ReadLine();
        break;
    }

    else
    {
        Console.WriteLine("Tyvrr, du fick inte bingo.");
        Console.WriteLine("Rtt lottonummer var:" + lottoBoll);
    }


}
Citera
2022-03-28, 20:16
  #2
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av francesco
Hej p er,

Jag lser Prog 1 och jag har ftt i uppgift att skriva ett program som heter Lottobollar.
Man skall allts skapa en vektor som hller 10 st vrden, sedan skall programmet slumpa fram ett vrde mellan 1 och 21. Vrdena i vektorn skall sedan jmfras med det slumpade talet och har man gissat rtt s fr man bingo. Det mesta har gtt bra frutom en grej. Nr programmet jmfr talen s skriver den ut "Tyvrr, du fick inte bingo" fr varje tal som inte stmmer verens med det slumpade talet.
Om det tionde talet stmmer verens med det slumpade talet s skriver allts programmet ut "Tyvrr, du fick inte bingo" nio gnger fr ett sedan skriva ut "BINGO".


Jag har kollat hr p Flashback och jag hittade en gammal trd som handlade om samma uppgift och dr var det en person som hade skrivit else if (i == lottoRad.Length -1) lngst ner i andra kodblocket. Nr jag stter in detta i min kod s funkar den som den ska. Kan ngon frklara vad den strngen gr och varfr min kod matar ut svaret fr varje tal som jmfrs. Tack p frhand! Se kod nedan.

Kod:
Console.WriteLine("Vlkommen till Lotto");
Console.WriteLine("Skriv in 10 stycken tal mellan 1 och 21");

int[] lottoRad = new int[10];//Skapa vektorn.



for (int i = 0; i < lottoRad.Length; i++)// Itererar varje gng ett lottonummer skrivs in.
{
    string inPut = Console.ReadLine();
    int siffror = Convert.ToInt32(inPut);// Konverterar frn STR till INT.
    lottoRad[i] = siffror;



    if (siffror < 1 || siffror > 21)// r lottonumret lgre eller hgre n tilltet?
    {
        Console.WriteLine("Skriv in ett nummer mellan 1 och 21.");
        i--;//G tillbaka ett steg i vektorn.

    }

    else
    {
        continue;
    }


}


     Random random = new Random();
     int lottoBoll = random.Next(1, 22);//Slumpar fram ett tal mellan 1 och 21.


for (int i = 0; i < lottoRad.Length; i++)

{


    if (lottoRad[i] == lottoBoll)// BINGO
    {
        Console.WriteLine("*****BINGO*****BINGO*****BINGO***** ");
        Console.WriteLine("Rtt lottonummer var: " + lottoBoll);
        Console.ReadLine();
        break;
    }

    else
    {
        Console.WriteLine("Tyvrr, du fick inte bingo.");
        Console.WriteLine("Rtt lottonummer var:" + lottoBoll);
    }


}
Well, du har ju svaret redan i din beskrivning. Utan att ens titta p din kod s r problemet att du genomfr kontrollen (och redovisning av rtt/fel) inne i loopen.

Tnk dig sjlv, du har i pseudo-kod skrivit s hr:
*Loopa fljande kod 10 gnger och behll rkningen genom i:
**Om i:s position i listan r rtt tal -> gratulera och avbryt loopen
**Annars -> skriv tyvrr och fortstt loopen

Det r klart att om man inte trffar rtt i frsta talet s blir det massa upprepningar.

Man brukar gra s hr:
Innan loopen brjar stter du en bool-flagga som typ heter hasFound till false.
Loopa sen igenom listan med talen och jmfr med inputtalen.
Om talet man jmfr med stmmer, ndra flaggan till true (och kr en break eftersom det r ondigt att g vidare med loopen), annars gr ingenting.
Efter loopen r frdig s kr du flaggan i en if-sats, d fr du enbart en (dvs 1) facit-redovisning.

Varfr hjlper det d med byta ut else-satsen mot else-if-satsen som du tar upp?
Jo, den triggas enbart om du r p sista i-talet och det var fel. Allts loopas den inte flera gnger.

Tips:
Du behver inte skriva continue fr att den frsta fot-loopen ska fortstta. Continue skriver man enbart fr att hoppa ver resterande kod i loop-slingan (du hade ingen sdan).
__________________
Senast redigerad av Enterprise 2022-03-28 kl. 20:29.
Citera
2022-03-28, 21:08
  #3
Medlem
Ok, tack fr hjlpen. Jag har ndrat det andra kodblocket till fljande:

Kod:
     
 Random random = new Random();
     int lottoBoll = random.Next(1, 22);//Slumpar fram ett tal mellan 1 och 21.
     bool Bingo = false;

for (int i = 0; i < lottoRad.Length; i++)

{
    if (lottoRad[i] == lottoBoll)
    {
        Bingo = true;
        break;
    }
}

    if (Bingo == true)// BINGO
    {
        Console.WriteLine("*****BINGO*****BINGO*****BINGO***** ");
        Console.WriteLine("Rtt lottonummer var: " + lottoBoll);
        Console.ReadLine();
    

        
    }
    
    else if (Bingo == false) //Inte BINGO
    {

        Console.WriteLine("Tyvrr, det blev ingen BINGO.");
        Console.WriteLine("Rtt lottonummer var: " + lottoBoll);
    }
Allt verkar funka som det ska s jag antar att jag har gjort rtt. Jag tog ven bort continue frn det frst kodblocket
Citera
2022-03-28, 22:19
  #4
Medlem
Ett par sknhetstips:

Det r inte kutym att anvnda stor bokstav fr variabler. Stor bokstav brukar anvndas fr metoder eller properties.

Jag r personligen allergisk mot att anvnda break i for-loopar, tycker det blir spaghetti om en for-loop pltsligt kan breakas ut. Hade fredragit en while i ditt fall, men antar att det r OK att gra som du gjort. Enda gngen jag anvnder break r med switch/case.

Av samma anledning avskyr jag goto-satser.

Med bool's behver du inte jmfra med true/false. "if (bingo == true)" och "if (bingo)" r samma sak.

Hade allts gjort ungefr:

Kod:
int i = 0;
bool found = false;

while (!found && i < lottoRad.length)
{
  if (lottoRad[i] == lottoBoll)
  {
    found = true;
    Console.WriteLine($"Bingo med nummer {lottoBoll}");
    Console.ReadLine();
  }
  ++i;
}

if (!found)
{
  Console.WriteLine($"Ingen bingo :( Rtt nummer var {lottoBoll}");
  Console.ReadLine();
}

Disclaimer: har inte testat koden
__________________
Senast redigerad av Skalman71 2022-03-28 kl. 22:34.
Citera
2022-03-28, 22:54
  #5
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av francesco
Ok, tack fr hjlpen. Jag har ndrat det andra kodblocket till fljande:

Kod:
     
 Random random = new Random();
     int lottoBoll = random.Next(1, 22);//Slumpar fram ett tal mellan 1 och 21.
     bool Bingo = false;

for (int i = 0; i < lottoRad.Length; i++)

{
    if (lottoRad[i] == lottoBoll)
    {
        Bingo = true;
        break;
    }
}

    if (Bingo == true)// BINGO
    {
        Console.WriteLine("*****BINGO*****BINGO*****BINGO***** ");
        Console.WriteLine("Rtt lottonummer var: " + lottoBoll);
        Console.ReadLine();
    

        
    }
    
    else if (Bingo == false) //Inte BINGO
    {

        Console.WriteLine("Tyvrr, det blev ingen BINGO.");
        Console.WriteLine("Rtt lottonummer var: " + lottoBoll);
    }
Allt verkar funka som det ska s jag antar att jag har gjort rtt. Jag tog ven bort continue frn det frst kodblocket
Bra, du br dock lsa p lite om skillnaden p else... och else if...

Slutet p koden hade kunnat se ut som:
Kod:
    if (Bingo)// BINGO r sann
    {
        Console.WriteLine("*****BINGO*****BINGO*****BINGO***** ");
        Console.WriteLine("Rtt lottonummer var: " + lottoBoll);
        Console.ReadLine();
    

        
    }
    
    else  // BINGO r inte sann
    {

        Console.WriteLine("Tyvrr, det blev ingen BINGO.");
        Console.WriteLine("Rtt lottonummer var: " + lottoBoll);
    }
Eftersom Bingo (br vara liten bokstav som ppekas ovan) r en boolean s har den bara tv lgen: true eller false. Det rcker drmed med if (bool) { utfr om sant } else {utfr om falskt}.
Att skriva else if (villkor == false) r helt ondigt och anses osnyggt, ven om det inte r fel.
__________________
Senast redigerad av Enterprise 2022-03-28 kl. 22:57.
Citera
2022-03-29, 20:56
  #6
Medlem
Citat:
Ursprungligen postat av Skalman71
Ett par sknhetstips:

Det r inte kutym att anvnda stor bokstav fr variabler. Stor bokstav brukar anvndas fr metoder eller properties.

Jag r personligen allergisk mot att anvnda break i for-loopar, tycker det blir spaghetti om en for-loop pltsligt kan breakas ut. Hade fredragit en while i ditt fall, men antar att det r OK att gra som du gjort. Enda gngen jag anvnder break r med switch/case.

Av samma anledning avskyr jag goto-satser.

Med bool's behver du inte jmfra med true/false. "if (bingo == true)" och "if (bingo)" r samma sak.

Hade allts gjort ungefr:

Kod:
int i = 0;
bool found = false;

while (!found && i < lottoRad.length)
{
  if (lottoRad[i] == lottoBoll)
  {
    found = true;
    Console.WriteLine($"Bingo med nummer {lottoBoll}");
    Console.ReadLine();
  }
  ++i;
}

if (!found)
{
  Console.WriteLine($"Ingen bingo :( Rtt nummer var {lottoBoll}");
  Console.ReadLine();
}

Disclaimer: har inte testat koden

Citat:
Ursprungligen postat av Enterprise
Bra, du br dock lsa p lite om skillnaden p else... och else if...

Slutet p koden hade kunnat se ut som:
Kod:
    if (Bingo)// BINGO r sann
    {
        Console.WriteLine("*****BINGO*****BINGO*****BINGO***** ");
        Console.WriteLine("Rtt lottonummer var: " + lottoBoll);
        Console.ReadLine();
    

        
    }
    
    else  // BINGO r inte sann
    {

        Console.WriteLine("Tyvrr, det blev ingen BINGO.");
        Console.WriteLine("Rtt lottonummer var: " + lottoBoll);
    }
Eftersom Bingo (br vara liten bokstav som ppekas ovan) r en boolean s har den bara tv lgen: true eller false. Det rcker drmed med if (bool) { utfr om sant } else {utfr om falskt}.
Att skriva else if (villkor == false) r helt ondigt och anses osnyggt, ven om det inte r fel.

Tack s mycket till er bda fr eran konstruktiva feedback! Uppgiften r nu inlmnad och i vntan p svar ifrn lraren s ska jag definitivt lsa p mer om else samt else if. Anledningen till att jag inte anvnde mig av en while-loop var fr att det stod i uppgiftsbeskrivningen att man ska anvnda en for-oop. Ska nog lsa p lite mer om det ocks. Vad som ser snyggt ut eller inte har jag ingen strre koll p just nu men det kommer vl lite senare. Knns som att jag r alldeles fr grn fr att kunna se skillnaden just nu.
Citera
2022-04-01, 17:20
  #7
Moderator
Protons avatar
Citat:
Ursprungligen postat av francesco
Tack s mycket till er bda fr eran konstruktiva feedback! Uppgiften r nu inlmnad och i vntan p svar ifrn lraren s ska jag definitivt lsa p mer om else samt else if. Anledningen till att jag inte anvnde mig av en while-loop var fr att det stod i uppgiftsbeskrivningen att man ska anvnda en for-oop. Ska nog lsa p lite mer om det ocks. Vad som ser snyggt ut eller inte har jag ingen strre koll p just nu men det kommer vl lite senare. Knns som att jag r alldeles fr grn fr att kunna se skillnaden just nu.
Skam den som ger sig.

Om du framver nr du stter p dina problem formulerar dem som en algoritm innan du brjar koda tror jag det kommer underltta fr dig. Tnk efter vad du vill gra och i vilken ordning du behver gra saker s kommer du troligen f lite bttre struktur p dina loopar och villkor.

om man ska spinna vidare p teorin om att undvika att anvnda break i en forloop kan man ju kolla p anatomin av densamma.

Initieringslistan i en forloop bestr ju av tre saker.
1. Startvrde
2. Termineringsvillkor
3. Stegvillkor.

Vill man sledes avsluta en forloop prematurt hade man ju kunnat fylla p termineringsvillkoret med ytterligare villkor:

Kod:
for(int i = 0; i < lottoRad.length && !found; i++){
//mer kod
}
P det hr sttet undviker man att ha en break i loopen som skulle kunna komma som en verraskning om man har lite lngre kod i sin loopkropp.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in