8 svar
84 visningar
CJoy är nöjd med hjälpen
CJoy 24
Postad: 14 jul 2023 16:02

Akut! C# Programmet avslutas när jag fyllt vektorn

Vad jag är gör eller flyttar på, tar bort eller lägger in så stängs konsolen när jag trycker enter för sista positionen i min vektor. Jag vet inte längre vad jag ska ta mig till!

        static void Main(string[] args)
        {
            int högstaTal = 20;    //Maxtalet är 20, användaren får inte ange ett högre tal.

            Console.WriteLine("Skriv in 10 heltal mellan 1 -och- 20, ange det första talet nedan. Programmet tar sedan reda på om ett utav dina tal matchar det tal som jag har valt.");    //Med bestämda minumum och maximum gräns för talen behöver vi selektioner nedan.

            int[] listaHeltal = new int[10];    //Från föregående uppgift skapar vi en int vektor med 10 positioner.
            int i;    //Nu har vi användning för detta objekt!

            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.
                }
                
            }
            Console.Clear();  //Vi raderar all data i konsolen efter att sista indatan är inmatad.

            int jämförelseTal = 7;    //Deklarerar en int variabel med värde 7 som ska användas i jämförelsen.
            for (i = 0; i == listaHeltal.Length;)    //Om alla 10 positioner är fyllda informerar vi användaren om det.
            {
                if (listaHeltal[i] == jämförelseTal)  //Om NÅGOT utav de inmtatade talen match mitt tal (jämförelseTal) skrivs detta ut.
                {
                    Console.WriteLine("Alla tal är nu angivna.");
                    Console.WriteLine("Här är alla dina tal listade.");
                    Console.WriteLine(String.Join(" ,  ", listaHeltal));    //Vi ger tillbaka den kompletta listan utav 10 tal som användaren nu har matat in.
                    Console.WriteLine("Du valde {0}, det var talet som jag hade valt!!!", jämförelseTal);  //Om det blir en match får användaren veta det.
                }
                else if (listaHeltal[i] != jämförelseTal)  //Om INGET utav de inmatade talen matchar mitt tal (jämförelseTal) skrivs detta ut.
                {
                    Console.WriteLine("Alla tal är nu angivna.");
                    Console.WriteLine("Här är alla dina tal listade.");
                    Console.WriteLine(String.Join(" ,  ", listaHeltal));    //Vi ger tillbaka den kompletta listan utav 10 tal som användaren nu har matat in.
                    Console.WriteLine("Inget utav dina tal matchade mitt valda tal.");
                }
                Console.ReadKey();  //Håll konsolen öppen efter avslutad körning.
            }
        }
    }
}
    

Fermatrix 7841 – Fd. Medlem
Postad: 14 jul 2023 16:49

Det har nog blivit lite fel i din andra for-loop, notera vad du har gjort:

for (i = 0; i == listaHeltal.Length;)

 

Det ska förmodligen vara:

for (i = 0; i < listaHeltal.Length;i++)
CJoy 24
Postad: 14 jul 2023 17:52

Men det är ju när vektorn är full som det ska hända. Är det inte == då istället för <?

Fermatrix 7841 – Fd. Medlem
Postad: 14 jul 2023 18:05 Redigerad: 14 jul 2023 18:11

Jag förstår inte vad du menar?

Varför använder du en for-loop för att veta om din vektorn är full? I vilket scenario kan man ta sig vidare din tidigare for-loop utan att fylla din vektor? 

Din andra for-loop kommer aldrig vara sann. Det du säger i ord:

Definiera en variabel i med värdet 0, OM i == längden av min vektor, kör for loopen. Notera att detta är ju omöjligt, då du definierar ju i till 0, så detta är endast sant om din vektor inte innehåller något, men det kommer inte heller ske. Det blir tydligare om du flyttar ut din Console.Readkey() till att vara utanför din for-loop, så ser du att du aldrig går in i for-loopen.


Du får alltså tänka om logiken i ditt program en aning. 

 

CJoy 24
Postad: 14 jul 2023 19:04

Jaaa, men nu fattar jag! 

Har ändrat så for loopar a ser likadana ut så nu fungerar det som det vat tänkt. 

Tack för hjälpen 

CJoy 24
Postad: 14 jul 2023 19:22

Okej, nu är problemen att programmet inte avslutas efter meddelandet om talet matchade mitt tal eller inte. Och att även om ett input är samma som mitt tal så är meddelandet att det inte blev en match. 

Laguna Online 28701
Postad: 14 jul 2023 19:48

Kan du visa hela utmatningen från programmet?

Fermatrix 7841 – Fd. Medlem
Postad: 14 jul 2023 19:52 Redigerad: 14 jul 2023 19:52

Om du introducerade ändringen jag föreslog i mitt första inlägg så har du som du säger ett problem att du kommer skriva ut en massa saker om och om igen. Kontrollflödet blir alltså ett problem nu.

Utan att överkomplicera detta med funktioner, eller att använda "return", så kan vi fixa kontrollflödet med en flagga:


	static void Main(string[] args)
	{
		int högstaTal = 20; //Maxtalet är 20, användaren får inte ange ett högre tal.
		Console.WriteLine("Skriv in 10 heltal mellan 1 -och- 20, ange det första talet nedan. Programmet tar sedan reda på om ett utav dina tal matchar det tal som jag har valt."); //Med bestämda minumum och maximum gräns för talen behöver vi selektioner nedan.
		int[] listaHeltal = new int[10]; //Från föregående uppgift skapar vi en int vektor med 10 positioner.
		int i; //Nu har vi användning för detta objekt!
		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.
			}
		}

		Console.Clear(); //Vi raderar all data i konsolen efter att sista indatan är inmatad.
		int jämförelseTal = 7; //Deklarerar en int variabel med värde 7 som ska användas i jämförelsen.
		bool vinst = false; // Håller koll på om användaren har vunnit
		for (i = 0; i < listaHeltal.Length; i++) //Om alla 10 positioner är fyllda informerar vi användaren om det.
		{
			if (listaHeltal[i] == jämförelseTal) //Om NÅGOT utav de inmtatade talen match mitt tal (jämförelseTal) skrivs detta ut.
			{
				vinst = true;
				break;
			}
		}

		if (vinst)
		{
		    //Koden som exekveras när vi vann.
		}
		else
		{
		    //Koden som exekveras när vi förlorar.	
		}
	}
CJoy 24
Postad: 14 jul 2023 20:02

Aha, jag gjorde felet att skriva break utan "flagga" nu har jag testkört koden och allt verkar fungera som det ska tack igen för hjälpen xD

Svara Avbryt
Close