Permalänk

Bussen C#

Hej!

Jag håller på med sista uppgiften "Bussen" i C# för programmering 1.
Här finns uppgiften för beskådan:
https://www.dropbox.com/s/7obtk1u4f8rzcum/Projekt%20i%20progr...

Har kört fast på ett par olika saker.

Problem nr 1:
I min metod "Print_buss" så skrivs även de som inte fått något värde ut, alltså om jag valt att skriva in 5 passagerare så skrivs ändå 25 ut varav 20 st med 0 som ålder. Detta skapar även problem med metoden som ska räkna ut medelåldern eftersom det är så himla många som skrivs ut som 0 år, fastän det i själva verket är tomma säten på bussen.

Problem nr 2:
I metoden "Max_age" skrivs det ibland ut korrekt, alltså den faktiskt äldsta passageraren och ingenting annat, men vissa gånger skriver den ut flera stycken passagerare i olika ålder.

Tacksam för hjälp med dessa problem!

Här kommer min kod (den är lite muppig med kommentarer från kursens kodskal):

using System; using System.Net.NetworkInformation; namespace Buss { class Buss { public int[] passagerare = new int[25]; public int antal_passagerare; public void Run() { Console.WriteLine("Välkommen ombord på bussen!"); int menu; do { Console.WriteLine("Välj ett alternativ: "); Console.WriteLine("1. Lägg till en passagerare. "); Console.WriteLine("2. Kontrollera åldern på passagerarna. "); Console.WriteLine("3. Beräkna den sammanlagda åldern på passagerarna. "); Console.WriteLine("4. Beräkna medelåldern på passagerarna. "); Console.WriteLine("5. Identifiera den äldsta passageraren. "); Console.WriteLine("6. Identifiera alla passagerare mellan 20-30. "); Console.WriteLine("0. Avsluta programmet. "); menu = int.Parse(Console.ReadLine()); switch (menu) { case 1: Add_passenger(); break; case 2: Print_buss(); break; case 3: Calc_total_age(); break; case 4: Calc_average_age(); break; case 5: Max_age(); break; case 6: Find_age(); break; case 0: menu = 0; break; } } while (menu != 0); } public void Add_passenger() { Console.WriteLine("Hur många passagerare vill du lägga till?"); string str1 = Console.ReadLine(); int size = Convert.ToInt32(str1); for (int i = 0; i < size; i++) { Console.WriteLine("Lägg till en passagerare genom att skriva hens ålder: "); string answer = Console.ReadLine();//the user give str an value int nya_passagerare = Convert.ToInt32(answer);//Converting to int passagerare[i] = nya_passagerare; //Adding the value to the array } // Console.WriteLine("\nAlla passagerare har nu klivit på:"); //foreach (int age in passagerare) // Console.WriteLine(age); //Lägg till passagerare. Här skriver man då in ålder men eventuell annan information. //Om bussen är full kan inte någon passagerare stiga på } public void Print_buss() { foreach (var antal_passagerare in passagerare) { Console.WriteLine("Passagerarnas ålder är: " + antal_passagerare); } } public void Calc_total_age() { int sum = 0; for (int i = 0; i < passagerare.Length; i++) { sum += passagerare[i]; } Console.WriteLine("Den sammanlagda åldern på passagerarna är " + sum + "."); //Beräkna den totala åldern. //För att koden ska fungera att köra så måste denna metod justeras, alternativt att man temporärt sätter metoden med void } //Metoder för betyget C public void Calc_average_age() { int sum = 0; for (int i = 0; i < antal_passagerare; i++) { sum += passagerare[i]; } int sum1 = sum / passagerare.Length; Console.WriteLine("Passagerarnas medelålder är " + sum1 + " år."); //Betyg C //Beräkna den genomsnittliga åldern. Kanske kan man tänka sig att denna metod ska returnera något annat värde än heltal? //För att koden ska fungera att köra så måste denna metod justeras, alternativt att man temporärt sätter metoden med void } public void Max_age() { int maxAge = 0; maxAge = passagerare[0]; for (int i = 0; i < passagerare.Length; i++) { if (passagerare[i] > maxAge) { maxAge = passagerare[i]; Console.WriteLine("Den äldsta passageraren är " + maxAge + " år gammal."); } } //Betyg C //ta fram den passagerare med högst ålder. Detta ska ske med egen kod och är rätt klurigt. //För att koden ska fungera att köra så måste denna metod justeras, alternativt att man temporärt sätter metoden med void } public void Find_age() { //Visa alla positioner med passagerare med en viss ålder //Man kan också söka efter åldersgränser - exempelvis 55 till 67 //Betyg C //Beskrivs i läroboken på sidan 147 och framåt (kodexempel på sidan 149) } class Program { public static void Main(string[] args) { var minbuss = new Buss(); minbuss.Run(); Console.Write("Press any key to continue..."); Console.ReadKey(true); } } }

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk
Medlem

Problem 1: Du har en antal_passagerare-variabel som är tänkt att hålla reda på hur många passagerare du faktiskt har, men du använder den inte.

Problem 2: Du kan inte skriva ut vilken passagerare som är äldst inne i loopen, vem som är äldst vet du ju först efter loopen när du gått igenom alla passagerare.

Permalänk
Skrivet av perost:

Problem 1: Du har en antal_passagerare-variabel som är tänkt att hålla reda på hur många passagerare du faktiskt har, men du använder den inte.

Problem 2: Du kan inte skriva ut vilken passagerare som är äldst inne i loopen, vem som är äldst vet du ju först efter loopen när du gått igenom alla passagerare.

Tack för svar!

Men hur gör jag för att använda antal_passagerare-variabeln då? Fattar verkligen inte hur jag ska göra för att lagra mina passagerare i den.

Angeånde problem två så har jag flyttat min Console.WriteLine där åldern skrivs ut så den ligger utanför loopen, dock så funkar den ändå inte utan verkar bara ta något slumpat tal och inte det som faktiskt är störst...

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk
Vila i frid
Skrivet av exaaivilo:

Men hur gör jag för att använda antal_passagerare-variabeln då? Fattar verkligen inte hur jag ska göra för att lagra mina passagerare i den.

Ställ dig istället frågan, hur skulle man ha gjort det här i det verkliga livet? Dvs någon form av systemering. Allt blir så mycket enklare att förstå - hur man sen skall göra med koden.

Permalänk
Hedersmedlem

Hej!

Du använder ibland passagerare.Length. Som uppgiften är utformad så är detta inte en metod du ska använda.

passagerare.Length kommer alltid att vara 25, eftersom det är en int-array med storleken 25. Du kan tänka dig arrayen som en representation av själva bussen med 25 platser, numrerade från 0-24. Det säger inget om hur många passagerare som faktiskt finns i bussen.

Istället vill de att du själv ska hålla koll på hur många passagerare du har i bussen, och sedan spara deras ålder i arrayen med längd 25, indexerat med passagerarens löpnummer (börjar på 0). Du måste själv hålla koll på att du inte läser ett värde för en passagerare du inte lagt in, för då får du något odefinierat tillbaka (eller 0, tror jag det blir i ditt fall).

Du måste alltså själv uppdatera antal_passagerare så att den är up to date. Varje gång du lägger till en passagerare så ökar du den siffran, och utifrån hur många passagerare du har vet du också var du ska lagra åldern (på vilken plats i arrayen passagerare.)

Permalänk
Skrivet av pv2b:

Hej!

Du använder ibland passagerare.Length. Som uppgiften är utformad så är detta inte en metod du ska använda.

passagerare.Length kommer alltid att vara 25, eftersom det är en int-array med storleken 25. Du kan tänka dig arrayen som en representation av själva bussen med 25 platser, numrerade från 0-24. Det säger inget om hur många passagerare som faktiskt finns i bussen.

Istället vill de att du själv ska hålla koll på hur många passagerare du har i bussen, och sedan spara deras ålder i arrayen med längd 25, indexerat med passagerarens löpnummer (börjar på 0). Du måste själv hålla koll på att du inte läser ett värde för en passagerare du inte lagt in, för då får du något odefinierat tillbaka (eller 0, tror jag det blir i ditt fall).

Du måste alltså själv uppdatera antal_passagerare så att den är up to date. Varje gång du lägger till en passagerare så ökar du den siffran, och utifrån hur många passagerare du har vet du också var du ska lagra åldern (på vilken plats i arrayen passagerare.)

Okej, nu tror jag poletten trillade ner iaf delvis!

Jag har ändrat överallt till antal_passagerare istället för passagerare.Length, samt lagt till antal_passagerare++ i stycket där man lägger till passagerare.

Det verkar funka bra med medelåldern nu.

Dock fortsatt problem med att den skriver ut alla 25 (alltså med 0) när jag skriver ut alla. Och problem med att max age verkar slumpa?

namespace Buss { class Buss { public int[] passagerare = new int[25]; public int antal_passagerare; public void Run() { Console.WriteLine("Välkommen ombord på bussen!"); int menu; do { Console.WriteLine("Välj ett alternativ: "); Console.WriteLine("1. Lägg till en passagerare. "); Console.WriteLine("2. Kontrollera åldern på passagerarna. "); Console.WriteLine("3. Beräkna den sammanlagda åldern på passagerarna. "); Console.WriteLine("4. Beräkna medelåldern på passagerarna. "); Console.WriteLine("5. Identifiera den äldsta passageraren. "); Console.WriteLine("6. Identifiera alla passagerare mellan 20-30. "); Console.WriteLine("0. Avsluta programmet. "); menu = int.Parse(Console.ReadLine()); switch (menu) { case 1: Add_passenger(); break; case 2: Print_buss(); break; case 3: Calc_total_age(); break; case 4: Calc_average_age(); break; case 5: Max_age(); break; case 6: Find_age(); break; case 0: menu = 0; break; } } while (menu != 0); } public void Add_passenger() { Console.WriteLine("Hur många passagerare vill du lägga till?"); string str1 = Console.ReadLine(); int size = Convert.ToInt32(str1); for (int i = 0; i < size; i++) { Console.WriteLine("Lägg till en passagerare genom att skriva hens ålder: "); string answer = Console.ReadLine();//the user give str an value int nya_passagerare = Convert.ToInt32(answer);//Converting to int passagerare[i] = nya_passagerare; //Adding the value to the array antal_passagerare++; } // Console.WriteLine("\nAlla passagerare har nu klivit på:"); //foreach (int age in passagerare) // Console.WriteLine(age); //Lägg till passagerare. Här skriver man då in ålder men eventuell annan information. //Om bussen är full kan inte någon passagerare stiga på } public void Print_buss() { foreach (var antal_passagerare in passagerare) { Console.WriteLine("Passagerarnas ålder är: " + antal_passagerare); } } public void Calc_total_age() { int sum = 0; for (int i = 0; i < antal_passagerare; i++) { sum += passagerare[i]; } Console.WriteLine("Den sammanlagda åldern på passagerarna är " + sum + "."); //Beräkna den totala åldern. //För att koden ska fungera att köra så måste denna metod justeras, alternativt att man temporärt sätter metoden med void } //Metoder för betyget C public void Calc_average_age() { int sum = 0; for (int i = 0; i < antal_passagerare; i++) { sum += passagerare[i]; } int sum1 = sum / antal_passagerare; Console.WriteLine("Passagerarnas medelålder är " + sum1 + " år."); //Betyg C //Beräkna den genomsnittliga åldern. Kanske kan man tänka sig att denna metod ska returnera något annat värde än heltal? //För att koden ska fungera att köra så måste denna metod justeras, alternativt att man temporärt sätter metoden med void } public void Max_age() { int maxAge = 0; maxAge = passagerare[0]; for (int i = 0; i < antal_passagerare; i++) { if (passagerare[i] > maxAge) { maxAge = passagerare[i]; break; } Console.WriteLine("Den äldsta passageraren är " + maxAge + " år gammal."); } //Betyg C //ta fram den passagerare med högst ålder. Detta ska ske med egen kod och är rätt klurigt. //För att koden ska fungera att köra så måste denna metod justeras, alternativt att man temporärt sätter metoden med void } public void Find_age() { //Visa alla positioner med passagerare med en viss ålder //Man kan också söka efter åldersgränser - exempelvis 55 till 67 //Betyg C //Beskrivs i läroboken på sidan 147 och framåt (kodexempel på sidan 149) } class Program { public static void Main(string[] args) { var minbuss = new Buss(); minbuss.Run(); Console.Write("Press any key to continue..."); Console.ReadKey(true); } } } }

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk
Medlem

public void Print_buss() { foreach (var antal_passagerare in passagerare) { Console.WriteLine("Passagerarnas ålder är: " + antal_passagerare); } }

Här tittar du fortfarande i alla element i arrayen. Istället för att använda antal_passagare för att hålla koll på hur många passagerare här så kallar du varje enskild element i passagerare för antal_passagerare.

Ett rimligare sätt är nog att köra en vanlig for-loop samma antal gånger som antal_passagerare och skriva ut dom elementen istället.

Permalänk
Medlem

public void Max_age() { int maxAge = 0; maxAge = passagerare[0]; for (int i = 0; i < antal_passagerare; i++) { if (passagerare[i] > maxAge) { maxAge = passagerare[i]; break; } Console.WriteLine("Den äldsta passageraren är " + maxAge + " år gammal."); } }

Som ovan talare redan sagt så måste du flytta ut utskrivningen ur loopen. Annars kommer den ju skriva ut hur gammal den äldsta passageraren är varje gång den tittar på en ny passagerare. "break;" har heller ingen funktion här, den ska ju titta igenom alla element.

public void Max_age() { int maxAge = passagerare[0]; foreach (var enPassagerare in passagerare) if (enPassagerare > maxAge) maxAge = enPassagerare; Console.WriteLine("Den äldsta passageraren är " + maxAge + " år gammal."); }

Permalänk
Medlem

Hej!

Du använder två olika sätt att titta igenom dina passagerare i bussen.

Print_buss använder foreach (var antal_passagerare in passagerare)

och

Calc_average_age använder for (int i = 0; i < antal_passagerare; i++)

Varför är det så?

Vad händer i Max_age när en passagerare på en plats har en ålder som är större än det hittills största hittade värdet?
(Vad gör break och när kan du vara säker på att du har hittat den äldsta passageraren ?)

Permalänk
Skrivet av Rådström:

public void Print_buss() { foreach (var antal_passagerare in passagerare) { Console.WriteLine("Passagerarnas ålder är: " + antal_passagerare); } }

Här tittar du fortfarande i alla element i arrayen. Istället för att använda antal_passagare för att hålla koll på hur många passagerare här så kallar du varje enskild element i passagerare för antal_passagerare.

Ett rimligare sätt är nog att köra en vanlig for-loop samma antal gånger som antal_passagerare och skriva ut dom elementen istället.

Ah, förstår. Jag har ändrat nu och nu skriver den ju obviously inte ut hela raddan med passagerare, problemet är dock att jag kan inte få den att skriva ut dem alls?

Ser ut såhär nu:

public void Print_buss() { for (int i = 0; i < antal_passagerare; i++) { Console.WriteLine("Passagerarnas ålder är ", passagerare[i]); } }

Och då skriver dem ut "Passagerarnas ålder är " antalet gånger per passagerare, men inte själva åldern. Har testat att skriva både "antal_passagerare", bara "passagerare" och "{}, i" men jag får det inte att funka.

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk
Medlem

Console.WriteLine("Passagerarnas ålder är " + passagerare[i]);

??

Permalänk
Skrivet av MickeBoy:

Console.WriteLine("Passagerarnas ålder är " + passagerare[i]);

??

Svårt som fan på distans med tveksam kurslitteratur tyvärr.

Har testat detta nu istället och då skriver den ju ut, tyvärr 0 eftersom min int är 0?

public void Print_buss() { int ålder = 0; for (int i = 0; i < antal_passagerare; i++) { Console.WriteLine("Passagerarnas ålder är " + ålder); } }

Måste få in passagerarna i int ålder, tänker jag rätt då eller är det fortfarande helt åt helsike?

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk
Medlem
Skrivet av exaaivilo:

Svårt som fan på distans med tveksam kurslitteratur tyvärr.

Har testat detta nu istället och då skriver den ju ut, tyvärr 0 eftersom min int är 0?

public void Print_buss() { int ålder = 0; for (int i = 0; i < antal_passagerare; i++) { Console.WriteLine("Passagerarnas ålder är " + ålder); } }

Måste få in passagerarna i int ålder, tänker jag rätt då eller är det fortfarande helt åt helsike?

Jag skulle tro att jag har rätt och att du fick 0 för att du inte hade fyllt alla platserna i bussen när du testade?

Permalänk
Skrivet av MickeBoy:

Jag skulle tro att jag har rätt och att du fick 0 för att du inte hade fyllt alla platserna i bussen när du testade?

Jag fyller i i första steget att jag vill ha ex. 3 passagerare, fyller i ålder på dem och det blir ändå 0 när jag kör alternativ 2. Men det är väl för att jag har deklarerat int ålder som 0 eller?

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk
Medlem
Skrivet av exaaivilo:

Jag fyller i i första steget att jag vill ha ex. 3 passagerare, fyller i ålder på dem och det blir ändå 0 när jag kör alternativ 2. Men det är väl för att jag har deklarerat int ålder som 0 eller?

Du deklarerar ålder till 0, men du ändrar aldrig dess värde efter det.

Visa signatur

| EVGA Z170 FTW | i7 6700k | ASUS RTX 3070 | 16GB DDR4 3200MHz | Cooler Master V850 | Samsung 840 Evo 250GB + 2x WD Black 500GB + Seagate 2TB SSHD + Samsung 970 Evo M.2 500GB |

Permalänk
Medlem

@exaaivilo: Din utskriftsfunktion i detta inlägg såg rätt ut, troligtvis ligger problemet någon annanstans. Jag skulle rekommendera att du lär dig använda debuggern, se denna genomgång. Med debuggern kan du sätta en breakpoint i din utskriftsmetod och se exakt vad dina variabler innehåller där, och även stega igenom koden rad för rad och se vad den gör.

Permalänk
Medlem

Vad händer om du lägger till en passagerare och sedan väljer att skriva ut innehållet i bussen?

Vad händer om du lägger till en passagerare, sedan skriver ut innehållet och sedan upprepar detta?

Alltså
1. Lägg till en
2. Skriv ut
3. Lägg till en
4. Skriv ut

Varför blir det som det blir? (Det finns ett fel när du lägger till passagerare för andra gången).

Att fundera på: Vill du skriva ut alla 25 platserna, eller endast de platser där det sitter någon?

Permalänk
Skrivet av perost:

@exaaivilo: Din utskriftsfunktion i detta inlägg såg rätt ut, troligtvis ligger problemet någon annanstans. Jag skulle rekommendera att du lär dig använda debuggern, se denna genomgång. Med debuggern kan du sätta en breakpoint i din utskriftsmetod och se exakt vad dina variabler innehåller där, och även stega igenom koden rad för rad och se vad den gör.

Okej, det såg okej ut ändå, tack! Då borde jag köra på den istället för den med en int age = 0? Försökt använda debuggern men tycker ändå det känns oklart.

Skrivet av MickeBoy:

Vad händer om du lägger till en passagerare och sedan väljer att skriva ut innehållet i bussen?

Vad händer om du lägger till en passagerare, sedan skriver ut innehållet och sedan upprepar detta?

Alltså
1. Lägg till en
2. Skriv ut
3. Lägg till en
4. Skriv ut

Varför blir det som det blir? (Det finns ett fel när du lägger till passagerare för andra gången).

Att fundera på: Vill du skriva ut alla 25 platserna, eller endast de platser där det sitter någon?

Jag har testat detta och det funkar bra? Nu vill den ju inte skriva ut passagerarnas åldrar pga problemet jag försöker lösa, men den skriver ju ut en rad för varje passagerare och det stämmer även om jag gör som du sa, dvs
1. Lägg till en
2. Skriv ut
3. Lägg till en
4. Skriv ut

Jag vill inte skriva ut alla 25 platserna utan bara de platser där det sitter passagerare.

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk
Medlem
Skrivet av exaaivilo:

Okej, det såg okej ut ändå, tack! Då borde jag köra på den istället för den med en int age = 0? Försökt använda debuggern men tycker ändå det känns oklart.

Jag har testat detta och det funkar bra? Nu vill den ju inte skriva ut passagerarnas åldrar pga problemet jag försöker lösa, men den skriver ju ut en rad för varje passagerare och det stämmer även om jag gör som du sa, dvs
1. Lägg till en
2. Skriv ut
3. Lägg till en
4. Skriv ut

Jag vill inte skriva ut alla 25 platserna utan bara de platser där det sitter passagerare.

Och hur ska du kunna göra det, d.v.s. hur håller du koll på hur många passagerare som det finns på bussen?
Jo du har en variabel för det och den behöver vara inblandad i din utskriftsfunktion.

Permalänk
Skrivet av MickeBoy:

Och hur ska du kunna göra det, d.v.s. hur håller du koll på hur många passagerare som det finns på bussen?
Jo du har en variabel för det och den behöver vara inblandad i din utskriftsfunktion.

Den finns ju i min for-loop, och det verkar ju även funka eftersom den skriver ut det antalet jag vill att den ska skriva ut?

Har dessutom fått det att funka nu och det ser ut såhär:

public void Print_buss() { for (int i = 0; i < antal_passagerare; i++) { Console.WriteLine("Passagerarnas ålder är " + passagerare[i]); } }

Tack för hjälp med denna delen!

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk
Medlem
Skrivet av exaaivilo:

Den finns ju i min for-loop, och det verkar ju även funka eftersom den skriver ut det antalet jag vill att den ska skriva ut?

Har dessutom fått det att funka nu och det ser ut såhär:

public void Print_buss() { for (int i = 0; i < antal_passagerare; i++) { Console.WriteLine("Passagerarnas ålder är " + passagerare[i]); } }

Tack för hjälp med denna delen!

Ja så bra. Så vad är det som inte fungerar nu?

Permalänk
Medlem

Hej, ytterligare en nybörjare som behöver hjälp med detta projekt. Min kod fungerar någorlunda men jag har egentligen tre problem.

1. Varför avslutas inte programmet när jag väljer 4?
2. Hur kan jag få texten "Välkommen till busskalkylatorn..." att bara skrivas ut första gången?
3. Calc_total_age() fungerar inte.

Jättetacksam för alla tips jag kan få!

using System; namespace Bussen { class Buss { public int[] passagerare = new int[25]; public int antal_Passagerare; public void Run() { Console.WriteLine("Välkommen till busskalkylatorn"); int val; do { Console.WriteLine("Gör ett val genom att skriva en siffra"); Console.WriteLine("1. Lägg till en passagerare"); Console.WriteLine("2. Summering av åldrar"); Console.WriteLine("3. Beräkning av totalålder"); Console.WriteLine("4. Avsluta programmet"); val = int.Parse(Console.ReadLine()); switch (val) { case 1: Add_passenger(); break; case 2: Print_buss(); break; case 3: Calc_total_age(); break; case 4: val = 4; break; default: Console.WriteLine("Fel inmatning, gör ett val mellan 1-4"); break; } } while (val != 4); } public void Add_passenger() { for (int i = 0; antal_Passagerare < 26; i++) { int val2; do { Console.WriteLine("Hur gammal är passageraren?"); int nyPassagerare = int.Parse(Console.ReadLine()); passagerare[i] = nyPassagerare; antal_Passagerare++; Console.WriteLine("Välj 1 om du vill lägga till en ytterligare passagerare. Välj 2 för att återgå till menyn"); val2 = int.Parse(Console.ReadLine()); switch (val2) { case 1: Add_passenger(); break; case 2: Run(); break; default: Console.WriteLine("Fel inmatning, gör ett val mellan 1-2"); break; } } while (val2 == 2); } } public void Print_buss() { Console.WriteLine("Åldern på passagerarna är: "); for (int i = 0; i < antal_Passagerare; i++) { Console.Write( passagerare[i] + ", "); } Console.WriteLine("\n"); //Skriv ut alla värden ur vektorn. Alltså - skriv ut alla passagerare } public void Calc_total_age() { int total = 0; for (int i = 0; i < antal_Passagerare; i++) { total += passagerare[i]; } Console.WriteLine(total); //Beräkna den totala åldern. } class Program { public static void Main(string[] args) { //Skapar ett objekt av klassen Buss som heter minbuss var minbuss = new Buss(); minbuss.Run(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } } }

Permalänk

Hej igen,

jag är också tillbaka!
Min kod fungerar bra i det stora hela, men tänkte lägga till en bubble sort. Det är alltså metod nr 7, sort_buss jag har problem med.
Har gjort exakt så som det står i vår lärobok, men det funkar inte ändå.

Får följande felmeddelande:
"System.IndexOutOfRangeException: 'Index was outside the bounds of the array.'

Vad är mitt problem? Försökt ändra hit och dit men inget funkar.

using System; using System.Net.NetworkInformation; namespace Buss { class Buss { public int[] passenger = new int[25]; //vektor deklarerad public int new_passengers; //int där vi lägger det vi använder från vektorn public void Run() { Console.WriteLine("---------------------------"); Console.WriteLine("Välkommen ombord på bussen!"); Console.WriteLine("---------------------------"); Console.WriteLine(" "); int menu; //int meny deklareras do { Console.WriteLine("---------------------------"); //menyn användaren ser Console.WriteLine("Välj ett alternativ: "); Console.WriteLine("1. Lägg till en passagerare. "); Console.WriteLine("2. Kontrollera åldern på passagerarna. "); Console.WriteLine("3. Beräkna den sammanlagda åldern på passagerarna. "); Console.WriteLine("4. Beräkna medelåldern på passagerarna. "); Console.WriteLine("5. Identifiera den äldsta passageraren. "); Console.WriteLine("6. Identifiera passagerare i ett valt åldersspann. "); Console.WriteLine("7. Sortera passagerarna efter ålder. "); Console.WriteLine("0. Avsluta programmet. "); Console.WriteLine("---------------------------"); Console.WriteLine(" "); menu = int.Parse(Console.ReadLine()); //översätter vad användaren skriver in till en int switch (menu) //switch case meny { case 1: Add_passenger(); break; case 2: Print_buss(); break; case 3: Calc_total_age(); break; case 4: Calc_average_age(); break; case 5: Max_age(); break; case 6: Find_age(); break; case 7: Sort_buss(); break; case 0: menu = 0; break; } } while (menu != 0); //avslutas! } public void Add_passenger() //metod för att lägga till passagerare { Console.WriteLine("Hur många passagerare vill du lägga till?"); try //try catch för att vi endast vill ha siffror { int size = Convert.ToInt32(Console.ReadLine()); if (size > 25) //endast siffror under 25 är ok { Console.WriteLine("Du kan högst lägga till 25 passagerare. Försök igen."); //annars skrivs detta ut } else //om de skriver siffror under 25 { for (int i = 0; i < size; i++) //så körs for-loopen { Console.WriteLine("Lägg till en passagerare genom att skriva hens ålder: "); int added_passengers = Convert.ToInt32(Console.ReadLine()); //översätt svaret till int och lagra i vår variabel passenger[i] = added_passengers; //lagra i vektorn new_passengers++; //kör om på nytt } } } catch { Console.WriteLine("Du kan endast fylla i passagerarnas ålder! Försök igen."); //visas om de skriver bokstäver } } public void Print_buss() //metod för att skriva ut alla passagerare { for (int i = 0; i < new_passengers; i++) //for-loop som kör igenom alla_passagerare-variabeln { Console.WriteLine("Passagerarnas ålder är " + passenger[i]); //skriver ut passagerarna i vektorn Console.WriteLine(" "); } } public void Calc_total_age() //metod för att räkna alla passagerares ålder { int sum = 0; for (int i = 0; i < new_passengers; i++) //for-loop som kör igenom alla_passagerare-variabeln { sum += passenger[i]; //läser in passagerarna från vektorn & adderar och lägger in i variabeln sum } Console.WriteLine("Den sammanlagda åldern på passagerarna är " + sum + "."); Console.WriteLine(" "); } public void Calc_average_age() //metod för att räkna ut medelåldern { int sum = 0; for (int i = 0; i < new_passengers; i++) //for-loop som kör igenom alla_passagerare-variabeln { sum += passenger[i]; //läser in passagerarna från vektorn & adderar och lägger in i variabeln sum } double dsum = Convert.ToDouble(sum); //översätter till en double double dsum1 = dsum / new_passengers; //räknar ut medelåldern Console.WriteLine("Passagerarnas medelålder är " + dsum1 + " år."); Console.WriteLine(" "); } public int Max_age() //metod för att räkna ut maxåldern { int maxAge = 0; //ny variabel for (int i = 0; i < new_passengers; i++) //for-loop som kör igenom alla_passagerare-variabeln { if (passenger[i] > maxAge) { maxAge = passenger[i]; //lägger alla i vektorn i variabeln maxAge } } Console.WriteLine("Den äldsta passageraren är " + maxAge + " år gammal."); Console.WriteLine(" "); return maxAge; } public void Find_age() { { Console.WriteLine("Vilken är den lägsta åldern du vill ha i sökspannet?"); //användaren får välja lägsta ålder int low = Convert.ToInt32(Console.ReadLine()); //lagrar i int Console.WriteLine("Vilken är den högsta åldern du vill ha i sökspannet?"); int high = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Passagerarna mellan " + low + " och " + high + " sitter på: "); for (int i = 0; i < new_passengers; i++) //for-loop som kör igenom alla_passagerare-variabeln { if (passenger[i] > low || passenger[i] > high) //identifierar spannet { Console.WriteLine("Säte " + i); //skriver ut sätesnumren } } Console.WriteLine(" "); Console.WriteLine("OBS; Det finns 25 säten och de är numrerade mellan 0-24."); //pga att det börjar på noll... } } public void Sort_buss() { int max = passenger.Length - 1; for (int i = 0; i < max; i++) { int nrLeft = max - i; for (int j = 0; i < nrLeft; j++) { if (passenger[j] > passenger[j + 1]) { int temp = passenger[j]; passenger[j] = passenger[j + 1]; passenger[j + 1] = temp; } } } for (int i = 0; i < passenger.Length; i++) Console.WriteLine(passenger[i]); } class Program { public static void Main(string[] args) //programmetoden { var minbuss = new Buss(); //programmet minbuss.Run(); //körs Console.Write("Press any key to continue..."); Console.ReadKey(true); } } } }

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk
Medlem
Skrivet av Olsv:

1. Varför avslutas inte programmet när jag väljer 4?
2. Hur kan jag få texten "Välkommen till busskalkylatorn..." att bara skrivas ut första gången?

I Add_passenger så anropar du Run() när du vill gå tillbaka till menyn istället för att bara returnera från metoden. När du sedan väljer 4 i menyn så avslutas inte programmet utan du hoppar tillbaka till Add_passenger igen, som sedan avslutar eftersom ditt villkor i do-while-loopen är fel, vilket gör att programmet till slut hoppar tillbaka till det ursprungliga anropet av Run.

Vad du borde göra är att bara returnera från Add_passenger när du vill gå tillbaka till menyn, lämpligtvis genom att bara låta metoden nå sitt slut. Du måste dock fixa villkoret i loopen som sagt, just nu fortsätter du så länge användaren matar in 2 vilket är motsatsen till vad du vill göra.

Tillägg: Missade att du även anropar Add_passenger från sig själv när du vill lägga till en till passagerare. Även detta är något du bör undvika, du har ju en loop i den metoden som sköter den biten. Det enda du behöver göra efter att användaren fått välja 1 eller 2 är att kontrollera att användaren faktiskt matade in 1 eller 2, att fortsätta eller avsluta sköter ju villkoret i loopen själv.

Skrivet av Olsv:

3. Calc_total_age() fungerar inte.

På vilket sätt? Det enda felet jag kan se direkt är att Add_passenger alltid börjar fylla "bussen" från början istället för från nästa tomma plats, så du kommer skriva över passagerare om du anropar den metoden flera gånger.

Permalänk
Medlem

@exaaivilo: Den här loopen kommer aldrig avsluta: for (int j = 0; i < nrLeft; j++). Jag lämnar det som en uppgift till dig att klura ut varför

Permalänk
Skrivet av perost:

@exaaivilo: Den här loopen kommer aldrig avsluta: for (int j = 0; i < nrLeft; j++). Jag lämnar det som en uppgift till dig att klura ut varför

Haha, okej... Vilket slarvfel, tack för hjälpen. Nu funkar det finfint!

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk
Medlem
Skrivet av perost:

I Add_passenger så anropar du Run() när du vill gå tillbaka till menyn istället för att bara returnera från metoden. När du sedan väljer 4 i menyn så avslutas inte programmet utan du hoppar tillbaka till Add_passenger igen, som sedan avslutar eftersom ditt villkor i do-while-loopen är fel, vilket gör att programmet till slut hoppar tillbaka till det ursprungliga anropet av Run.

Vad du borde göra är att bara returnera från Add_passenger när du vill gå tillbaka till menyn, lämpligtvis genom att bara låta metoden nå sitt slut. Du måste dock fixa villkoret i loopen som sagt, just nu fortsätter du så länge användaren matar in 2 vilket är motsatsen till vad du vill göra.

Tillägg: Missade att du även anropar Add_passenger från sig själv när du vill lägga till en till passagerare. Även detta är något du bör undvika, du har ju en loop i den metoden som sköter den biten. Det enda du behöver göra efter att användaren fått välja 1 eller 2 är att kontrollera att användaren faktiskt matade in 1 eller 2, att fortsätta eller avsluta sköter ju villkoret i loopen själv.
På vilket sätt? Det enda felet jag kan se direkt är att Add_passenger alltid börjar fylla "bussen" från början istället för från nästa tomma plats, så du kommer skriva över passagerare om du anropar den metoden flera gånger.

Tack! Men jag behöver alltså inte använda mig av switch/case för att kunna loopa fi metoden? Efter att en ålder har registrerats så vill jag fråga om en ytterligare ålder ska registreras eller inte. Så antingen ska Add_passenger köras igen eller att användaren ska återgå till första menyn. Är det möjligt genom en do-while? Eller behöver jag tänka om ang upplägget av det jag vill ska ske?

Permalänk
Vila i frid
Skrivet av Olsv:

Eller behöver jag tänka om ang upplägget av det jag vill ska ske?

Kan man inte beskriva hur det är tänkt att fungera är det svårt att skriva kod för det. Först systemera, sen programmera. Detaljerna ger sig automagiskt.

Permalänk
Medlem

Nu behöver jag hjälp med en sista sak som jag inte får till. Finns säkert en väldigt enkel lösning men jag lyckas inte. Jag behöver kontrollera att antalet passagerare inte överskrider 25. Har försökt att lägga in en do-while loop men det fungerar inte. Något tips om vad som är fel? Tack!

public void Add_passenger() { do { int antal; Console.WriteLine("Hur många passagerare vill du lägga till?"); antal = int.Parse(Console.ReadLine()); for (int i = 0; antal_Passagerare < antal; i++) { Console.WriteLine("Hur gammal är passageraren?"); int nyPassagerare = int.Parse(Console.ReadLine()); passagerare[i] = nyPassagerare; antal_Passagerare++; Console.WriteLine(antal_Passagerare); } if (antal_Passagerare >= 25) { Console.WriteLine("Bussen är nu full"); } } while (antal_Passagerare <= 25); }

När jag lägger till fler än 25 så går den tillbaka till "Hur många passagerare vill du lägga till?"

Permalänk
Vila i frid
Skrivet av Olsv:

När jag lägger till fler än 25 så går den tillbaka till "Hur många passagerare vill du lägga till?"

Eftersom "antal_Passagerare" aldrig kan bli högre än 25 kommer villkoret aldrig att uppfyllas för att komma ur while-loopen.