19 svar
105 visningar
MayaWingårdh 28
Postad: 29 apr 13:21

Jämförelse av vektorer.

Jag har en uppgift i programmering 1 som går ut på att användaren ska mata in 10 heltal mellan 1-25. Dessa ska sparas i en vektor. Sedan ska programmet slumpa fram 5 stycken tal som också ska sparas i en vektor. Dessa två ska sedan jämföras och det ska skrivas ut hur många "bingo" man fick. Får endas använda loopar. 

Jag får inte till jämförelsen. Vad gör jag för fel? och varför slumpas det fram 6st tal?

Kursen är på distans så har ingen att fråga. Blir tokig!

using System;

namespace ConsoleApp39
{
    class Program
    {
        static void Main(string[] args)
        {
            // vektor med plats för 10. Ska fyllas av användaren 
            int[] tal = new int[10];

            //programmet startar

            Console.WriteLine("Välkommen till Lotto spelet!");
            Console.WriteLine("Ange tio heltal mellan 1-25 som du vill spela med");

            // vektorns fält får värde av användren
            for (int anvandareTal = 0; anvandareTal < tal.Length; anvandareTal++)
            {
                            
                    tal[anvandareTal] = int.Parse(Console.ReadLine());
            }

            Console.WriteLine("Kanon, nu ska vi se om du vinner");

            //vektor för slumptal+lopp för att sätta värdet
            int[] talTvå = new int[5];


            for (int slumpTal = 0; slumpTal < talTvå.Length; slumpTal++) //varför blir 					det sex stycjen nt?
            {
                Random randomaren = new Random();
                int bingoTal = randomaren.Next(1, 26);
                talTvå[slumpTal] = bingoTal;
            }
        

            //Lottodragningen skrivs ut
            Console.WriteLine("Lottodragningen");

            foreach (int bingo in talTvå)
            {
                Console.WriteLine(bingo);

            }

            //jämförelse börjar
            int räknare = 0;

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

                for (int j = 0; j < talTvå.Length; j++)
                {

                    if (tal[i] == talTvå[j])
                    {

                        räknare++;
                    }

                    Console.WriteLine("Grattis du fick" + räknare + " bingo");

                    Console.ReadKey();

                }


            }





        }
    }
}
Dracaena 1585
Postad: 29 apr 14:33

Vad menar du med att det slumpas 6 tal? loopen itererar bara 5 gånger, hade den kört 6ggr hade du fått kompileringsfel eftersom du då hade försökt lägga något på index 6 i arrayen vilket inte går. Vad är det för fel du stöter på? Tips är att köra i debug mode och köra igenom din kod, då ser du ganska snabbt vart det blir fel.

MayaWingårdh 28
Postad: 29 apr 14:48

Jag hade bara räknat fel, det var fem. Tyckte väl att det var konstigt! haha. 

 

Den den här biten av koden funkar inte. Den räknaren ökar inte även om gissningar är rätt. 

    //jämförelse börjar
            int räknare = 0;

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

                for (int j = 0; j < talTvå.Length; j++)
                {

                    if (tal[i] == talTvå[j])
                    {

                        räknare++;
                    }
Dracaena 1585
Postad: 29 apr 14:54 Redigerad: 29 apr 14:59

Ligger inte console.readkey() inne i den andra for loopen? Det är nog det som spökar, programmet inväntar input för att fortsätta att köras.

MayaWingårdh 28
Postad: 29 apr 14:59

Hur gör jag det? 

Dracaena 1585
Postad: 29 apr 15:04

Jag redigerade mitt inlägg samtidigt som du svarade. :)

MayaWingårdh 28
Postad: 29 apr 15:06
Dracaena skrev:

Ligger inte console.readkey() inne i den andra for loopen? Det är nog det som spökar, programmet inväntar input för att fortsätta att köras.

jooooo! gud vad dumt. TACK! 

Dracaena 1585
Postad: 29 apr 15:09

Inga problem. :)

