Permalänk
Medlem

Csharp programmering 1

Hej!

Jag har försökt nu fram och tillbaka och ser inte riktigt vad jag gör för fel.
I mitt program har jag en metod som går igenom min vektor och skriver ut det högsta värdet. (Max_age)
Jag försöker nu göra en metod som går igenom min vektor och skriver ut det lägsta värdet. (Min_age)
I min värld så bör dessa metoder vara snarlika? att det den enda skillnaden är åt vilket håll "<" pekar? eller?
jag för metoden Max_age att fungera felfritt.
I detta fall är det ålder på passagerare som jag lagrat i min vektor.
När jag däremot anropar metoden Min_age så blir output 0, ooavsett vilka värden som finns i vektorn?

Någon som förstår vad jag menar och kan förklara hur jag bör tänka för att få det att funka?
Klistrar in min kod nedan:

using System; namespace miniBuss1 { class Program { public static void Main(string[] args) { //Skapar ett objekt av klassen Buss som heter minbuss Buss miniBuss = new Buss(); miniBuss.Run(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } class Buss { private int total_passengers = 0; // Lagrar input från användaren private int max_passengers = 25; // Max antal sittplatser på bussen private int[] passengers = new int[25]; // Skapar utrymme i minnet för att kunna lagra en vektor med 25 element public void Run() { int menyval = 0; do // Skapar en loop som går runt med 7st alternativ som leder vidare till metoder { bool validInput = false; // bool kontrollerar att input från användaren är i rätt format 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 den totala åldern på alla passagerare. |"); Console.WriteLine("|4. Visa medelålder på passagerare. |"); Console.WriteLine("|5. Visa den äldsta passageraren. |"); Console.WriteLine("|6. Visa den yngsta passageraren. |"); Console.WriteLine("|7. Avsluta programmet. |"); Console.WriteLine("|__________________________________________________|"); while (!validInput) { try { menyval = int.Parse(Console.ReadLine()); validInput = true; } catch // om input från användaren inte är siffror { Console.WriteLine("Fel format, vänligen ange ett heltal mellan 1-7"); } } switch (menyval) { case 1: Print_info(); break; case 2: Add_passenger(); break; case 3: Calc_total_age(); break; case 4: Calc_average_age(); break; case 5: Max_age(); break; case 6: Min_age(); break; case 7: Console.WriteLine("Programmet avslutas, hejdå!"); break; default: Console.WriteLine("Felaktig inmatning, vänligen ange ett val mellan 1-7"); break; } } while (menyval != 7); // Loopar så länge menyvalet inte är 7 } private void Add_passenger() { bool validInput = false;// bool kontrollerar att input från användaren är i rätt format Console.WriteLine("Hur många passagerare stiger på?"); int pass = 0; while (!validInput) { try { pass = int.Parse(Console.ReadLine()); validInput = true; } catch { Console.WriteLine("Felaktig inmatning, vänligen ange ett heltal."); validInput = false; } } if (total_passengers + pass > max_passengers) // om det lagrade antalet platser + de som önskas läggas till överskrider det totala antalet platser skrivs nedan string ut { int empty_seats = max_passengers - total_passengers; // antalet lediga sittplatser är de totala antalet platser (25) minus det lagrade antalet Console.WriteLine("Det finns inte så många lediga platser.\n Det är {0} tomma säten kvar", empty_seats); return; } else if (total_passengers == max_passengers) // När bussen är full skrivs nedan string ut { Console.WriteLine("Bussen är nu fullsatt"); return; } for (int i = 0; i < pass; i++) { Console.Write("Ange åldern för passagerare nummer " + (i + 1) + ": "); try //Kontollera att input är korrekt, annars fångas det upp och meddelas användaren { passengers[total_passengers] = int.Parse(Console.ReadLine()); total_passengers++; } catch { Console.WriteLine("Felaktig inmatning, vänligen ange ett heltal."); i--; // Hoppar tillbaka ett steg i indexposition. } } } public void Print_info() { if (total_passengers != 0) { Console.WriteLine("Dessa passagerare finns på bussen:"); for (int i = 0; i < total_passengers; i++) // Går igenom vektorn med en for-loop enligt hur många passagerare som finns på bussen och skriver ut { Console.WriteLine("På sittplats " + (i + 1) + " sitter en passagerare som är " + passengers[i] + " år gammal"); } } else { Console.WriteLine("Det finns inga passagerare på bussen för tillfället"); // Är bussen tom skrivs denna string ut } } public void Calc_total_age() { if (total_passengers != 0) // Kontrollerar att det finns passagerare lagrade i vektorn och lägger ihop alla element { int total_age = 0; for (int i = 0; i < total_passengers; i++) { total_age += passengers[i]; } Console.WriteLine($"Passagerarnas totala ålder är: {total_age} år"); } else { Console.WriteLine("Det finns inga passagerare på bussen för tillfället");// Är bussen tom skrivs denna string ut } } public void Calc_average_age() { if (total_passengers != 0) { int sum = 0; for (int i = 0; i < total_passengers; i++) { sum += passengers[i]; } double average_age = sum / total_passengers; // var double för att tillåta flyttal Console.WriteLine("Medelåldern på bussen är " + Math.Round(average_age, 1) + " år."); //Rundar av resultatet till en decimal } else { Console.WriteLine("Det finns inga passagerare på bussen för tillfället"); // Är bussen tom skrivs denna string ut } } public void Max_age() { if (total_passengers != 0) { int oldest_passenger = passengers[0]; for (int i = 1; i < passengers.Length; i++) { if (passengers[i] > oldest_passenger) { oldest_passenger = passengers[i]; } } Console.WriteLine($"Äldsta passageraren på bussen är {oldest_passenger} år gammal"); return; } else { Console.WriteLine("Det finns inga passagerare på bussen för tillfället");// Är bussen tom skrivs denna string ut } } public void Min_age() { if (total_passengers != 0) { int youngest_passenger = passengers[0]; for (int i = 1; i < passengers.Length; i++) { if (passengers[i] <youngest_passenger) { youngest_passenger = passengers[i]; } } Console.WriteLine($"Yngsta passageraren på bussen är {youngest_passenger} år gammal"); } else { Console.WriteLine("Det finns inga passagerare på bussen för tillfället");// Är bussen tom skrivs denna string ut } } } }

Permalänk
Medlem

Skulle gissa att det är för att din array blir förifylld med värden. Du skapar en array av längd 25, men om du bara lägger in 10 element så har du fortfarande 15 st element som inte fått något överskrivet värde och har sitt default värde vilket för int är 0. Tror jag i alla fall, brukar använda list istället så inte helt van med en array.

Med andra ord, säg att du istället skapar en array av längd 5 och skriver in 3 värden, då skulle du ha detta: [10, 15, 23, 0, 0] så när du loopar igenom hela arrayen så kollar den också på index 3 och 4 som är 0.

Permalänk
Medlem

Kopierade din kod och den funkar för mig? Lade till 25 passagerar. Passagerare nummer 23 var 1 år gammal. resten skrev jag in som 20+ år. Vad jag får tillbaka: Yngsta passageraren är 1 år gammal.

Edit: Yep inser nu med ovanstående inlägg/kommentar. Om du har mindre än 25 passagerare så får du alltid 0 tillbaka. Ändra for loop till i<total_passengers istället för passengers.Length. Eller så får du ändra storleken av din array dynamiskt

Visa signatur

Dator: CPU: Intel Core i5 8600k @4.3GHz | Kylare: Noctua NH-L12 | Moderkort: Gigabyte Z370n WiFi | GPU: EVGA GTX 1080ti FTW3 | RAM: Corsair LPX 16GB 3000MHz | Chassi: Louqe Ghost S1 | Lagring: SAMSUNG 960 Evo m.2 512GB | PSU: Corsair sf600

Permalänk
Medlem

I både Max_age() och Min_age() så loopar du över hela arrayen med passagerare (inklusive de tomma platserna), istället för bara över passagerarna.

I bägge de funktionerna bör jämförelsen

i < passengers.Length

bytas ut mot

i < total_passengers

Permalänk
Medlem
Skrivet av SanyaIV:

Skulle gissa att det är för att din array blir förifylld med värden. Du skapar en array av längd 25, men om du bara lägger in 10 element så har du fortfarande 15 st element som inte fått något överskrivet värde och har sitt default värde vilket för int är 0. Tror jag i alla fall, brukar använda list istället så inte helt van med en array.

Med andra ord, säg att du istället skapar en array av längd 5 och skriver in 3 värden, då skulle du ha detta: [10, 15, 23, 0, 0] så när du loopar igenom hela arrayen så kollar den också på index 3 och 4 som är 0.

Du har rätt. Spelar ingen roll om det är en lista, array eller vad som helst annars. Int defaultar alltid till noll och kan ej vara null (int är en value type).

Ts: den jag citerade förklarade det bra. Så om du inte kommer ta in några 0-åringar på bussen så får du kolla om åldern är 0 och skippa det värdet i dina beräkningar.

Edit: Läste inte din faktiskta kod så personen ovan visade mig att du redan har en variabel för att hålla koll på antalet passagerar.

Permalänk
Skrivet av Forsgren:

Du har rätt. Spelar ingen roll om det är en lista, array eller vad som helst annars. Int defaultar alltid till noll och kan ej vara null (int är en value type).

Om du vill kunna sätta värdet till null kan du använda int? istället för int. Annars kan du helt enkelt sätta åldern till -1 om ingen sitter på platsen.