12 svar
82 visningar
CJoy är nöjd med hjälpen
CJoy 24
Postad: 14 jul 2023 16:12

Försöker få med en till 'if' men vet inte vart

Jag för söker lägga in en if (vektor[i] < 1 || vektor[i] > 25)?   Så att inga tal får vara över eller under dessa. Men jag får inte till det! Var någonstans i koden och hur ska den in?

        static void Main(string[] args)
        {
            int antalInmatningar = 10;    //Vi ska göra 10 inmatningar.
            int minstaInmatning = 1;      //Talet får inte vara under 1.
            int högstaInmatning = 25;     //Maxtalet är 25.

            int[] vektor = new int[antalInmatningar];    //Skapa ny vektoe med 10 positioner.
            int inx = 0;                                 //Använd detta objekt för att hålla koll på hur många inputs som gjorts.

            Console.WriteLine("Vällkommen! Skriv ett nummer mellan " + minstaInmatning + " - " + högstaInmatning);    //Välkommna och förklara vad användaren ska göra. Tal mellan 1- 25.

            for (int i = 0; i < vektor.Length; i++)    //For loop, så länge inte alla positioner har ett värde fortsätter loopen och adderar 1 när ett värde adderas.
            {
                inx++;                                 //För varje loopning med korrekt input adderas 1 till antalet inputs.
                int element;                       //Deklarerar en variabel som ska hålla värdet av 'out' i TryParse metoden nedan.

                if (int.TryParse(Console.ReadLine(), out element))                 //Konvertera input till int datatyp.
                {
                    vektor[i] = element;                                           //index får namnet 'element', har värdet av den konverterade inmatningen.
                    Console.WriteLine("Du har valt {0} av 10 tal.", inx);          //Håller användaren uppdaterad om hur många tal hen har matat in.
                }
                else
                {            //Om inmatningen inte går igenom skrivs meddelandet.
                    Console.WriteLine("Du måste mata in ett tal mellan 1-25");
                    inx--;   //Vi vill inte spara ett felaktigt värde i en position så vi backar en loopning.
                }
            }

                Random r = new Random();                                                //Vi slumpar ett tal.
                int slump = r.Next(minstaInmatning, högstaInmatning + 1);               //Talet är mellan 1-25.   +1 (26) för att det sista argumentet inte räknas.
                bool Bingo = false;                                                     //Vi sätter matchning till falskt och loopen fortsätter tills 10 tal är inmatade.
                for (int i = 0; i < vektor.Length; i++)                                 //For loop med samma värde som innan.
                {
                    if (vektor[i] == slump)                                             //Om ett tal matchar slumptalet är matchninhen true.
                    {
                        Bingo = true;
                    }
                }

                if (Bingo == true)                                                      //Om matchning är true, om vi får bingo, får användaren veta det.
                {
                    Console.WriteLine("Tal " + slump + " matchade! Du fick Bingo!");
                }
                else                                                                    //Annars får användaren veta att inget tal matchade slumptalet.
                {
                    Console.WriteLine("Tyvärr! Det blev ingen bingo!");
                }

                Console.WriteLine("Slut!");      //Vi meddelar att spelet är slut.
            Console.ReadKey();               //Håller konsolen öppen.
        }
    }
}
Fermatrix 7841 – Fd. Medlem
Postad: 14 jul 2023 16:53

Innan du lägger till något i din 'vektor,', så vill du först kontrollera vad inputen är. 

Kommer du vidare?

CJoy 24
Postad: 14 jul 2023 18:09

Menar du vilken datatyper inputen är eller menar du något med konverteringen?

Jag är helt grön i c#

Fermatrix 7841 – Fd. Medlem
Postad: 14 jul 2023 18:22 Redigerad: 14 jul 2023 18:23

I denna for-loopen:

            for (int i = 0; i < vektor.Length; i++)    //For loop, så länge inte alla positioner har ett värde fortsätter loopen och adderar 1 när ett värde adderas.
            {
                inx++;                                 //För varje loopning med korrekt input adderas 1 till antalet inputs.
                int element;                       //Deklarerar en variabel som ska hålla värdet av 'out' i TryParse metoden nedan.

                if (int.TryParse(Console.ReadLine(), out element))                 //Konvertera input till int datatyp.
                {
                    vektor[i] = element;                                           //index får namnet 'element', har värdet av den konverterade inmatningen.
                    Console.WriteLine("Du har valt {0} av 10 tal.", inx);          //Håller användaren uppdaterad om hur många tal hen har matat in.
                }
                else
                {            //Om inmatningen inte går igenom skrivs meddelandet.
                    Console.WriteLine("Du måste mata in ett tal mellan 1-25");
                    inx--;   //Vi vill inte spara ett felaktigt värde i en position så vi backar en loopning.
                }
            }

