Går det att återvända till metod och fylla på array utan att skriva över det som redan finns i?
Hej,
Jag gör ett projekt i programmering ett som går ut på att göra en meny med olika val. Första valet är att lägga till passagerare på bussen. Min lösning funkar och den funkar fint med de andra menyvalen. Men om jag vill gå tillbaka till val i och lägga till fler passagerare så skriver den över det som redan är inlagt. Går det att lösa?
Min kod:
// bestäm antal som ska läggas till
int antal = 0;
Console.WriteLine("Bussen har plats för 25 personer.");
Console.WriteLine("Bussen har nu " + antal_passagerare + " passagerare. Hur många personer vill du lägga till?");
antal = int.Parse(Console.ReadLine());
passagerareTvå = new passagerare[antal];
passagerare = new int[antal];
if (antal_passagerare+antal > 25)
{
Console.WriteLine("Bussen har endast plats för 25 personer");
}
Console.WriteLine("Du lägger nu till passagerarna genom att ange deras kön, yrke och ålder");
Console.WriteLine("Fyll i en åt gången och tryck enter för att komma vidare. ");
//Lägg till i vektor
for (int antalPassagerare = 0; antalPassagerare < antal; antalPassagerare++)
{
string kon = Console.ReadLine();
string yrke = Console.ReadLine();
int alder = int.Parse(Console.ReadLine());
passagerareTvå[antalPassagerare] = new passagerare(kon, alder, yrke);
passagerare[antalPassagerare] = alder;
antal_passagerare++;
}
Det ser ut som att du får kolla om det redan finns passagerare, och i så fall använda de arrayer du redan har, t. ex. passagerareTvå, men förstora dem så att det finns plats för de nya. I språket C skriver man realloc, i C# vet jag inte.
okej, så jag gör två if sater? Om antal_passagerare=0 så körs den loop jag skrivit. Om antal_passagerare>0 så ska en loop köras som lägger in de nya passagerarna efter de andra?
Prova.
// bestäm antal passagerare som ska läggas till
int svar = 0;
int antal = 0;
Console.WriteLine("\n");
Console.WriteLine("Bussen har plats för 25 personer.");
Console.WriteLine("Bussen har nu " + antal_passagerare + " passagerare. Hur många personer vill du lägga till?");
svar = int.Parse(Console.ReadLine());
Console.WriteLine("\n");
antal = svar + antal_passagerare;
passagerareTvå = new passagerare[antal];
passagerare = new int[antal];
//Om bussen är full
if (antal > 25)
{
Console.WriteLine("Bussen har endast plats för 25 personer");
}
Console.WriteLine("Du lägger nu till passagerarna genom att ange deras kön, yrke och ålder");
Console.WriteLine("Fyll i en åt gången och ange ålder i heltal och tryck enter för att komma vidare. ");
//Lägg till i vektor första gången
if (antal_passagerare==0)
{
for (int i = 0; i < svar; i++)
{
string kon = Console.ReadLine();
string yrke = Console.ReadLine();
int alder = int.Parse(Console.ReadLine());
Console.WriteLine("\n");
passagerareTvå[i] = new passagerare(kon, alder, yrke);
passagerare[i] = alder;
antal_passagerare++;
}
}
if (antal_passagerare > 0)
{
for (int i = 0; i < svar; i++)
{
string kon = Console.ReadLine();
string yrke = Console.ReadLine();
int alder = int.Parse(Console.ReadLine());
Console.WriteLine("\n");
passagerareTvå[antal_passagerare+i] = new passagerare(kon, alder, yrke);
passagerare[antal_passagerare+i] = alder;
antal_passagerare++;
}
}
Console.WriteLine("\n");
Console.WriteLine("Klicka enter för att återvända till menyn.");
Console.ReadKey();
}
Gjorde så här nu. Men efter att den har kört den fungerande första loopen. hoppas den ändå in i nästa loop eftersom antal_passagerare nu är fler än 0. Hur undviker jag det? Andra loopen verkar inte heller vara korrekt.
edit: Löste det första problemet med en else istället för if.
Du kan använda 'else' i stället för ett test för den andra.
Det funkade fint. Men den andra loopen? Jag vill öka storleken på arrayn varje varv samtidigt som jag flyttar fram det som finns i den.
Jag vill att passagerareTvå[0]=passagerareTvå[1] typ. Men det kan ju hända att den behöver hoppa mer en ett steg och då antar ajg att man ska loopa den så att den ökar och fylls för varje steg.
Kommit hit. Men den skriver fortfarande över det gamla. blir galen. Tycker att jag har gett den rätt placering i array med antal_passagerare+i?
else //FIXA HÄR
{
passagerareTvå = new passagerare[antal+svar];
passagerare = new int[antal+svar];
for (int i = 0; i < svar; i++)
{
string kon = Console.ReadLine();
string yrke = Console.ReadLine();
int alder = int.Parse(Console.ReadLine());
Console.WriteLine("\n");
passagerareTvå[antal_passagerare+i] = new passagerare(kon, alder, yrke);
passagerare[antal_passagerare+i] = alder;
antal_passagerare++;
}
Jag tror jag tänker helt fel. Visst försöker min kod att lägga in nya personer efter de gamla. Jag måste istället flytta fram passagerarna och fylla på med nya det hållet?
passagerareTvå = new... slänger bort det gamla värdet på passagerareTvå.
Har du några tips på hur jag ska tänka när jag ska flytta fram värdena i vektorn? Jag har hållit på att flytta runt kod och gissa i timmar nu.
Ser ut så här just nu. Tänker att jag ska ha en loop som flyttar fram talen i vektorn. Och sedan köra samma loop som första?
for (int i = 0; i < antal_passagerare - 1; i++)
{
passagerare[i] = passagerare[antal_passagerare + 1];
}
for (int i = 0; i < svar; i++)
{
string kon = Console.ReadLine();
string yrke = Console.ReadLine();
int alder = int.Parse(Console.ReadLine());
Console.WriteLine("\n");
passagerareTvå[i] = new passagerare(kon, alder, yrke);
passagerare[i] = alder;
antal_passagerare++;
}
Upptäckte nu (efter fem timmar) att värdet i vektorn försvinner redan när jag väljer alternativ 1 en andra gång. Det vill säga andra gången jag går in i metoden. Gör det alltid så? Kan jag inte lösa det jag håller på med?
Problemet är att du börjar från index 0 oavsett vad så du kommer bara skriva över värden i din array. Jag har för mig att du börjat med OOP? Det hade nog gjort det mycelt enklare och tydligare. Då kan man introducera en variabel size som är antalet passagerare. Du kan då göra en add funktion som lägger element t på platsen array[size++]. Här går du självklart kolla om arrayen är full eller nästan full och förstora den antingen genom mha en temporär array eller så kan du använda en inbyggd funktion som gör detta åt dig. Jag vet inte riktigt vad det heter i C#.
Alternativt om du vill hålla dig till koden du redan skrivit måste du först kolla om listan är tom, om den inte är tom måste du börja lägga från första elementet som är null. Du kan göra detta på många sätt, kanske det enklaste är att loopa igenom och leta när array[i]==null och börja sätta in dina passagerare därifrån.
när jag väljer metoden första gången ser min inmatning ut så här.
Problemet är att när jag sedan väljer metoden en andra gång finns det inte längre något värde i vektorn? Jag fattar inte varför?
Nästa gång metoden ska köras har jag försökt koda en IF sats där antal_passaderare>0. Men få finns inte mina lagrade värden kvar?
if (antal_passagerare==0)
{
for (int i = 0; i < svar; i++)
{
string kon = Console.ReadLine();
string yrke = Console.ReadLine();
int alder = int.Parse(Console.ReadLine());
Console.WriteLine("\n");
passagerareTvå[i] = new passagerare(kon, alder, yrke);
passagerare[i] = alder;
antal_passagerare++;
}
}
Inte helt 100, men det är väl för att du alltid börjar loopen vid 0. Så när du försöker lägga till passagerare en andra gång så kommer vi ju fortfarande börja från 0, och då skriva över föregående värde i array:en. Du använder ju antal_passagerare för att hålla koll på hur många passagerare du har. Kan man inte då använda den på ett sätt för att istället ta nästa lediga plats i din array?