16 svar
322 visningar
MayaWingårdh 47 – Fd. Medlem
Postad: 18 maj 2021 10:36

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++;

				}
Laguna Online 30711
Postad: 18 maj 2021 11:56

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. 

MayaWingårdh 47 – Fd. Medlem
Postad: 18 maj 2021 12:48

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? 

Laguna Online 30711
Postad: 18 maj 2021 12:57

Prova. 

MayaWingårdh 47 – Fd. Medlem
Postad: 18 maj 2021 13:20 Redigerad: 18 maj 2021 13:22
// 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.

Laguna Online 30711
Postad: 18 maj 2021 13:22

Du kan använda 'else' i stället för ett test för den andra.

MayaWingårdh 47 – Fd. Medlem
Postad: 18 maj 2021 13:25

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. 

MayaWingårdh 47 – Fd. Medlem
Postad: 18 maj 2021 13:26

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. 

MayaWingårdh 47 – Fd. Medlem
Postad: 18 maj 2021 13:51

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++;
					


				}
MayaWingårdh 47 – Fd. Medlem
Postad: 18 maj 2021 14:41

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? 

Laguna Online 30711
Postad: 18 maj 2021 17:01

passagerareTvå = new... slänger bort det gamla värdet på passagerareTvå. 

MayaWingårdh 47 – Fd. Medlem
Postad: 18 maj 2021 18:11

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. 

MayaWingårdh 47 – Fd. Medlem
Postad: 18 maj 2021 18:14

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++;
					}
MayaWingårdh 47 – Fd. Medlem
Postad: 18 maj 2021 21:31

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?

Fermatrix 7841 – Fd. Medlem
Postad: 18 maj 2021 21:53

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.

MayaWingårdh 47 – Fd. Medlem
Postad: 18 maj 2021 22:07 Redigerad: 18 maj 2021 22:08

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++;	
				}
	
			}
hardswap 1 – Fd. Medlem
Postad: 21 maj 2021 11:57

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?

Svara
Close