Du behöver inte inx, du kan använda variabeln i. Men sedan så använder du inte inx alls. 

Om jag förstår dig rätt, koden ovan ska se till att om användaren anger ett tal som inte är ett heltal, så får de ange talet igen, varav du minskar inx, (du ska minska i, inte inx), och du vill också begränsa inmatningen till tal mellan 1-25. Det är samma logik som om användaren försöker ange något annant än ett heltal, du accepterar inte det, och minskar i återigen. 

Denna koden du skrev i ditt andra program (finns i din andra tråd) gör ju det du försöker åstadkomma:

            for (i = 0; i < listaHeltal.Length; i++)    //Vi gör en for loop där; så länge 'i' är mindre än antalet positioner angivet i vektorn (10) så ska ett nytt värde adderas (matas in), vi börjar med '0' för vi har ingenting inmatat i index ännu.
            {
                Console.WriteLine("Du har angivit {0} utav 10 tal. Ange nästa tal tack: ", i);    //Vi berättar för användaren hur många fler tal her har kvar ett mata in.

                try  //En try/catch metod för att meddela användaren att fel input angivits.
                {
                    listaHeltal[i] = int.Parse(Console.ReadLine());    //Vi ger nu positionerna (index) i vektorn vi skapat dess värden, dessa värden sker via indata (inmatning) från användaren.'
                    if (listaHeltal[i] > högstaTal)  //Om input är större än 20 måste användaren göra om.
                    {
                        Console.WriteLine("Maxtalet är 20 !!");
                        Console.WriteLine("Du får göra om och skriva ett lägre nummer.");
                        i--;    //Vi vill inte spara ett felaktigt input i en position.
                    }
                }
                catch
                {
                    Console.WriteLine("Ändast nummer i heltal är tillåtet, försök igen:");
                    i--;    //Eftersom vi inte vill spara ett felaktigt värde i en position backar vi räknaren och gör om inmatningen.
                }
                
            }


Nu behöver du bara ändra smådetaljer så har du ju det du ville ha.

CJoy 24
Postad: 14 jul 2023 23:03

Har nu gjort om en hel massa och nu fungerar det så att alla inputs listas upp och bingo meddelas efter. En tanke är att meddela om det blir bingo efter varje input hur skulle jag ändra koden då?

