Permalänk
Medlem

Programmering 1 C# Bussen

Hej!

Jag har som många andra fastnat lite i mitt slutprojekt Bussen.
Jag har lusläst varenda tråd om det i forumet och testat mig fram men får inte riktigt till det.
Jag är rädd för att jag har krånglat till det för mig själv alldeles för mycket med onödig kod.
Om någon har lust att titta på min kod och hjälpa mig förstå var det gått fel så vore jag tacksam vill verkligen lära mig!

Mina frågeställningar är:
1. jag har ett max antal platser på min buss som är 25. I metoden calc_total_age vill jag att programmet ska addera samtliga passagerares ålder. Behöver jag deklarera ytterligare en int i Buss som håller koll på hur många platser som tas upp eller kan jag använda mig av buss_seats?
Om jag vill att programmet ska säga till att det är fullt på bussen när användaren försöker lägga till fler än 25 passagerare i metoden add_passenger, bör jag ha en if sats eller en foreach som går igenom den eventuella nya int:en?

Tack så hemskt mkt på förhand!!!

using System; namespace Buss { class Program { public static void Main(string[] args) { var miniBuss = new Buss(); miniBuss.run(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } class Passenger { private int age; private string gender; private string paymentMethod; private string ageGroup; public Passenger(int _age, string _gender, string _paymentMethod, string _ageGroup) // Constructor sätter information om passageraeren // tar emot info från add_passenger { age = _age; gender = _gender; paymentMethod = _paymentMethod; ageGroup = _ageGroup; } public override string ToString() // omvandla tecken till skicka information om passagerare till metoden print_buss { return string.Format($"Denna passagerare finns på bussen:\n Ålder:{age} \n Kön: {gender} \n Betalsätt: {paymentMethod} \n Yrkesklass: {ageGroup}"); } public int GetAge() { return age; } } class Buss { private int buss_seats = 25; // Max antal sittplatser private int passenger = 0; private Passenger[] passenger_info; // Vektor lagrar information om passageraren public void run() { int menu = 4; do // Skapar en loop som går runt med 4st alternativ som leder vidare till metoder { Console.WriteLine("-----------------------------------------"); Console.WriteLine("|Hej busschaufför, vänligen gör ett val:|"); Console.WriteLine("| |"); Console.WriteLine("|1. Visa alla passagerare. |"); Console.WriteLine("|2. Lägg till passagerare. |"); Console.WriteLine("|3. Visa total ålder på passagerare. |"); Console.WriteLine("|4. Avsluta programmet. |"); Console.WriteLine("-----------------------------------------"); do { try { menu = int.Parse(Console.ReadLine()); } catch // Om användaren anger input annat än siffror { Console.WriteLine("Fel format, vänligen ange ett val mellan 1-4"); } } while (menu !=4); // loopar så länge input är felaktig switch (menu) // Knappvalen användaren gör leder till olika metoder/case { case 1: print_info(); break; case 2: add_passenger(); break; case 3: Calc_total_age(); break; case 4: Console.WriteLine(" Programmet avslutas, hejdå! "); break; default: Console.WriteLine("Felaktig inmatning, vänligen ange en siffra mellan 1-4"); break; } } while (menu != 4); // Loopar så länge användaren inte väljer menyval 4 som avslutar } public void print_info() { foreach (var platser in passenger_info) // Går igenom hela vektorn Passenger_info och skriver ut det som finns lagrat { if (platser != 0) { Console.WriteLine(platser); } } } public void add_passenger() { {// Skapar bools för att kontrollera så att användarens input är i rätt format och datatyper som spar inputen bool validAge = false; bool validGender = false; bool validageGroup = false; bool validPaymentMethod = false; int ageInput = 0; string genderInput = ""; string ageGroupInput = ""; string paymentMethodInput = ""; Console.WriteLine("Lägg till passagerare: "); while (!validAge) { Console.Clear(); Console.WriteLine("Ålder:"); try { ageInput = int.Parse(Console.ReadLine()); validAge = true; } catch { Console.WriteLine("Felaktig input, vänligen ange heltal"); } while (!validGender) { Console.WriteLine("Välj kön: \n Kvinna = K \n Man = M\n Okänd = O"); switch (Console.ReadLine().ToLower()) { case "k": genderInput = "Kvinna"; validGender = true; break; case "m": genderInput = "Man"; validGender = true; break; case "o": genderInput = "Okänd"; validGender = true; break; default: Console.WriteLine("felaktig input"); validGender = false; break; } } while (!validageGroup) { Console.WriteLine("Välj åldersgrupp:\n Barn = B \n Ungdom = U \n Vuxen = V \n Pensionär = P \n"); switch (Console.ReadLine().ToLower()) { case "b": ageGroupInput = "Barn"; validageGroup = true; break; case "u": ageGroupInput = "Ungdom"; validageGroup = true; break; case "v": ageGroupInput = "Vuxen"; validageGroup = true; break; case "p": ageGroupInput = "Pensionär"; validageGroup = true; break; default: Console.WriteLine("Felaktig input"); validageGroup = false; break; } } while (!validPaymentMethod) { Console.WriteLine("Välj betalsätt: \n Månadskort = M\n Reskassa = R\n Bankkort = B\n Plankare = P\n"); switch (Console.ReadLine().ToLower()) { case "m": paymentMethodInput = "Månadskort"; validPaymentMethod = true; break; case "r": paymentMethodInput = "Reskassa"; validPaymentMethod = true; break; case "b": paymentMethodInput = "Bankkort"; validPaymentMethod = true; break; case "p": paymentMethodInput = "Plankare"; validPaymentMethod = true; break; default: Console.WriteLine("Felaktig input"); validPaymentMethod = false; break; } } for (int i = 0; i < buss_seats; i++) { if (passenger_info[i] == 0) { passenger_info[passenger++] = new Passenger(ageInput, genderInput, ageGroupInput, paymentMethodInput); break; } } } } } public void Calc_total_age() { int sum = 0; for (int i =0; i<passenger; i++) { sum += passenger[i]; } Console.WriteLine("Den totala åldern för passagerarna är" + sum + ":"); (if passenger == 0) Console.WriteLine("Det är tom på bussen"); } } }

Permalänk
Medlem

Du har redan en variabel för att hålla reda på antalet passagerare, passenger, men du använder den inte korrekt eller konsekvent. Jag skulle föreslå att du döper om den till något mer passande som t.ex. passenger_count så att det är tydligare vad den faktiskt är till för, och så bör du förstås gå igenom din koden och se till att du använder variabeln överallt där du bara vill gå igenom platserna som är fyllda.

Lite andra saker du kan fundera på:

  • Du har en extra { i början av add_passenger som inte fyller något syfte, ta bort den och motsvarande }.

  • Du avslutar inte loopen för att läsa in ålder korrekt, så om användaren matar in en felaktig ålder så körs resten av metoden ändå.

  • Du kan korta ner koden en hel del om du tar bort validAge, validGender, o.s.v., och istället loopar så länge motsvarande variabel t.ex. är en tom sträng.

Permalänk
Medlem

Tusen tack för input!
När du menar att jag kan plocka bort mina validInputs, menar du att det är bättre att ersätta med foreach som lopar igenom vektorn istället?

Permalänk
Medlem

Har du verkligen kört den här koden?

För som jag läser det kommer du aldrig ur do-while för att välja något ur menyn ens, om du inte väljer 4 och då avslutas programmet.

Ett annat generellt tips, när man är osäker på egen logik eller om man hittat kod på nätet, debugga genom att skriva ut allt du räknar ut eller mer avancerat med breakpoints. Ska du räkna ut x * y + c, skriv ut x, y och c och inte bara svaret. Blev något värde konstigt så fundera på varför?

Permalänk
Medlem
Skrivet av evelinan:

När du menar att jag kan plocka bort mina validInputs, menar du att det är bättre att ersätta med foreach som lopar igenom vektorn istället?

Nej, jag menar att istället för t.ex. while (!validGender) så kan du använda while (genderInput == "").

Permalänk
Medlem
Skrivet av wargreymon:

Har du verkligen kört den här koden?

För som jag läser det kommer du aldrig ur do-while för att välja något ur menyn ens, om du inte väljer 4 och då avslutas programmet.

Ett annat generellt tips, när man är osäker på egen logik eller om man hittat kod på nätet, debugga genom att skriva ut allt du räknar ut eller mer avancerat med breakpoints. Ska du räkna ut x * y + c, skriv ut x, y och c och inte bara svaret. Blev något värde konstigt så fundera på varför?

Hej,
Nej, jag märkte nu att mitt Visual studio fastnat i något konstigt läge så att det hela tiden gick att köra oavsett ändringar jag gjorde.
startade sedan om och fick samma fel, fastna i do-while.
Måste ha gjorde något konstigt sedan jag sparade sist som jag försöker lösa nu