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.
}
}
}
}
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++)
Men det är ju när vektorn är full som det ska hända. Är det inte == då istället för <?
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.
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
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.
Kan du visa hela utmatningen från programmet?
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.
}
}
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