static void Main(string[] args)   //Start
        {
            int antalInmatningar = 10;    //Vi ska göra 10 inmatningar.
            int minstaInmatning = 1;      //Talet får inte vara under 1.
            int högstaInmatning = 25;     //Maxtalet är 25.

            Console.WriteLine("Välkommen till Lotto, låt oss spela! Välj {0}st nummer mellan   {1} - {2}", antalInmatningar, minstaInmatning, högstaInmatning);    //Välkommnar och förklara vad användaren ska göra. Ge 10 tal mellan 1- 25.

            Random randomerare = new Random();                                          //Här är en randomerare som ska slumpa tal.
            int slumpTal = randomerare.Next(minstaInmatning, högstaInmatning + 1);      //Slumpar ett tal mellan 1-25.

            int[] lottoBoll = new int[antalInmatningar];                                //Skapar en vektor med 10 positioner.

            for (int i = 0; i < lottoBoll.Length; i++)                                  //For loop, så länge inte alla positioner INTE ännu har ett värde fortsätter loopen och adderar 1 när ett värde adderas.
            {
                Console.Write("Spela på nummer {0}: ", i + 1);                          //Håller användaren uppdaterad om hur många tal hen har matat in. +1 är för att i börjar på 0 men vi vill ha 1 först.

                try                                                                     //En try/catch metod för fel input.
                {
                    lottoBoll[i] = int.Parse(Console.ReadLine());                       // Matar in värdet och konverterar från string till int.
                }
                catch
                {
                    Console.WriteLine("Vänligen ange ett heltal, försök igen.");        //Om inmatningen inte går igenom skrivs meddelandet.
                    i--;                                                                //Vid fel input backar loopen ett steg, vi vill inte spara ett felaktigt värde i en position.
                }
                if (lottoBoll[i] < minstaInmatning || lottoBoll[i] > högstaInmatning)   //Om det inmatade talet är under 1 eller över 25, meddelar vi om att användaren behöver ge ett nytt värde.
                {
                    Console.WriteLine("Gränsen är nummer mellan 1 - 15  ,det där får du göra om.");
                    i--;                                                                //Vid fel input backar loopen ett steg, vi vill inte spara ett felaktigt värde i en position.
                }
            }

            Console.Clear();                                                            //Vi rensar konsolen ren för ny utdata.
            bool bingo = false;                                                         //Vi sätter matchningen 'bingo' till falskt och loopen fortsätter tills 10 tal är inmatade.

            Console.WriteLine("Här är alla dina val:");

            foreach (int input in lottoBoll)                                            //För varje input skrivs värdet ut.
            {
                Console.WriteLine(input);
            }

            for (int i = 0; i < lottoBoll.Length; i++)                                  //For loop med samma värde som innan.
            {
                if (lottoBoll[i] == slumpTal)                                           //Om ett tal matchar slumptalet ändras matchningen 'bingo' till true.
                {
                    bingo = true;
                }
            }

            if (bingo)                                                                  //Om matchningen 'bingo' är true, om vi får bingo, får användaren veta det och vilket tal som var rätt.
            {
                Console.WriteLine("BINGO! Det rätta talet var {0}", slumpTal);
            }
            else                                                                        //Annars får användaren veta att inget tal matchade slumptalet och vilket tal som var rätt.
            {
                Console.WriteLine("Ingen bingo denna gång, det slumpade talet var {0}!", slumpTal);
            }

            Console.WriteLine("Spelet är slut!");                                       //Vi meddelar användaren att spelet/programmet är slut.
            Console.ReadKey();                                                          //Håller konsolen öppen efter avslut.
        }
    }
}
Fermatrix 7841 – Fd. Medlem
Postad: 14 jul 2023 23:10 Redigerad: 14 jul 2023 23:10

Det beror lite på hur du vill att det ska se ut.

En tanke är att introducera en counter och ha en utskrift i slutet:

"Det slumpade talet var {talet}, och du fick bingo {counter} gånger."

Då behöver vi inte heller ha kvar flaggan. :)

CJoy 24
Postad: 14 jul 2023 23:20

Om jag vill kolla om det är bingo på ett värde i taget

Fermatrix 7841 – Fd. Medlem
Postad: 14 jul 2023 23:26

Då kan du göra det i if-satsen, och ändra din if else på slutet

if(!bingo) {//användaren förlorade}

CJoy 24
Postad: 14 jul 2023 23:30 Redigerad: 14 jul 2023 23:34

Jag förstår inte någon skillnad på det, är det inte foreach jag ska ändra eller lägga till?

Det är ju fortfarande alla värden i vektorn som skrivs ut samtidigt

Fermatrix 7841 – Fd. Medlem
Postad: 15 jul 2023 00:01

Jag tror att jag kanske missförstod dig.

Inlägg #7: 

Om jag vill kolla om det är bingo på ett värde i taget

Jag förstod det som att du ville gå igenom hela listan och medan du gör det, skriva ut "BINGO..." för varje bingo. 

Säg att användaren skrev in följande [7, 10, 5, 2, 2, 10, 2, 4, 10, 8], säg nu att talet är 10, så förstår jag det som att du vill skriva ut "BINGO...." tre gånger, allt detta så fort du kommer till ett tal vars ger bingo.

Men du kanske menar något annat? Om ja, försök gärna förklara lite tydligare. :)

CJoy 24
Postad: 15 jul 2023 00:04

Nej inte så,

Efter min Console.Clear(); vill jag att det ska skruva ut något så här:

2

Ingen bingo

4

Ingen bingo

9

Bingo!

Spelet slut.

Fermatrix 7841 – Fd. Medlem
Postad: 15 jul 2023 00:16 Redigerad: 15 jul 2023 00:17

Då vill vi ha något mer likt din ursprungliga konstruktion i din andra tråd.

Här har du pseudokod:

Notera att detta är logiken i din andra for loop!

print(arr[i])

if arr[i] == bingo_number {print(bingo!)}

else {print(no bingo)}

CJoy 24
Postad: 15 jul 2023 00:48

ok, tack så mycket!

Svara Avbryt
Close