Ytterligare en nybörjare med "Bussen" i C#

Permalänk

Ytterligare en nybörjare med "Bussen" i C#

Hej!

Till den som eventuellt orkar läsa igenom min kod så håller jag på med slutuppgiften "Bussen" i programmering 1 på distans. Jag är nästan färdig med koden, men har ett problem jag ännu inte lyckats lösa. I metoden "add passengers" vill jag att om man fyller i felaktig information så ska inte denna info lagras, utan man ska få fylla i passagerarens info på nytt. Får inte det till att funka på ett smidigt sätt, är det någon som har tips? Ser koden bra ut för övrigt eller finns det förbättringsförslag jag inte tänkt på? Har inte heller lagt till kommentarer än.

Tacksam för eventuell feedback!

using System; using System.Collections.Generic; namespace Bussen { class Person { private int ålder; private string kön; public int Ålder { get { return ålder; } set { if (value >= 0) { ålder = value; } else { Console.WriteLine("Åldern kan inte vara negativ."); } } } public string Kön { get { return kön; } set { string lowercaseValue = value.ToLower(); if (lowercaseValue == "man" || lowercaseValue == "kvinna") { kön = lowercaseValue; } else { Console.WriteLine("Ogiltigt kön. Du måste fylla i antingen 'man' eller 'kvinna'."); } } } } class Buss { private List<Person> passagerare; private int antal_passagerare; public Buss() { passagerare = new List<Person>(); } public void Run() { Console.WriteLine("Welcome to the awesome Buss-simulator"); Console.WriteLine("Vänligen välj ett av alternativen ur menyn."); Console.WriteLine("Använd endast siffror."); Console.WriteLine(""); int meny; do { Console.WriteLine("1. Lägg till passagerare "); Console.WriteLine("2. Skriv ut alla bussens passagerare "); Console.WriteLine("3. Beräkna den totala åldern på bussens passagerare "); Console.WriteLine("4. Beräkna den genomsnittliga åldern på bussens passagerare "); Console.WriteLine("5. Visa åldern på bussens äldsta passagerare "); Console.WriteLine("6. Sök efter passagerare i en viss ålder "); Console.WriteLine("7. Sortera bussen efter passagerarnas åldrar "); Console.WriteLine("8. Ta reda på passagerarnas kön "); Console.WriteLine("9. Låt en passagerare stiga av bussen "); Console.WriteLine("10. Avsluta programmet "); meny = Convert.ToInt32(Console.ReadLine()); switch (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 8: print_sex(); break; case 9: getting_off(); break; case 10: meny = 0; break; default: Console.WriteLine("Felaktig inmatning. Skriv endast heltal mellan 1-10."); break; } } while (meny != 10); } public void add_passenger() { Console.Clear(); Console.WriteLine("Hur många passagerare vill du lägga till? "); Console.WriteLine("Du kan högst lägga till 25 passagerare. "); try { int säten = Convert.ToInt32(Console.ReadLine()); if (säten > 25) { Console.WriteLine("Max antal passagerare är 25. Vänligen försök igen. "); } else { for (int i = 0; i < säten; i++) { Console.WriteLine("För att lägga till en ny passagerare så fyller du i passagerarens ålder samt kön. "); Console.Write("Ålder: "); int ålder = Convert.ToInt32(Console.ReadLine()); Console.Write("Kön: "); string kön = Console.ReadLine(); passagerare.Add(new Person {Ålder = ålder, Kön = kön }); antal_passagerare++; } } } catch { Console.WriteLine("Du kan endast lägga till en passagerare i taget genom att fylla i passagerarens ålder och sedan kön."); Console.WriteLine("Använd endast heltal för att fylla i åldern."); } } public void print_buss() { Console.Clear(); Console.WriteLine("Här är listan på bussens passagerare: "); if (antal_passagerare == 0) { Console.WriteLine("Det finns inga passagerare på bussen."); } else { for (int i = 0; i < antal_passagerare; i++) { Console.WriteLine($"Passageraren är {passagerare[i].Ålder} år gammal och är en {passagerare[i].Kön}."); } } Console.WriteLine(""); } public int calc_total_age() { Console.Clear(); if (antal_passagerare == 0) { Console.WriteLine("Det finns inga passagerare på bussen."); Console.WriteLine(""); return -1; } int total_ålder = 0; for (int i = 0; i < antal_passagerare; i++) { total_ålder += passagerare[i].Ålder; } Console.WriteLine($"Den gemensamma totalåldern för bussens passagerare är {total_ålder} år."); Console.WriteLine(""); return total_ålder; } public int calc_average_age() { Console.Clear(); if (antal_passagerare == 0) { Console.WriteLine("Det finns inga passagerare på bussen."); Console.WriteLine(""); return -1; } int genomsnitt = 0; for (int i = 0; i < antal_passagerare; i++) { genomsnitt += passagerare[i].Ålder; } int medelålder = genomsnitt / antal_passagerare; Console.WriteLine($"Den genomsnittliga åldern på passagerarna är {medelålder} år."); Console.WriteLine(""); return medelålder; } public int max_age() { Console.Clear(); if (antal_passagerare == 0) { Console.WriteLine("Det finns inga passagerare på bussen."); Console.WriteLine(""); return -1; } int maxålder = passagerare[0].Ålder; for (int i = 1; i < antal_passagerare; i++) { if (passagerare[i].Ålder > maxålder) { maxålder = passagerare[i].Ålder; } } Console.WriteLine($"Passageraren med högst ålder på bussen är {maxålder} år gammal."); Console.WriteLine(""); return maxålder; } public void find_age() { Console.Clear(); Console.WriteLine("Vad vill du söka efter? "); Console.WriteLine("1. En specifik ålder "); Console.WriteLine("2. En åldersgrupp "); Console.WriteLine("Svara med en siffra. Tryck 0 för att återvända till huvudmenyn. "); Console.WriteLine(""); int val; int key; bool hittad; do { val = Convert.ToInt32(Console.ReadLine()); if (val == 1) { Console.WriteLine("Vilken ålder vill du söka efter? Svara i heltal."); key = Convert.ToInt32(Console.ReadLine()); hittad = false; for (int i = 0; i < antal_passagerare; i++) { if (passagerare[i].Ålder == key) { Console.WriteLine($"Passageraren med åldern {key} år sitter på plats {i}"); Console.WriteLine("Tryck 0 för att återvända till huvudmenyn eller välj att söka efter ny ålder."); Console.WriteLine(""); hittad = true; } } if (!hittad) { Console.WriteLine("Det finns ingen passagerare på bussen med denna ålder."); Console.WriteLine("Tryck 0 för att återvända till huvudmenyn eller välj att söka efter ny ålder."); Console.WriteLine(""); } } else if (val == 2) { Console.WriteLine("Vilken är den lägsta åldern du vill söka efter? "); int lägst = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Vilken är den högsta åldern du vill söka efter? "); int högst = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Eventuella passagerare i denna åldersgrupp sitter på plats: "); hittad = false; for (int i = 0; i < antal_passagerare; i++) { if (passagerare[i].Ålder >= lägst && passagerare[i].Ålder <= högst) { Console.WriteLine($"{i}"); hittad = true; } Console.WriteLine("Tryck 0 för att återvända till huvudmenyn eller välj att söka efter ny ålder."); Console.WriteLine(""); } if (!hittad) { Console.WriteLine("Det finns inga passagerare inom denna åldersgrupp."); Console.WriteLine("Tryck 0 för att återvända till huvudmenyn eller välj att söka efter ny ålder."); Console.WriteLine(""); } } } while (val != 0); Console.WriteLine("Det finns inga passagerare med denna ålder. Tryck 0 för att återvända till huvudmenyn."); } public void sort_buss() { Console.Clear(); for (int i = 0; i < antal_passagerare - 1; i++) { for (int j = 0; j < antal_passagerare - 1; j++) { if (passagerare[j].Ålder > passagerare[j + 1].Ålder) { var temp = passagerare[j]; passagerare[j] = passagerare[j + 1]; passagerare[j + 1] = temp; } } } Console.WriteLine("Bussen har sorterats efter passagerarnas åldrar."); Console.WriteLine(""); for (int i = 0; i < antal_passagerare; i++) { Console.WriteLine($"Passagerare {i + 1}. Ålder: {passagerare[i].Ålder}"); } Console.WriteLine(""); Console.WriteLine(""); } public void print_sex() { Console.Clear(); Console.WriteLine("Platserna är numrerade från 0-24."); Console.WriteLine(""); Console.WriteLine("Platser med manliga passagerare:"); for (int i = 0; i < antal_passagerare; i++) { if (passagerare[i].Kön.ToLower() == "man") { Console.WriteLine($"Plats {i}"); } } Console.WriteLine(""); Console.WriteLine("Platser med kvinnliga passagerare:"); for (int i = 0; i < antal_passagerare; i++) { if (passagerare[i].Kön.ToLower() == "kvinna") { Console.WriteLine($"Plats {i}"); } } Console.WriteLine(""); } public void getting_off() { //har ännu inte börjat på denna metod } } class Program { public static void Main(string[] args) { var minbuss = new Buss(); minbuss.Run(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } }

Permalänk
Medlem
Skrivet av torgalius:

Hej!

Till den som eventuellt orkar läsa igenom min kod så håller jag på med slutuppgiften "Bussen" i programmering 1 på distans. Jag är nästan färdig med koden, men har ett problem jag ännu inte lyckats lösa. I metoden "add passengers" vill jag att om man fyller i felaktig information så ska inte denna info lagras, utan man ska få fylla i passagerarens info på nytt. Får inte det till att funka på ett smidigt sätt, är det någon som har tips? Ser koden bra ut för övrigt eller finns det förbättringsförslag jag inte tänkt på? Har inte heller lagt till kommentarer än.

Tacksam för eventuell feedback!

using System; using System.Collections.Generic; namespace Bussen { class Person { private int ålder; private string kön; public int Ålder { get { return ålder; } set { if (value >= 0) { ålder = value; } else { Console.WriteLine("Åldern kan inte vara negativ."); } } } public string Kön { get { return kön; } set { string lowercaseValue = value.ToLower(); if (lowercaseValue == "man" || lowercaseValue == "kvinna") { kön = lowercaseValue; } else { Console.WriteLine("Ogiltigt kön. Du måste fylla i antingen 'man' eller 'kvinna'."); } } } } class Buss { private List<Person> passagerare; private int antal_passagerare; public Buss() { passagerare = new List<Person>(); } public void Run() { Console.WriteLine("Welcome to the awesome Buss-simulator"); Console.WriteLine("Vänligen välj ett av alternativen ur menyn."); Console.WriteLine("Använd endast siffror."); Console.WriteLine(""); int meny; do { Console.WriteLine("1. Lägg till passagerare "); Console.WriteLine("2. Skriv ut alla bussens passagerare "); Console.WriteLine("3. Beräkna den totala åldern på bussens passagerare "); Console.WriteLine("4. Beräkna den genomsnittliga åldern på bussens passagerare "); Console.WriteLine("5. Visa åldern på bussens äldsta passagerare "); Console.WriteLine("6. Sök efter passagerare i en viss ålder "); Console.WriteLine("7. Sortera bussen efter passagerarnas åldrar "); Console.WriteLine("8. Ta reda på passagerarnas kön "); Console.WriteLine("9. Låt en passagerare stiga av bussen "); Console.WriteLine("10. Avsluta programmet "); meny = Convert.ToInt32(Console.ReadLine()); switch (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 8: print_sex(); break; case 9: getting_off(); break; case 10: meny = 0; break; default: Console.WriteLine("Felaktig inmatning. Skriv endast heltal mellan 1-10."); break; } } while (meny != 10); } public void add_passenger() { Console.Clear(); Console.WriteLine("Hur många passagerare vill du lägga till? "); Console.WriteLine("Du kan högst lägga till 25 passagerare. "); try { int säten = Convert.ToInt32(Console.ReadLine()); if (säten > 25) { Console.WriteLine("Max antal passagerare är 25. Vänligen försök igen. "); } else { for (int i = 0; i < säten; i++) { Console.WriteLine("För att lägga till en ny passagerare så fyller du i passagerarens ålder samt kön. "); Console.Write("Ålder: "); int ålder = Convert.ToInt32(Console.ReadLine()); Console.Write("Kön: "); string kön = Console.ReadLine(); passagerare.Add(new Person {Ålder = ålder, Kön = kön }); antal_passagerare++; } } } catch { Console.WriteLine("Du kan endast lägga till en passagerare i taget genom att fylla i passagerarens ålder och sedan kön."); Console.WriteLine("Använd endast heltal för att fylla i åldern."); } } public void print_buss() { Console.Clear(); Console.WriteLine("Här är listan på bussens passagerare: "); if (antal_passagerare == 0) { Console.WriteLine("Det finns inga passagerare på bussen."); } else { for (int i = 0; i < antal_passagerare; i++) { Console.WriteLine($"Passageraren är {passagerare[i].Ålder} år gammal och är en {passagerare[i].Kön}."); } } Console.WriteLine(""); } public int calc_total_age() { Console.Clear(); if (antal_passagerare == 0) { Console.WriteLine("Det finns inga passagerare på bussen."); Console.WriteLine(""); return -1; } int total_ålder = 0; for (int i = 0; i < antal_passagerare; i++) { total_ålder += passagerare[i].Ålder; } Console.WriteLine($"Den gemensamma totalåldern för bussens passagerare är {total_ålder} år."); Console.WriteLine(""); return total_ålder; } public int calc_average_age() { Console.Clear(); if (antal_passagerare == 0) { Console.WriteLine("Det finns inga passagerare på bussen."); Console.WriteLine(""); return -1; } int genomsnitt = 0; for (int i = 0; i < antal_passagerare; i++) { genomsnitt += passagerare[i].Ålder; } int medelålder = genomsnitt / antal_passagerare; Console.WriteLine($"Den genomsnittliga åldern på passagerarna är {medelålder} år."); Console.WriteLine(""); return medelålder; } public int max_age() { Console.Clear(); if (antal_passagerare == 0) { Console.WriteLine("Det finns inga passagerare på bussen."); Console.WriteLine(""); return -1; } int maxålder = passagerare[0].Ålder; for (int i = 1; i < antal_passagerare; i++) { if (passagerare[i].Ålder > maxålder) { maxålder = passagerare[i].Ålder; } } Console.WriteLine($"Passageraren med högst ålder på bussen är {maxålder} år gammal."); Console.WriteLine(""); return maxålder; } public void find_age() { Console.Clear(); Console.WriteLine("Vad vill du söka efter? "); Console.WriteLine("1. En specifik ålder "); Console.WriteLine("2. En åldersgrupp "); Console.WriteLine("Svara med en siffra. Tryck 0 för att återvända till huvudmenyn. "); Console.WriteLine(""); int val; int key; bool hittad; do { val = Convert.ToInt32(Console.ReadLine()); if (val == 1) { Console.WriteLine("Vilken ålder vill du söka efter? Svara i heltal."); key = Convert.ToInt32(Console.ReadLine()); hittad = false; for (int i = 0; i < antal_passagerare; i++) { if (passagerare[i].Ålder == key) { Console.WriteLine($"Passageraren med åldern {key} år sitter på plats {i}"); Console.WriteLine("Tryck 0 för att återvända till huvudmenyn eller välj att söka efter ny ålder."); Console.WriteLine(""); hittad = true; } } if (!hittad) { Console.WriteLine("Det finns ingen passagerare på bussen med denna ålder."); Console.WriteLine("Tryck 0 för att återvända till huvudmenyn eller välj att söka efter ny ålder."); Console.WriteLine(""); } } else if (val == 2) { Console.WriteLine("Vilken är den lägsta åldern du vill söka efter? "); int lägst = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Vilken är den högsta åldern du vill söka efter? "); int högst = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Eventuella passagerare i denna åldersgrupp sitter på plats: "); hittad = false; for (int i = 0; i < antal_passagerare; i++) { if (passagerare[i].Ålder >= lägst && passagerare[i].Ålder <= högst) { Console.WriteLine($"{i}"); hittad = true; } Console.WriteLine("Tryck 0 för att återvända till huvudmenyn eller välj att söka efter ny ålder."); Console.WriteLine(""); } if (!hittad) { Console.WriteLine("Det finns inga passagerare inom denna åldersgrupp."); Console.WriteLine("Tryck 0 för att återvända till huvudmenyn eller välj att söka efter ny ålder."); Console.WriteLine(""); } } } while (val != 0); Console.WriteLine("Det finns inga passagerare med denna ålder. Tryck 0 för att återvända till huvudmenyn."); } public void sort_buss() { Console.Clear(); for (int i = 0; i < antal_passagerare - 1; i++) { for (int j = 0; j < antal_passagerare - 1; j++) { if (passagerare[j].Ålder > passagerare[j + 1].Ålder) { var temp = passagerare[j]; passagerare[j] = passagerare[j + 1]; passagerare[j + 1] = temp; } } } Console.WriteLine("Bussen har sorterats efter passagerarnas åldrar."); Console.WriteLine(""); for (int i = 0; i < antal_passagerare; i++) { Console.WriteLine($"Passagerare {i + 1}. Ålder: {passagerare[i].Ålder}"); } Console.WriteLine(""); Console.WriteLine(""); } public void print_sex() { Console.Clear(); Console.WriteLine("Platserna är numrerade från 0-24."); Console.WriteLine(""); Console.WriteLine("Platser med manliga passagerare:"); for (int i = 0; i < antal_passagerare; i++) { if (passagerare[i].Kön.ToLower() == "man") { Console.WriteLine($"Plats {i}"); } } Console.WriteLine(""); Console.WriteLine("Platser med kvinnliga passagerare:"); for (int i = 0; i < antal_passagerare; i++) { if (passagerare[i].Kön.ToLower() == "kvinna") { Console.WriteLine($"Plats {i}"); } } Console.WriteLine(""); } public void getting_off() { //har ännu inte börjat på denna metod } } class Program { public static void Main(string[] args) { var minbuss = new Buss(); minbuss.Run(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } }

En snabb överblick, utan att kolla koden speciellt mycket:

Det är många variabelnamn som är på svenska och en hel del på engelska gällande metoder/funktioner etc.

Om man ska vara petig så skulle jag ha allt på engelska då det följer kodspråket.

Om ni måste ha det på svenska, namnge dina metoder och så på svenska också, så det blir mer enhetligt.

Namnen på funktionerna är lite mer åt c/c++ hållet med underscore, rätta mig om jag har fel, men c# är lite mer åt CamelCase hållet.

Metoder, funktioner etc bör alltid börja med stor bokstav ex add_passenger skulle jag döpa om till AddPassenger etc om det inte ska vara på svenska då blir det ex LäggTillPassagerare eller AdderaPassagerare.

lowercaseValue skulle väl heta tillGemener om det ska vara på svenska osv.

När jag har mer tid så ska jag kika lite på koden med

Visa signatur

Profectus est bonus introductionem scitis quoniam coepit usquam

Permalänk
Medlem

Vad menar du med att du inte vill att info ska lagras vid felaktig inmatning? Som det är nu så avslutas add_passenger-metoden när något går fel, så inget sparas annat än passagerarna som redan lagts till.

Sen börjar du alltid fylla passagerare från 0, så om du väljer det menyalternativet flera gånger så kommer den skriva över passagerare som lagts till tidigare. D.v.s. om du först lägger till a b c och sen d e så blir resultatet d e c istället för a b c d e, men du räknar det ändå som 5 passagerare.

Permalänk
Skrivet av Mahkizmo:

En snabb överblick, utan att kolla koden speciellt mycket:

Det är många variabelnamn som är på svenska och en hel del på engelska gällande metoder/funktioner etc.

Om man ska vara petig så skulle jag ha allt på engelska då det följer kodspråket.

Om ni måste ha det på svenska, namnge dina metoder och så på svenska också, så det blir mer enhetligt.

Namnen på funktionerna är lite mer åt c/c++ hållet med underscore, rätta mig om jag har fel, men c# är lite mer åt CamelCase hållet.

Metoder, funktioner etc bör alltid börja med stor bokstav ex add_passenger skulle jag döpa om till AddPassenger etc om det inte ska vara på svenska då blir det ex LäggTillPassagerare eller AdderaPassagerare.

lowercaseValue skulle väl heta tillGemener om det ska vara på svenska osv.

När jag har mer tid så ska jag kika lite på koden med

Tack så mycket! Vi fick ett kodskal att utgå ifrån där metoderna redan hade namn men ingen kod, därav blandningen på språken men tack för tipset, ska fixa det. Hade ingen aning om underscore vs camelcase heller så det var bra info!

Skrivet av perost:

Vad menar du med att du inte vill att info ska lagras vid felaktig inmatning? Som det är nu så avslutas add_passenger-metoden när något går fel, så inget sparas annat än passagerarna som redan lagts till.

Sen börjar du alltid fylla passagerare från 0, så om du väljer det menyalternativet flera gånger så kommer den skriva över passagerare som lagts till tidigare. D.v.s. om du först lägger till a b c och sen d e så blir resultatet d e c istället för a b c d e, men du räknar det ändå som 5 passagerare.

Just nu när jag kör koden så sparas texten oavsett vad jag fyller i som "kön" och koden hoppar vidare till nästa passagerare. Skriver jag sedan ut bussens passagerare så skriver den bara ut tom text om jag fyllt i "fel". Jag vill att felmeddelandet ska komma upp så fort jag fyllt i fel och jag ska få fylla i informationen på nytt men jag förstår inte hur jag ska göra detta?

Tack för infon om ifall man lägger till passagerare flera gånger, har inte tänkt på det tidigare så ska fixa till den biten!

Permalänk
Skrivet av torgalius:

Tack så mycket! Vi fick ett kodskal att utgå ifrån där metoderna redan hade namn men ingen kod, därav blandningen på språken men tack för tipset, ska fixa det. Hade ingen aning om underscore vs camelcase heller så det var bra info!

Just nu när jag kör koden så sparas texten oavsett vad jag fyller i som "kön" och koden hoppar vidare till nästa passagerare. Skriver jag sedan ut bussens passagerare så skriver den bara ut tom text om jag fyllt i "fel". Jag vill att felmeddelandet ska komma upp så fort jag fyllt i fel och jag ska få fylla i informationen på nytt men jag förstår inte hur jag ska göra detta?

Tack för infon om ifall man lägger till passagerare flera gånger, har inte tänkt på det tidigare så ska fixa till den biten!

Prova en while-loop inuti din for-loop där varje passagerare läggs till. Innan kan du då tilldela en "bool invalidData = true" och så har du while(invalidData) efter det där du sedan efterfrågar inmatning. Använd sedan if-satser för att kontrollera om kön är en sträng (eller kanske om det anges "man" eller "kvinna") och att ålder är en int/heltal.

Om någon av dessa är inkorrekta dataformat så kan du använda "continue;" för att börja om i while-loopen. Men annars antar vi att det blev korrekt (tänk att en kodrad körs i taget) och du kan då sätta "invalidData = false" för att hoppa ut ur while-loopen för nu är allt korrekt för den givna "for-iterationen".

Det är nu i din for-loop som du lägger till passageraren för nu har du inuti din while-loop skött datavalideringen. Tack vare "bool invalidData = true" inuti din for-loop innan while-loopen börjar så "nollställs" det hela så while-loopen kan sköta sitt igen för varje passagerare som försöks läggas till.

Källor att kika på relevanta för det du ska lösa:
- WHILE: https://www.w3schools.com/cs/cs_while_loop.php
- CONTINUE: https://www.w3schools.com/cs/cs_break.php
- LOGICAL NOT: https://csharp-book.softuni.org/Content/Chapter-4-1-complex-c...

TIPS: Använd gärna "if(!variabel) { continue;}" ("LOGICAL NOT") för att korta ned mängden kod. Vad som är intressant är vad som ska göras om det är fel (hoppa till början i while-loopen) och inte om det är rätt då det sistnämnda sköts i slutet i for-loopen. Då kan vi använda "LOGICAL NOT" vilket är utropstecknet(!) framför variabelnamnet.

Mvh,
WKL.

Visa signatur

"Den säkraste koden är den som aldrig skrivs"
"Visste du förresten att det är ett mångmiljardbolag?"
"Jag lever inte för att koda utan kodar för att sen kunna leva"

Permalänk
Skrivet av WebbkodsFrilansaren:

Prova en while-loop inuti din for-loop där varje passagerare läggs till. Innan kan du då tilldela en "bool invalidData = true" och så har du while(invalidData) efter det där du sedan efterfrågar inmatning. Använd sedan if-satser för att kontrollera om kön är en sträng (eller kanske om det anges "man" eller "kvinna") och att ålder är en int/heltal.

Om någon av dessa är inkorrekta dataformat så kan du använda "continue;" för att börja om i while-loopen. Men annars antar vi att det blev korrekt (tänk att en kodrad körs i taget) och du kan då sätta "invalidData = false" för att hoppa ut ur while-loopen för nu är allt korrekt för den givna "for-iterationen".

Det är nu i din for-loop som du lägger till passageraren för nu har du inuti din while-loop skött datavalideringen. Tack vare "bool invalidData = true" inuti din for-loop innan while-loopen börjar så "nollställs" det hela så while-loopen kan sköta sitt igen för varje passagerare som försöks läggas till.

Källor att kika på relevanta för det du ska lösa:
- WHILE: https://www.w3schools.com/cs/cs_while_loop.php
- CONTINUE: https://www.w3schools.com/cs/cs_break.php
- LOGICAL NOT: https://csharp-book.softuni.org/Content/Chapter-4-1-complex-c...

TIPS: Använd gärna "if(!variabel) { continue;}" ("LOGICAL NOT") för att korta ned mängden kod. Vad som är intressant är vad som ska göras om det är fel (hoppa till början i while-loopen) och inte om det är rätt då det sistnämnda sköts i slutet i for-loopen. Då kan vi använda "LOGICAL NOT" vilket är utropstecknet(!) framför variabelnamnet.

Mvh,
WKL.

Tack så mycket för hjälpen, nu fick jag till det så att det fungerar med dessa tipsen! Fick lägga till en konstruktor i klassen Person och sätta this.kön = kön och this.ålder = ålder men nu verkar allt stämma.

Tack för all hjälp!

Permalänk

Vid i princip varje inmatning från användaren så riskerar ditt program att smälla, då det inte görs någon regelbunden kontroll på att det faktiskt är positiva heltal som har matats in.

Ska du göra detta konsekvent så rekommenderar jag att göra en enkel metod som du anropar varje gång användaren ska få ange en int för menyval, ålder eller passagerare.

Kan rekommendera denna sida: https://www.progsharp.se/kapitel/6/ scrolla till stycket "Ett bättre sätt för konvertering av text till tal".

Exempel direkt från sidan:
Console.WriteLine("Skriv in ett heltal");
int heltal1 = ReadInt();
Console.WriteLine("Skriv in ett heltal till");
int heltal2 = ReadInt();
Console.WriteLine("Skriv in ett sista heltal");
int heltal3 = ReadInt();

Console.WriteLine($"Du skrev in talen {heltal1}, {heltal2} och {heltal3}");

int ReadInt()
{
int heltal;
while (int.TryParse(Console.ReadLine(), out heltal) == false)
{
Console.WriteLine("Du skrev inte in ett heltal. Försök igen.");
}
return heltal;
}

Dvs varje gång användaren inte anger ett korrekt heltal så kan du omedelbart tvinga användaren att försöka igen.

Permalänk
Skrivet av torgalius:

Tack så mycket för hjälpen, nu fick jag till det så att det fungerar med dessa tipsen! Fick lägga till en konstruktor i klassen Person och sätta this.kön = kön och this.ålder = ålder men nu verkar allt stämma.

Tack för all hjälp!

Mycket grymt kodat!

Är det något annat i koden som du skulle vilja ha vägledning/"knuffar" kring?

Jag pluggar själv grunderna i C# .NET just nu så jag kan inte garantera några avancerade grejer bara så du vet!

EDIT: Enligt det användaren ovanför mitt svar skrev så bör du inkludera en while-loop för när heltal ska skrivas in för att se till att endast heltal får lagras i variabeln innan i slutet på for-loopen när en passagerare läggs till.

Mvh,
WKL.

Visa signatur

"Den säkraste koden är den som aldrig skrivs"
"Visste du förresten att det är ett mångmiljardbolag?"
"Jag lever inte för att koda utan kodar för att sen kunna leva"

Permalänk
Skrivet av Sammanhang:

Vid i princip varje inmatning från användaren så riskerar ditt program att smälla, då det inte görs någon regelbunden kontroll på att det faktiskt är positiva heltal som har matats in.

Ska du göra detta konsekvent så rekommenderar jag att göra en enkel metod som du anropar varje gång användaren ska få ange en int för menyval, ålder eller passagerare.

Kan rekommendera denna sida: https://www.progsharp.se/kapitel/6/ scrolla till stycket "Ett bättre sätt för konvertering av text till tal".

Exempel direkt från sidan:
Console.WriteLine("Skriv in ett heltal");
int heltal1 = ReadInt();
Console.WriteLine("Skriv in ett heltal till");
int heltal2 = ReadInt();
Console.WriteLine("Skriv in ett sista heltal");
int heltal3 = ReadInt();

Console.WriteLine($"Du skrev in talen {heltal1}, {heltal2} och {heltal3}");

int ReadInt()
{
int heltal;
while (int.TryParse(Console.ReadLine(), out heltal) == false)
{
Console.WriteLine("Du skrev inte in ett heltal. Försök igen.");
}
return heltal;
}

Dvs varje gång användaren inte anger ett korrekt heltal så kan du omedelbart tvinga användaren att försöka igen.

Vilket bra tips, tack! Har inte hört om ReadInt() tidigare så ska definitivt använda det för att förbättra min kod. I klassen Person satte jag public int Ålder där jag försökte ha med felhantering för just 'ålder' men jag vet inte om det är bra nog? Är det ett bra sätt att implementera felhantering så som jag gjort där?

Skrivet av WebbkodsFrilansaren:

Mycket grymt kodat!

Är det något annat i koden som du skulle vilja ha vägledning/"knuffar" kring?

Jag pluggar själv grunderna i C# .NET just nu så jag kan inte garantera några avancerade grejer bara så du vet!

EDIT: Enligt det användaren ovanför mitt svar skrev så bör du inkludera en while-loop för när heltal ska skrivas in för att se till att endast heltal får lagras i variabeln innan i slutet på for-loopen när en passagerare läggs till.

Mvh,
WKL.

Tack så mycket! Jag la till while-loopen men fick upp felmeddelanden om att jag inte hade en konstruktor för att lagra ålder och kön så efter lite experimentering hittade jag lösningen jag skrev men vet inte alls om det är ett bra sätt att koda på. Är lite svårt när man inte har någon att ställa frågor till, därför var det kanon med forumet här! Ska börja på sista metoden "getting_off" nu, får se om jag lyckas lösa den eller om jag behöver hjälp hehe

Permalänk
Medlem
Skrivet av torgalius:

Vilket bra tips, tack! Har inte hört om ReadInt() tidigare så ska definitivt använda det för att förbättra min kod. I klassen Person satte jag public int Ålder där jag försökte ha med felhantering för just 'ålder' men jag vet inte om det är bra nog? Är det ett bra sätt att implementera felhantering så som jag gjort där?

Problemet var att du egentligen inte hade någon felhantering i Person-klassen. Du skrev ut ett felmeddelande om ett värde var felaktigt, men sen gjorde du inget åt det. Om du vill hantera fel i en konstruktor eller property så gör du det enklast genom att kasta ett exception som du sen kan fånga med try-catch. Men det kan eventuellt vara överkurs om ni inte kommit så långt i kursen än, så möjligtvis förväntas ni hantera felen i samband med inläsningen istället.

Men att hantera fel i Person-klassen är absolut en bra idé i allmänhet. Ofta vill man att en klass ska vara s.k. invariant, att den har vissa egenskaper som inte förändras när klassen används som t.ex. att kön alltid ska vara kvinna eller man. Det enklaste sättet att uppnå det är oftast att låta klassen själv se till att variablerna aldrig tilldelas ogiltiga värden. Det är i själva verket en stor anledning till att konstruktorer finns, så att man kan se till att en instans av klassen initialiseras till ett giltigt tillstånd redan när den skapas.

Permalänk
Skrivet av perost:

Problemet var att du egentligen inte hade någon felhantering i Person-klassen. Du skrev ut ett felmeddelande om ett värde var felaktigt, men sen gjorde du inget åt det. Om du vill hantera fel i en konstruktor eller property så gör du det enklast genom att kasta ett exception som du sen kan fånga med try-catch. Men det kan eventuellt vara överkurs om ni inte kommit så långt i kursen än, så möjligtvis förväntas ni hantera felen i samband med inläsningen istället.

Men att hantera fel i Person-klassen är absolut en bra idé i allmänhet. Ofta vill man att en klass ska vara s.k. invariant, att den har vissa egenskaper som inte förändras när klassen används som t.ex. att kön alltid ska vara kvinna eller man. Det enklaste sättet att uppnå det är oftast att låta klassen själv se till att variablerna aldrig tilldelas ogiltiga värden. Det är i själva verket en stor anledning till att konstruktorer finns, så att man kan se till att en instans av klassen initialiseras till ett giltigt tillstånd redan när den skapas.

Vi har lärt oss om try-catch men som du säger så är det i samband med inläsningen, var inte medveten om att man kan ha det direkt i en konstruktor. Det är ofta vi förväntas lära oss lösa uppgifter genom att söka på internet men jag har svårt att veta vad jag ska söka efter, så detta var verkligen bra info. Ska experimentera lite med koden och se om jag löser det, tack!

Permalänk
Skrivet av torgalius:

Vilket bra tips, tack! Har inte hört om ReadInt() tidigare så ska definitivt använda det för att förbättra min kod. I klassen Person satte jag public int Ålder där jag försökte ha med felhantering för just 'ålder' men jag vet inte om det är bra nog? Är det ett bra sätt att implementera felhantering så som jag gjort där?

Om vi exempelvis tittar på hur du ber om input här: "val = Convert.ToInt32(Console.ReadLine());" så säger du egentligen att oavsett vad användaren skriver, så ska vi försöka konvertera detta innehåll till ett heltal. Därför behövs logik som antingen tar bort möjligheten för användaren att göra fel eller åtminstone hantera ifall det har blivit fel.
Har du provat skriva något konstigt i alla dessa menyval? Skriver du "asdjasodiad" eller "234...4342342...23424!" och försöker konvertera detta till ett heltal kommer det ha sönder din applikation.

Det jag gillar med exempelvis TryParse i detta fall är att du helt slipper sitta och fånga varenda exception som kan uppstå. Använder du metoden ReadInt() som jag hänvisade till tidigare så säkerställer du omedelbart att du har fått ett giltligt heltal. Oavsett vilka konstigheter någon får för sig att skriva, så kommer man inte ur loopen om man anger något som inte går att konvertera till ett heltal.

Dokumentation finns bland annat här: https://learn.microsoft.com/en-us/dotnet/api/system.int32.try...
"The TryParse method is like the Parse method, except the TryParse method does not throw an exception if the conversion fails. It eliminates the need to use exception handling to test for a FormatException in the event that s is invalid and cannot be successfully parsed."

Permalänk
Medlem

Är det fusk att be chatGPT att byta ut alla svenska variabler till engelska?

Permalänk
Medlem
Skrivet av Tina Gerson:

Är det fusk att be chatGPT att byta ut alla svenska variabler till engelska?

Njae det skulle jag väl inte säga.
Men ett tips för att byta namn på saker i Visual Studio:
Ställ markören på namnet, och tryck Ctrl + R + R, så får du upp renaming helper, som byter namn på det du markerat samt alla referenser till den.

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 1TB|

Permalänk
Skrivet av Sammanhang:

Om vi exempelvis tittar på hur du ber om input här: "val = Convert.ToInt32(Console.ReadLine());" så säger du egentligen att oavsett vad användaren skriver, så ska vi försöka konvertera detta innehåll till ett heltal. Därför behövs logik som antingen tar bort möjligheten för användaren att göra fel eller åtminstone hantera ifall det har blivit fel.
Har du provat skriva något konstigt i alla dessa menyval? Skriver du "asdjasodiad" eller "234...4342342...23424!" och försöker konvertera detta till ett heltal kommer det ha sönder din applikation.

Det jag gillar med exempelvis TryParse i detta fall är att du helt slipper sitta och fånga varenda exception som kan uppstå. Använder du metoden ReadInt() som jag hänvisade till tidigare så säkerställer du omedelbart att du har fått ett giltligt heltal. Oavsett vilka konstigheter någon får för sig att skriva, så kommer man inte ur loopen om man anger något som inte går att konvertera till ett heltal.

Dokumentation finns bland annat här: https://learn.microsoft.com/en-us/dotnet/api/system.int32.try...
"The TryParse method is like the Parse method, except the TryParse method does not throw an exception if the conversion fails. It eliminates the need to use exception handling to test for a FormatException in the event that s is invalid and cannot be successfully parsed."

Det var något jag inte ens hade tänkt på. Provade att fylla i ord istället och som du skrev så krashade programmet på flera ställen. Har nu gjort en metod med ReadInt() enligt länken du bifogade och det är så mycket smidigare, felhanteringen blir 100 gånger lättare. Vid alla tillfällen jag tidigare bad om siffror har jag nu ReadInt istället. Tack så mycket för tipset, guld värt!