MayaWingårdh 28
Postad: 29 apr 16:50

Kanske kan få hjälp även med detta? Samma uppgift. Man ska kontrollera så att användaren bara skriver in siffror mellan 1-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. "

Den biten förstod jag inte alls. Förstår inte ens vart jag ska börja? Har gjort så här istället. Men det är något som inte funkar.

      // vektorns fält får värde av användren HÄR DET ÄR FEL?
            for (int anvandareTal = 0; anvandareTal < tal.Length; anvandareTal++)
            {
                if (anvandareTal < 26 && anvandareTal > 0) 
                {
                    tal[anvandareTal] = int.Parse(Console.ReadLine());
                }

                else
                {
                    Console.WriteLine("Endas tal mellan 1-25 fungerar");
                    continue;
                }
            }
Dracaena 1585
Postad: 29 apr 21:53

visa gärna bilden

MayaWingårdh 28
Postad: 29 apr 22:03

På uppgiften? 

Dracaena 1585
Postad: 29 apr 22:05

Texten säger ju att man ska referera till bilden nedan. :)

MayaWingårdh 28
Postad: 29 apr 22:06

Dracaena 1585
Postad: 29 apr 22:23

Din lärare vill att du gör följande. Antingen så loopar du över arrayen och minskar om det är ogiltigt. Dvs, antag att du är på plats a[4] och vi får något ogiltigt, då kan du peka på a[3] och plussa din variabel till 4, nu kollar vi igen  är det giltigt? Pm nej, ja då går vi tillbaka igen. Alternativt kollar man om talet ligger mellan 1 och 25, om ja, lägg till den i arrayen, om nej, tvinga användaren att ange ett tal på nytt.

MayaWingårdh 28
Postad: 30 apr 19:58

Okej, då förstår jag. Men jag har ingen aning om hur jag ska göra det. Några tips?  Det andra alternativet antar jag att man gör med if satser? 

MayaWingårdh 28
Postad: 30 apr 20:14
            for (int antalTal = 0; antalTal < tal.Length; antalTal++)
            {
     
                    string anvandareTal = Console.ReadLine();
                    tal[antalTal] = int.Parse(anvandareTal);

                for (int antalTalTvå = 0; antalTalTvå < 1 || antalTalTvå > 25; antalTalTvå--) //Nu hoppar den in direkt
                {
                    string anvandareTalTvå = Console.ReadLine();
                    Console.WriteLine("Endast heltal mellan 1-25");
                    continue;
                }
     
            }

Detta knåpade jag ihop nu för att ha något att börja med. Men nu hoppar den in i andra for loopen efter första gissningen. 

Dracaena 1585
Postad: 30 apr 20:52

Den första metoden din lärare pratar om är enklast.

Loopen är självklar, men vad ska vi egentligen göra? 
OM vi tar emot ett ogiltigt tal, i--;
Är talet giltigt? Lägg in den i arrayen.

hur kollar vi om värdet är inom vårt intervall? Behöver du verkligen en for loop för det?
Om talet är inom intervallet, vad gör vi då?
Om talet inte är i intervallet, vad gör vi med antalTal?

MayaWingårdh 28
Postad: 30 apr 22:39 Redigerad: 30 apr 22:47

Vad mycket lättare det blev nu! TACK!

Blev så här. Ska ändra namn på xxx. och har tagit bort continue. 

 for (int antalTal = 0; antalTal < tal.Length; antalTal++)
            {
                string anvandareTal = Console.ReadLine();
                int xxx = int.Parse(anvandareTal);
                tal[antalTal] = int.Parse(anvandareTal);

                if (xxx < 1 || xxx > 25)

                {
                    antalTal--;
                    Console.WriteLine("Endast tal mellan 1-25");
                    continue;
                }                   
     
            }
Dracaena 1585
Postad: 1 maj 00:12

Precis, det ser rätt ut. :)

MayaWingårdh 28
Postad: 1 maj 00:20

Stort stort tack! 😊

Svara Avbryt
Close