Permalänk
Medlem

C# Bussen

Hej!

Är ny på programmering. Har i likhet med ett flertal andra trådskapare fått Bussen som slutprojekt i den kurs jag läser. Är i stort nöjd med hur jag får koden att funka så här långt, men en sak begriper jag inte.

Min fundering rör menyval 3 i koden: calc_total_age.
Om jag definierar metoden så här: "public void calc_total_age" så funkar det utmärkt men enligt instruktionen till uppgiften är detta sätt inte att föredra.

Om jag istället definierar metoden så som jag tror är mer "korrekt": "public int calc_total_age" så slutar menyval 3 att fungera. Det händer ingenting när menyvalet är markerat och jag trycker Enter. Antar att det har nåt med metodanropet att göra och har provat lite olika sätt att anropa metoden men utan att lyckas.

Skulle vara så tacksam om nån kan ha överseende med den långa koden och hjälpa mig förstå vad som blir fel. Är det metodanropet eller nåt annat? Hjälp!

using System; using System.Collections.Generic; namespace Bussen { class Buss { public int [] passagerare = new int[25]; public int maxPassagerare = 25; public int antal_passagerare = 0; public void Run() { string[] menuOptions = new string[] {"\t1) Lägg till passagerare", "\t2) Skriv ut passagerarlista", "\t3) Beräkna passagerarnas totala ålder", "\t4) Beräkna passagerarnas medelålder", "\t5) Skriv ut passagerare med högst ålder", "\t6) Sök passagerare efter ålder", "\t7) Sortera passagerare efter ålder", "\t*** Avsluta ***"}; int menuSelected = 0; while (true) { Console.Clear(); Console.WriteLine(); Console.WriteLine("====================================== BUSSEN ============================================="); Console.WriteLine("\n - Statistikprogram över resenärerna på Linje 1 -\n"); Console.WriteLine(" Ett delprojekt i Ängköping kommuns utvärdering av gratis kollektivtrafik.\n"); Console.Write("==========================================================================================\n\n"); Console.CursorVisible = false; if (menuSelected == 0) { Console.WriteLine("-->" + menuOptions[0] + "\n"); Console.WriteLine(menuOptions[1] + "\n"); Console.WriteLine(menuOptions[2] + "\n"); Console.WriteLine(menuOptions[3] + "\n"); Console.WriteLine(menuOptions[4] + "\n"); Console.WriteLine(menuOptions[5] + "\n"); Console.WriteLine(menuOptions[6] + "\n"); Console.WriteLine(menuOptions[7] + "\n"); } else if (menuSelected == 1) { Console.WriteLine(menuOptions[0] + "\n"); Console.WriteLine("-->" + menuOptions[1] + "\n"); Console.WriteLine(menuOptions[2] + "\n"); Console.WriteLine(menuOptions[3] + "\n"); Console.WriteLine(menuOptions[4] + "\n"); Console.WriteLine(menuOptions[5] + "\n"); Console.WriteLine(menuOptions[6] + "\n"); Console.WriteLine(menuOptions[7] + "\n"); } else if (menuSelected == 2) { Console.WriteLine(menuOptions[0] + "\n"); Console.WriteLine(menuOptions[1] + "\n"); Console.WriteLine("-->" + menuOptions[2] + "\n"); Console.WriteLine(menuOptions[3] + "\n"); Console.WriteLine(menuOptions[4] + "\n"); Console.WriteLine(menuOptions[5] + "\n"); Console.WriteLine(menuOptions[6] + "\n"); Console.WriteLine(menuOptions[7] + "\n"); } else if (menuSelected == 3) { Console.WriteLine(menuOptions[0] + "\n"); Console.WriteLine(menuOptions[1] + "\n"); Console.WriteLine(menuOptions[2] + "\n"); Console.WriteLine("-->" + menuOptions[3] + "\n"); Console.WriteLine(menuOptions[4] + "\n"); Console.WriteLine(menuOptions[5] + "\n"); Console.WriteLine(menuOptions[6] + "\n"); Console.WriteLine(menuOptions[7] + "\n"); } else if (menuSelected == 4) { Console.WriteLine(menuOptions[0] + "\n"); Console.WriteLine(menuOptions[1] + "\n"); Console.WriteLine(menuOptions[2] + "\n"); Console.WriteLine(menuOptions[3] + "\n"); Console.WriteLine("-->" + menuOptions[4] + "\n"); Console.WriteLine(menuOptions[5] + "\n"); Console.WriteLine(menuOptions[6] + "\n"); Console.WriteLine(menuOptions[7] + "\n"); } else if (menuSelected == 5) { Console.WriteLine(menuOptions[0] + "\n"); Console.WriteLine(menuOptions[1] + "\n"); Console.WriteLine(menuOptions[2] + "\n"); Console.WriteLine(menuOptions[3] + "\n"); Console.WriteLine(menuOptions[4] + "\n"); Console.WriteLine("-->" + menuOptions[5] + "\n"); Console.WriteLine(menuOptions[6] + "\n"); Console.WriteLine(menuOptions[7] + "\n"); } else if (menuSelected == 6) { Console.WriteLine(menuOptions[0] + "\n"); Console.WriteLine(menuOptions[1] + "\n"); Console.WriteLine(menuOptions[2] + "\n"); Console.WriteLine(menuOptions[3] + "\n"); Console.WriteLine(menuOptions[4] + "\n"); Console.WriteLine(menuOptions[5] + "\n"); Console.WriteLine("-->" + menuOptions[6] + "\n"); Console.WriteLine(menuOptions[7] + "\n"); } else if (menuSelected == 7) { Console.WriteLine(menuOptions[0] + "\n"); Console.WriteLine(menuOptions[1] + "\n"); Console.WriteLine(menuOptions[2] + "\n"); Console.WriteLine(menuOptions[3] + "\n"); Console.WriteLine(menuOptions[4] + "\n"); Console.WriteLine(menuOptions[5] + "\n"); Console.WriteLine(menuOptions[6] + "\n"); Console.WriteLine("-->" + menuOptions[7] + "\n"); } var keyPressed = Console.ReadKey(); if (keyPressed.Key == ConsoleKey.DownArrow && menuSelected != menuOptions.Length -1) { menuSelected++; } else if (keyPressed.Key == ConsoleKey.UpArrow && menuSelected >= 1) { menuSelected--; } else if (keyPressed.Key == ConsoleKey.Enter) { switch (menuSelected) { case 0: add_passenger(); break; case 1: print_buss(); break; case 2: calc_total_age(); break; case 3: FourthChoise(); break; case 4: max_age(); break; case 5: find_age(); break; case 6: sort_buss(); break; case 7: EighthChoise(); break; } } } } public void add_passenger() //Method for menu choice 1 { Console.Clear(); Console.CursorVisible = true; Console.WriteLine("====================================== LÄGG TILL PASSAGERARE ===========================================\n"); Console.WriteLine("Här registreras nya passagerare."); Console.WriteLine("O.B.S! Små barn som inte upptar en egen plats ska inte registreras.\n"); // Use Do-while loop and bool so user can try again if other than numbers was printed bool loop = true; do { Console.Write("Ange antal nya passagerare: "); string strKliverPa = Console.ReadLine(); //Use try/catch to make sure user only print numbers try { // Convert string to int int kliverPa = Convert.ToInt32(strKliverPa); // If statement to check so that new passengers can be accommodated on the bus if (antal_passagerare + kliverPa > maxPassagerare) { Console.WriteLine("\nDet ryms bara 25 passagerare. Det finns just nu " + (maxPassagerare - antal_passagerare) + " lediga platser."); if((maxPassagerare - antal_passagerare) == 0) loop = false; } else if (kliverPa == 0) { Console.WriteLine("\nInga nya passagerare klev på."); loop = false; } else { Console.WriteLine("\n{0} nya passagerare har klivit på bussen.",kliverPa); antal_passagerare = antal_passagerare + kliverPa; for (int i = 0; i < kliverPa; i++) { Console.Write("\nAnge person " + (i+1) + ":s ålder: "); int age = Convert.ToInt32(Console.ReadLine()); if (age > 0) { for (int j = 0; j < passagerare.Length; j++) { if (passagerare[j] == 0) { passagerare[j] = age; break; } } loop = false; } else { Console.WriteLine("\nSå små barn behöver inte registreras. Barnet kommer inte att läggas till som passagerare."); loop = false; } } } } catch { Console.WriteLine("\nDu behöver ange värdet med siffror! Prova igen."); } } while (loop); Console.WriteLine("\n\n\nTryck Enter för att gå tillbaka till menyn."); Console.ReadKey(); Console.Clear(); } public void print_buss() //Method for menu choice 2 { Console.Clear(); Console.CursorVisible = true; Console.WriteLine("==================================== SKRIV UT PASSAGERARLISTA ==========================================\n"); Console.WriteLine("Nedan visas antal passagerare i bussen och deras åldrar:\n"); Console.WriteLine("----------------------------------------------------"); if (antal_passagerare == 0) { Console.WriteLine("\nDet finns inga passagerare. \nGå tillbaka till menyn och välj menyval 1 för att lägga till passagerare."); } else { for (int i = 0; i < antal_passagerare; i++) { if(passagerare[i] > 0) { Console.WriteLine("Passagerare " + (i+1) + ": " + passagerare[i] + " år"); Console.WriteLine("----------------------------------------------------"); } } } Console.WriteLine("\n\n\nTryck Enter för att gå tillbaka till menyn."); Console.ReadKey(); Console.Clear(); } public int calc_total_age() // Method for menu choice 3 { Console.Clear(); Console.CursorVisible = true; Console.WriteLine("================================= PASSAGERARNAS TOTALA ÅLDER =======================================\n"); int totalAge = 0; // Variable for total age if (antal_passagerare == 0) { Console.WriteLine("\nDet finns inga passagerare. \nGå tillbaka till menyn och välj menyval 1 för att lägga till passagerare."); } else { // For loop to sum up the ages of the passengers for (int i = 0; i < antal_passagerare; i++) { totalAge = totalAge + passagerare[i]; } Console.WriteLine("Passagerarnas totala ålder är {0} år.", totalAge); } return totalAge; Console.WriteLine("\n\n\nTryck Enter för att gå tillbaka till menyn."); Console.ReadKey(); } static void FourthChoise() { Console.Clear(); Console.WriteLine("\nFjärde Valet"); Console.WriteLine("Tryck Enter för att gå tillbaka till menyn."); Console.ReadKey(); } public void max_age() { Console.Clear(); Console.CursorVisible = true; Console.WriteLine("====================================== ÄLDSTA PASSAGERAREN =======================================\n"); int oldest = 0; if(antal_passagerare == 0) { Console.WriteLine("Det finns inga passagerare. \nGå tillbaka till menyn och välj menyval 1 för att lägga till passagerare."); } else { for (int i = 0; i < antal_passagerare; i++) { if (passagerare[i] > oldest) { oldest = passagerare[i]; } } Console.WriteLine("Den äldsta passageraren är {0} år.", oldest); } //return oldest??? BEHÖVER RETURVÄRDE? VAR SKA DET IN? Console.WriteLine("\n\n\nTryck Enter för att gå tillbaka till menyn."); Console.ReadKey(); } public void find_age() { Console.Clear(); Console.WriteLine("\nSjätte Valet"); Console.WriteLine("Tryck Enter för att gå tillbaka till menyn."); Console.ReadKey(); } public void sort_buss() { Console.Clear(); Console.CursorVisible = true; Console.WriteLine("==================================== ÅLDERSSORTERA PASSAGERARE =========================================\n"); if(antal_passagerare == 0) { Console.WriteLine("Det finns inga passagerare att sortera. \nGå tillbaka till menyn och välj menyval 1 för att lägga till passagerare."); } else { // Variable for needed number of loops to get array sorted int max = antal_passagerare - 1; for (int i = 0; i < max; i++) { int nrLeft = max - i; for (int j = 0; j < nrLeft; j++) { if (passagerare[j] > passagerare[j+1]) { // Switch place int temp = passagerare[j]; passagerare[j] = passagerare[j+1]; passagerare[j+1] = temp; } } } //Print age sorted list Console.WriteLine("\nHär är passagerarna sorterade i åldersordning, yngst till äldst:\n"); for (int i = 0; i < antal_passagerare; i++) { if (passagerare[i] > 0) { Console.Write(passagerare[i] + " | "); } } } Console.WriteLine("\n\n\nTryck Enter för att gå tillbaka till menyn."); Console.ReadKey(); } static void EighthChoise() { Console.Clear(); Console.WriteLine("\nDu har valt att avsluta programmet. "); Console.WriteLine("Tryck Enter för att fortsätta."); Console.ReadKey(); Environment.Exit(1); }

Dold text
La till code och spoiler-taggar
Permalänk
Medlem

Skillnaden mellan

public int calc_total_age

och

public void calc_total_age

är att den första måste returnera ett värde av typen int, medan den andra inte förväntas returnera något värde alls.

Om man skriver att det förväntade sättet är att returnera ett värde så har man förmodligen tänkt sig att du endast ska göra själva uträkningen i metoden och alltså inte skriva ut den på skärmen också som du gör nu.

Permalänk
Medlem

Problemet är att du placerat return-satsen i calc_total_age fel, den bör ligga sist i metoden. Nu har du istället kod efter return-satsen som aldrig kommer köras (så kallad "död kod"), eftersom metoden avslutas direkt när den kommer till return.

Så du kan fixa problemet genom att flytta ner return-satsen så att Console.ReadKey() körs så att du faktiskt kan se vad som skrivs ut innan du återgår till menyn. Men poängen är nog som sagt att metoden inte ska skriva ut resultatet själv, eftersom det i så fall blir lite meningslöst att returnera det.

Sen bör du nog fundera lite på hur du kan skriva ut menyn på ett bättre sätt än att använda en gigantisk if-sats, du kan göra samma sak med en bråkdel så mycket kod om du istället använder t.ex. en for-loop.

Permalänk
Medlem

TACK! =)

Tusen tack för hjälpen!
Nu får jag koden att funka. Håller på att snygga till den lite efter era tips också.

Permalänk
Medlem

Använd code taggar för att göra det enklare att läsa

Det är vanligt i början att göra som du gör med

if (menuSelected == 0) { Console.WriteLine("-->" + menuOptions[0] + "\n"); Console.WriteLine(menuOptions[1] + "\n"); Console.WriteLine(menuOptions[2] + "\n"); Console.WriteLine(menuOptions[3] + "\n"); Console.WriteLine(menuOptions[4] + "\n"); Console.WriteLine(menuOptions[5] + "\n"); Console.WriteLine(menuOptions[6] + "\n"); Console.WriteLine(menuOptions[7] + "\n"); } else if (menuSelected == 1) ... ... ... else if (menuSelected == 7) { Console.WriteLine(menuOptions[0] + "\n"); Console.WriteLine(menuOptions[1] + "\n"); Console.WriteLine(menuOptions[2] + "\n"); Console.WriteLine(menuOptions[3] + "\n"); Console.WriteLine(menuOptions[4] + "\n"); Console.WriteLine(menuOptions[5] + "\n"); Console.WriteLine(menuOptions[6] + "\n"); Console.WriteLine("-->" + menuOptions[7] + "\n"); }

Men ett mycket enklare sätt är att använda en loop och innan du skriver ut varje "menuOption" kolla ifall "menuSelected" matchar "menuOptions" index.

for (int i = 0; i < menuOptions.Length(); i++) { if(menuSelected == i){ Console.Write("-->"); } Console.WriteLine(menuOptions[i]); }

Dold text
Permalänk
Inaktiv

En annan bra grej kan vara att (där det är möjljgt) skippa else if och köra if helt enkelt, snyggare och lättare att läsa.