Trädvy Permalänk
Medlem
Registrerad
Sep 2019

Lagra tal i vektorer i c#

Hej! Håller på med en inlämningsuppgift i Programmering 1 och har kört fast lite. Projektet går ut på att användaren först får välja ett alternativ från en meny. När användaren väljer alt.1 får hen mata in 25 tal. Därefter kommer menyn upp igen och användaren kan göra lite olika grejer med de talen. (Det är läraren som har skapat klasserna som jag sen fått fylla.)

Mitt problem är att när användaren har matat in de 25 talen och sedan väljer alt.1 igen så går det att mata in ytterligare 25 tal, vilket jag inte vill. Jag vill att när användaren väljer alt.1 en andra gång så ska programmet tala om att alla platser i vektorn är fyllda och därefter ska menyn visas igen.

Är helt ny på programmering och skulle verkligen uppskatta lite hjälp. Sorry om detta va otydligt.

using System; namespace Bussen { class Program { public static void Main(string[] args) { var minbuss = new Buss(); minbuss.Run(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } class Buss { public int[] passagerare = new int[25]; public int antal_passagerare; public void Run() { int meny = 0; do { Console.WriteLine("------------------"); Console.WriteLine("Välj alternativ: "); Console.WriteLine("1 Lägg till passagerare (ålder)"); Console.WriteLine("2 Skriv ut alla passagerare"); Console.WriteLine("3 Beräkna alla åldrarna"); Console.WriteLine("0 Avsluta programmet"); Console.WriteLine("------------------"); meny = int.Parse(Console.ReadLine()); switch (meny) { case 1: add_passenger(); break; case 2: print_buss(); break; /*case 3: calc_total_age(); break;*/ case 0: Console.WriteLine("Avslut"); break; } } while (meny != 0); { } } public void add_passenger() { for (int i = 0; i < passagerare.Length; i++) { Console.WriteLine("Ny passagerare: "); passagerare[i] = int.Parse(Console.ReadLine()); } //Om bussen är full kan inte någon passagerare stiga på } public void print_buss() { foreach (int meny in passagerare) { Array.ForEach(passagerare, Console.WriteLine); break; } //Skriv ut alla värden ur vektorn. Alltså - skriv ut alla passagerare } } }

Trädvy Permalänk
Medlem
Plats
Söderbärke
Registrerad
Nov 2010
Skrivet av räkm4cka:

Hej! Håller på med en inlämningsuppgift i Programmering 1 och har kört fast lite. Projektet går ut på att användaren först får välja ett alternativ från en meny. När användaren väljer alt.1 får hen mata in 25 tal. Därefter kommer menyn upp igen och användaren kan göra lite olika grejer med de talen. (Det är läraren som har skapat klasserna som jag sen fått fylla.)

Mitt problem är att när användaren har matat in de 25 talen och sedan väljer alt.1 igen så går det att mata in ytterligare 25 tal, vilket jag inte vill. Jag vill att när användaren väljer alt.1 en andra gång så ska programmet tala om att alla platser i vektorn är fyllda och därefter ska menyn visas igen.

Är helt ny på programmering och skulle verkligen uppskatta lite hjälp. Sorry om detta va otydligt.

using System; namespace Bussen { class Program { public static void Main(string[] args) { var minbuss = new Buss(); minbuss.Run(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } class Buss { public int[] passagerare = new int[25]; public int antal_passagerare; public void Run() { int meny = 0; do { Console.WriteLine("------------------"); Console.WriteLine("Välj alternativ: "); Console.WriteLine("1 Lägg till passagerare (ålder)"); Console.WriteLine("2 Skriv ut alla passagerare"); Console.WriteLine("3 Beräkna alla åldrarna"); Console.WriteLine("0 Avsluta programmet"); Console.WriteLine("------------------"); meny = int.Parse(Console.ReadLine()); switch (meny) { case 1: add_passenger(); break; case 2: print_buss(); break; /*case 3: calc_total_age(); break;*/ case 0: Console.WriteLine("Avslut"); break; } } while (meny != 0); { } } public void add_passenger() { for (int i = 0; i < passagerare.Length; i++) { Console.WriteLine("Ny passagerare: "); passagerare[i] = int.Parse(Console.ReadLine()); } //Om bussen är full kan inte någon passagerare stiga på } public void print_buss() { foreach (int meny in passagerare) { Array.ForEach(passagerare, Console.WriteLine); break; } //Skriv ut alla värden ur vektorn. Alltså - skriv ut alla passagerare } } }

Skapa en array utan att bestämma storleken på den i förväg så kan du kontrollera längden på den innan lägger till fler element! En sådan array brukar kallas list och är egentligen alltid att föredra om man ska lägga till eller ta bort saker dynamiskt.

Edit:

Ser ju nu att du har en integer som heter antal_passagerare. Använd den om du måste använda dig av en array. Om den alltid blir ett större när du lägger till en passagerare och en mindre varje gång du tar bort en så kan du kontrollera den varje gång du försöker lägga till passagerare.

Skickades från m.sweclockers.com

Nörd, utvecklare, pappa, löpartokig, vegan och besserwisser.

Bli vegan! För djuren, planeten, hälsan och våra barns skull!

Trädvy Permalänk
Medlem
Registrerad
Sep 2019

@NisseG91: Tack för svar. Ja precis, får inte använda listor i uppgiften. Vet inte riktigt hur jag ska använda 'antal_passagerare'. Vilken klass ska den användas i och ska jag göra om den till vektor istället för 'passagerare'?

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2013

@räkm4cka:

public void add_passenger() { for (int i = 0; i < passagerare.Length; i++) { Console.WriteLine("Ny passagerare: "); passagerare[i] = int.Parse(Console.ReadLine()); } //Om bussen är full kan inte någon passagerare stiga på }

Du saknar validering i metoden och börjar därför om loopen på index 0 varje gång en användare trycker för att lägga till passagerare.

Användaren trycker 1.
Loopen börjar på 0 och loopar hela arrayen, du matar in alla 25 då loopen fortsätter så länge i är mindre än längden på arrayen.

Du trycker på 1 igen.
Samma sak kommer nu ske som ovan och skriver denna gång över alla 25 tidigare värden.

Det du behöver göra i loopen innan en användare får ange ett värde är att se om (if) platsen är tom.
Tips: Default värde för int är 0.

Trädvy Permalänk
Medlem
Plats
Söderbärke
Registrerad
Nov 2010
Skrivet av räkm4cka:

@NisseG91: Tack för svar. Ja precis, får inte använda listor i uppgiften. Vet inte riktigt hur jag ska använda 'antal_passagerare'. Vilken klass ska den användas i och ska jag göra om den till vektor istället för 'passagerare'?

Antal_passagerare är 0. Inga värden finns i din passagerarlista.
Du lägger till passagerare. En i taget. Vad händer om du då samtidigt ökar antal_passagerare med 1? Jo, du håller koll på hur många du lagt till. När sedan antal_passagerare är lika med max antal passagare så tillåt inga fler passagerare att läggas till. Förslagsvis så använd en If-sats för att kontrollera.

Skickades från m.sweclockers.com

Nörd, utvecklare, pappa, löpartokig, vegan och besserwisser.

Bli vegan! För djuren, planeten, hälsan och våra barns skull!

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@räkm4cka: Är du säker på att användaren verkligen ska lägga till 25 passagerare på en gång? Metoden heter ju trots allt add_passenger och inte add_passengers, till skillnad från svenskans "passagerare" så skiljer ju engelskan på singular och plural här.

Men hur som helst så antar jag att det är övningen som gett dig antal_passagerare-variabeln, så använd den som sagt. Syftet med variabeln bör vara att hålla koll på hur många passagerare som lagts till i vektorn, så det är ju bara att öka variabeln med 1 varje gång du lägger till en ny passagerare.

Trädvy Permalänk
Medlem
Registrerad
Sep 2019

@zaibuf, @NisseG91:
aahh sant. tack

Trädvy Permalänk
Medlem
Registrerad
Sep 2019

@perost:
Ah jo precis.. Fick så vaga instruktioner så förstod inte riktigt att man inte skulle mata in alla på en gång.

Trädvy Permalänk
Medlem
Plats
Skåneland
Registrerad
Mar 2005

Om du initierar antal passagerare med 0

int antal_passagerare = 0;

så kan du använda den sen i lägg till passagerare.
Varje passagerare lägger till en och när den är full så körs aldrig loopen, även om du går in i metoden igen.

public void add_passenger() { for (antal_passagerare ; antal_passagerare < passagerare.Length; antal_passagerare ++) { Console.WriteLine("Ny passagerare: "); if (!int.TryParse(Console.ReadLine(), out passagerare[antal_passagerare])) return; } //Om bussen är full kan inte någon passagerare stiga på }

"Om man arbetar tillräckligt länge med att förbättra ett föremål går det sönder. "

Hjälp oss göra världen lite snällare! www.upphittat.nu

Trädvy Permalänk
Medlem
Registrerad
Sep 2019

@NisseG91, @zaibuf, @perost, @ZecretW
Har kört fast igen.. Allting funkar förutom att skriva ut användarens inmatning. Endast det sista angivna talet skrivs ut med 24 nollor efter.
Har provat massa och googlat men hittar inte nåt som funkar.
Såhär ser klassen för utskrivning ut just nu:

public void print_buss() { foreach (int meny in passagerare) { Array.ForEach(passagerare, Console.WriteLine); break; } //Skriv ut alla värden ur vektorn. Alltså - skriv ut alla passagerare }

Trädvy Permalänk
Medlem
Plats
Skåneland
Registrerad
Mar 2005
Skrivet av räkm4cka:

@NisseG91, @zaibuf, @perost, @ZecretW
Har kört fast igen.. Allting funkar förutom att skriva ut användarens inmatning. Endast det sista angivna talet skrivs ut med 24 nollor efter.
Har provat massa och googlat men hittar inte nåt som funkar.
Såhär ser klassen för utskrivning ut just nu:

public void print_buss() { foreach (int meny in passagerare) { Array.ForEach(passagerare, Console.WriteLine); break; } //Skriv ut alla värden ur vektorn. Alltså - skriv ut alla passagerare }

foreach gör en loop där varje i varje runda stoppas nästa post i passagerare in i meny. I detta fallet är det en int.
Så inne i loopen ska du bara använda referenser till meny då den blir tilldelad det nya värdet i varje runda.

public void print_buss() { foreach (int meny in passagerare) { if (meny == 0) break; Console.print(meny.toString()); } //Skriv ut alla värden ur vektorn. Alltså - skriv ut alla passagerare }

"Om man arbetar tillräckligt länge med att förbättra ett föremål går det sönder. "

Hjälp oss göra världen lite snällare! www.upphittat.nu

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@räkm4cka: Varför har du en Array.ForEach i en foreach-loop? Tack vare att du har en ovillkorlig break i loopen så kommer den bara köra en iteration, vilket gör att loopen inte har någon som helst funktion. Hur som helst så är det troligtvis inte meningen att du ska skriva ut hela arrayen, utan endast så många som matats in (d.v.s. genom att använda antal_passagerare).

Men problemet är nog egentligen inte den här kodsnutten, utan hur du fyller arrayen. Jag skulle rekommendera att du använder debuggern för att stega igenom programmet och se vad som händer när du matar in passagerare. Vet du inte hur debuggern fungerar så finns en kort genomgång här. Ta några minuter och lär dig använda den, det kommer spara dig enormt mycket tid i längden.

Trädvy Permalänk
Medlem
Plats
Söderbärke
Registrerad
Nov 2010
Skrivet av perost:

@räkm4cka: Varför har du en Array.ForEach i en foreach-loop? Tack vare att du har en ovillkorlig break i loopen så kommer den bara köra en iteration, vilket gör att loopen inte har någon som helst funktion. Hur som helst så är det troligtvis inte meningen att du ska skriva ut hela arrayen, utan endast så många som matats in (d.v.s. genom att använda antal_passagerare).

Men problemet är nog egentligen inte den här kodsnutten, utan hur du fyller arrayen. Jag skulle rekommendera att du använder debuggern för att stega igenom programmet och se vad som händer när du matar in passagerare. Vet du inte hur debuggern fungerar så finns en kort genomgång här. Ta några minuter och lär dig använda den, det kommer spara dig enormt mycket tid i längden.

Det här är det bästa tipset du kan få! Är du flitig användare av debuggern så är hälften vunnet! Verkar vara ett bortglömt verktyg i skolorna idag, jag har läst ganska mycket programmering på alla möjliga nivåer utan att de ens nämnt att den finns.

Skickades från m.sweclockers.com

Nörd, utvecklare, pappa, löpartokig, vegan och besserwisser.

Bli vegan! För djuren, planeten, hälsan och våra barns skull!

Trädvy Permalänk
Medlem
Registrerad
Sep 2019

@perost: Det går att skriva ut alla värden nu, men ett nytt problem har uppstått. Jag måste skriva in alla nummer på en gång, alltså ta bort break; från loopen där användaren skriver värden. Lägger jag till break; så funkar det inte att skriva ut alla värden. Vet inte hur jag ska återgå till menyn efter varje inmatning.
Såhär ser hela koden ut:

using System; namespace Buss2 { class Buss { public int[] passagerare = new int[25]; public int antal_passagerare; public void Run() { int temp = 0; do { Console.WriteLine("------------------"); Console.WriteLine("Välj alternativ: "); Console.WriteLine("1 Lägg till passagerare (ålder)"); Console.WriteLine("2 Skriv ut ålder på alla passagerare"); Console.WriteLine("3 Beräkna alla åldrarna"); Console.WriteLine("0 Avsluta programmet"); Console.WriteLine("------------------"); temp = int.Parse(Console.ReadLine()); switch (temp) { case 1: if (antal_passagerare != 25) { add_passenger(); } else { Console.WriteLine("Bussen är tyvärr full!"); } break; case 2: print_buss(); break; /*case 3: calc_total_age(); break;*/ case 0: Console.WriteLine("Avslut"); break; default: Console.WriteLine("Felaktig inmatning"); break; } } while (temp != 0); { } } public void add_passenger() { for (int i = 0; i < passagerare.Length; i++) { Console.WriteLine("Ange ny passagerare med ålder: "); passagerare[i] = int.Parse(Console.ReadLine()); antal_passagerare++; int temp = 0; //break; } } public void print_buss() { for (int x = 0; x < passagerare.Length; x++) { Console.WriteLine(passagerare[x]); } } /*public int calc_total_age() { }*/ } class Program { public static void Main(string[] args) { var minbuss = new Buss(); minbuss.Run(); minbuss.add_passenger(); minbuss.print_buss(); //minbuss.calc_total_age(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } }

Edit: Tror jag löste det:

public void add_passenger() { for (int i = 0; i < passagerare.Length; i++) { Console.WriteLine("Ange: "); passagerare[antal_passagerare] = int.Parse(Console.ReadLine()); antal_passagerare++; int temp = 0; break; } }

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@räkm4cka: Om du vill att antal_passerare endast ska lägga till en passagerare så behöver du inte ha någon loop alls i den funktionen. Jag rekommenderar starkt att du använder debuggern för att se vad som sker med vektorn i add_passenger när du använder break.

Du bör också använda antal_passagerare i print_buss istället för passagerare.Length. Det finns endast ett ställe i koden där du bör använda passagerare.Length, och det är i if (antal_passagerare != 25) där du borde använda passagerare.Length istället för att hårdkoda gränsen till 25. Som det är nu måste du ju ändra gränsen på två ställen i koden om du skulle vilja ändra antalet platser i bussen.