Permalänk

Slutprojekt i programmering 1

Hejsan, som rubriken lyder så jobbar jag med ett slutprojekt i programmering 1. Har precis blivit introducerad till vektorer vilket jag känner är medel svårt. Att arbeta med fler metoder än 1 är också ganska nytt och väldigt utmanande för mig, speciellt att tillkalla variabler och vektorer mellan olika metoder (görs detta mest med for loops? om jag har fattat rätt), har ingen tidigare erfarenhet av programmering sen cirka 13v tillbaka så ha de i åtanke. Jag googlat runt och kollat lite på andra som har gjort samma uppgift för att få lite hjälp på traven. Hur som, till uppgiften.

Slutprojektet handlar om att man ska samla information kring resenärer på en buss. Det finns 25 tillgängliga platser och det får inte överskridas, antal samt ålder på resenärerna ska registreras. Man ska via en meny ange 1. hur många passagerare det finns på bussen, 2. få en lista med ålder på passagerarna, 3. få medelåldern på passagerarna samt kunna 4. avsluta programmet. Jag är just nu vid punkt 3. där jag har fastnat.

Min fråga är hur kan jag få ut värdena som är samlade i vektorn för att kunna göra uträkningar? Om ni kollar vid metoden calc_total_age() så kan ni se lite vad jag har kommit fram till men det funkar inte. Alla tips och hjälp uppskattas jätte mycket!

class Bus { const int busSeats = 25; public int passengers = 0; public int[] agePassengers = new int[busSeats]; public void Run() { int menu = 0; do { Console.WriteLine("------------------------------------"); Console.WriteLine("Welcome, what would you like to do?"); Console.WriteLine("1. Add passenger(s)"); Console.WriteLine("2. See age of passengers"); Console.WriteLine("3. See average age of passengers"); Console.WriteLine("4. Quit program"); Console.WriteLine("-----------------------------------"); Console.Write("Input: "); try { menu = int.Parse(Console.ReadLine()); } catch (Exception) { Console.WriteLine("Your input may only contain intergers"); } switch (menu) { case 1: add_passenger(); break; case 2: print_bus(); break; case 3: calc_total_age(); break; case 4: Console.WriteLine("Programs is exiting"); break; default: Console.WriteLine("Wrong input. Choose a number between 1-4"); break; } } while (menu != 0); } public void add_passenger() { Console.Write("Enter number of passengers: "); int newPassengers = int.Parse(Console.ReadLine()); if ((passengers + newPassengers) > busSeats) { Console.WriteLine("Number of passengers exceeded maximum"); return; } passengers = passengers + newPassengers; for (int z = 0; z < newPassengers; z++) { for (int i = 0; i < agePassengers.Length; i++) { if (agePassengers[i] == 0) { Console.Write("Enter age of passenger {0}:",(z+1)); agePassengers[i] = int.Parse(Console.ReadLine()); break; } } } } public void print_bus() { Console.WriteLine("Age of passengers from first to last are:"); foreach (int seatAge in agePassengers) { if (seatAge!=0) { Console.WriteLine("{0} years old",seatAge); } } } private void calc_total_age() { /*int[] agePassengers = new int[busSeats]; List<int> list1 = new List<int>(busSeats); int sum = agePassengers.Sum(); /* foreach (int seatAge in agePassengers) { Console.WriteLine("Sum of ages: "+ sum(agePassengers[seatAge])); } //for (int i=0;i<busSeats.Length; i++) //{ // Console.WriteLine(busSeats[i]); // }*/ } } class Program { public static void Main(string[] args) { var mybus = new Bus(); mybus.Run(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } }

Permalänk
Medlem
Skrivet av Camomille:

Hejsan, som rubriken lyder så jobbar jag med ett slutprojekt i programmering 1. Har precis blivit introducerad till vektorer vilket jag känner är medel svårt. Att arbeta med fler metoder än 1 är också ganska nytt och väldigt utmanande för mig, speciellt att tillkalla variabler och vektorer mellan olika metoder (görs detta mest med for loops? om jag har fattat rätt), har ingen tidigare erfarenhet av programmering sen cirka 13v tillbaka så ha de i åtanke. Jag googlat runt och kollat lite på andra som har gjort samma uppgift för att få lite hjälp på traven. Hur som, till uppgiften.

Slutprojektet handlar om att man ska samla information kring resenärer på en buss. Det finns 25 tillgängliga platser och det får inte överskridas, antal samt ålder på resenärerna ska registreras. Man ska via en meny ange 1. hur många passagerare det finns på bussen, 2. få en lista med ålder på passagerarna, 3. få medelåldern på passagerarna samt kunna 4. avsluta programmet. Jag är just nu vid punkt 3. där jag har fastnat.

Min fråga är hur kan jag få ut värdena som är samlade i vektorn för att kunna göra uträkningar? Om ni kollar vid metoden calc_total_age() så kan ni se lite vad jag har kommit fram till men det funkar inte. Alla tips och hjälp uppskattas jätte mycket!

class Bus { const int busSeats = 25; public int passengers = 0; public int[] agePassengers = new int[busSeats]; public void Run() { int menu = 0; do { Console.WriteLine("------------------------------------"); Console.WriteLine("Welcome, what would you like to do?"); Console.WriteLine("1. Add passenger(s)"); Console.WriteLine("2. See age of passengers"); Console.WriteLine("3. See average age of passengers"); Console.WriteLine("4. Quit program"); Console.WriteLine("-----------------------------------"); Console.Write("Input: "); try { menu = int.Parse(Console.ReadLine()); } catch (Exception) { Console.WriteLine("Your input may only contain intergers"); } switch (menu) { case 1: add_passenger(); break; case 2: print_bus(); break; case 3: calc_total_age(); break; case 4: Console.WriteLine("Programs is exiting"); break; default: Console.WriteLine("Wrong input. Choose a number between 1-4"); break; } } while (menu != 0); } public void add_passenger() { Console.Write("Enter number of passengers: "); int newPassengers = int.Parse(Console.ReadLine()); if ((passengers + newPassengers) > busSeats) { Console.WriteLine("Number of passengers exceeded maximum"); return; } passengers = passengers + newPassengers; for (int z = 0; z < newPassengers; z++) { for (int i = 0; i < agePassengers.Length; i++) { if (agePassengers[i] == 0) { Console.Write("Enter age of passenger {0}:",(z+1)); agePassengers[i] = int.Parse(Console.ReadLine()); break; } } } } public void print_bus() { Console.WriteLine("Age of passengers from first to last are:"); foreach (int seatAge in agePassengers) { if (seatAge!=0) { Console.WriteLine("{0} years old",seatAge); } } } private void calc_total_age() { /*int[] agePassengers = new int[busSeats]; List<int> list1 = new List<int>(busSeats); int sum = agePassengers.Sum(); /* foreach (int seatAge in agePassengers) { Console.WriteLine("Sum of ages: "+ sum(agePassengers[seatAge])); } //for (int i=0;i<busSeats.Length; i++) //{ // Console.WriteLine(busSeats[i]); // }*/ } } class Program { public static void Main(string[] args) { var mybus = new Bus(); mybus.Run(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } }

En loop är nog vad din lärare vill att du använder, så du är på rätt spår.

För varje passagerare i bussen Addera åldern till en total

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

Antingen köra Sum() som du gör nu, eller loopa och addera som ovan skrivit. Sen får du dela på antalet passagerare i bussen, då du vill ha ett medelvärde.
Tänk på avrundning (lär önska ett heltal?).

Skickades från m.sweclockers.com

Permalänk
Skrivet av BrutalSwede:

En loop är nog vad din lärare vill att du använder, så du är på rätt spår.

För varje passagerare i bussen Addera åldern till en total

Åldern sparas i agePassengers[i] men jag vet inte hur jag kan ta ut de enskilda värdena från arrayen.

Permalänk
Skrivet av zaibuf:

Antingen köra Sum() som du gör nu, eller loopa och addera som ovan skrivit. Sen får du dela på antalet passagerare i bussen, då du vill ha ett medelvärde.
Tänk på avrundning (lär önska ett heltal?).

Skickades från m.sweclockers.com

Jag lekte lite med Sum() men fick det inte att fungera, jag kom fram till de med en google sökning fast utan större hjälp. Jag får ett felmeddelande som jag inte har en aning om hur jag ska åtgärda.

Permalänk
Medlem
Skrivet av Camomille:

Jag lekte lite med Sum() men fick det inte att fungera, jag kom fram till de med en google sökning fast utan större hjälp. Jag får ett felmeddelande som jag inte har en aning om hur jag ska åtgärda.

Dela gärna felet
Sum() bygger på LINQ, så du behöver lägga till ett using statement i filen att använda System.Linq.

Skickades från m.sweclockers.com

Permalänk
Permalänk
Skrivet av zaibuf:

Dela gärna felet
Sum() bygger på LINQ, så du behöver lägga till ett using statement i filen att använda System.Linq.

Skickades från m.sweclockers.com

The type or namespace name 'List' could not be found...
The type or namespace name 'List' could not be found...
'System.Array' does not contain a definition for 'Sum'...
Vill också påpeka att jag inte använt mig utav list tidigare. Vad är ett using statement och System.Linq, jag är i princip ny på programmering detta verkar lite för avancerat för mig.

Mycket bra läsning, gick igenom allt, jag behärskar det men ibland kan det vara lite struligt.

Permalänk

För att kunna använda List.sum() så måste du lägga in värdena i den listan först med List.AddRange(agePassengers)

Alternativt så kan du använda en for-loop, detta är den vanligaste varianten men for-loopar kan användas på många olika sätt och kan räkna både framlänges och baklänges och hoppa flera steg i taget så läs på noga om dem.

int total = 0;
for(int i = 0; i < agePassengers.length; i++){
total += agePassengers[i];
}
// nu innehåller variabeln total den sammanlagda åldern

int averageAge = total / agePassengers.length;

En array i C# räknas från 0 till array.length-1. Det är därför som det står "i < agePassengers.length" och inte "i = agePassengers.length"
I andra språk varierar det.
For-slingan skrivs så här:

for(start; avslut; uppdatera)

Eller med lite längre förklaring:

for(starta med detta; kör så länge detta gäller; uppdatera detta varje körning)

List finns i System.Collections.Generic så använd:

using System.Collections.Generic;

Funktionen Sum() skapas av LINQ så du behöver även:

using System.Linq;

Permalänk
Skrivet av nyhamndata:

int total = 0;
for(int i = 0; i < agePassengers.length; i++){
total += agePassengers[i];
}
// nu innehåller variabeln total den sammanlagda åldern

int averageAge = total / agePassengers.length;

Tack för din post!
Det verkar som det repeteras 25 gånger för total age, misstänker eftersom arrayen i början är tilldelad 25 platser?
Medelåldern verkar inte heller fungera konstigt nog.

int total = 0; for(int i = 0; i < agePassengers.Length; i++){ total += agePassengers[i]; Console.WriteLine("Total age:{0}",total); } int averageAge = total / agePassengers.Length; Console.WriteLine("Average age:{0}",averageAge);

Hela programmet, uppdaterat

class Bus { const int busSeats = 25; public int passengers = 0; public int[] agePassengers = new int[busSeats]; public void Run() { int menu = 0; do { Console.WriteLine("------------------------------------"); Console.WriteLine("Welcome, what would you like to do?"); Console.WriteLine("1. Add passenger(s)"); Console.WriteLine("2. See age of passengers"); Console.WriteLine("3. See average age of passengers"); Console.WriteLine("4. Quit program"); Console.WriteLine("-----------------------------------"); Console.Write("Input: "); try { menu = int.Parse(Console.ReadLine()); } catch (Exception) { Console.WriteLine("Your input may only contain intergers"); } switch (menu) { case 1: add_passenger(); break; case 2: print_bus(); break; case 3: calc_total_age(); break; case 4: Console.WriteLine("Programs is exiting"); break; default: Console.WriteLine("Wrong input. Choose a number between 1-4"); break; } } while (menu != 0); } public void add_passenger() { Console.Write("Enter number of passengers: "); int newPassengers = int.Parse(Console.ReadLine()); if (newPassengers > busSeats) { Console.WriteLine("Number of passengers exceeded maximum"); return; } for (int z = 0; z < newPassengers; z++) { for (int i = 0; i < agePassengers.Length; i++) { if (agePassengers[i] == 0) { Console.Write("Enter age of passenger {0}:",(z+1)); agePassengers[i] = int.Parse(Console.ReadLine()); break; } } } } public void print_bus() { Console.WriteLine("Age of passengers from first to last are:"); foreach (int seatAge in agePassengers) { if (seatAge!=0) { Console.WriteLine("{0} years old",seatAge); } } } private void calc_total_age() { int total = 0; for(int i = 0; i < agePassengers.Length; i++){ total += agePassengers[i]; Console.WriteLine("Total age:{0}",total); } int averageAge = total / agePassengers.Length; Console.WriteLine("Average age:{0}",averageAge); /*int[] agePassengers = new int[busSeats]; List.AddRange(agePassengers); List<int> list1 = new List<int>(busSeats); int sum = agePassengers.Sum(); /* foreach (int seatAge in agePassengers) { Console.WriteLine("Sum of ages: "+ sum(agePassengers[seatAge])); } //for (int i=0;i<busSeats.Length; i++) //{ // Console.WriteLine(busSeats[i]); // }*/ } } class Program { public static void Main(string[] args) { var mybus = new Bus(); mybus.Run(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } }

Permalänk
Skrivet av Camomille:

Tack för din post!
Det verkar som det repeteras 25 gånger för total age, misstänker eftersom arrayen i början är tilldelad 25 platser?
Medelåldern verkar inte heller fungera konstigt nog.

int total = 0; for(int i = 0; i < agePassengers.Length; i++){ total += agePassengers[i]; Console.WriteLine("Total age:{0}",total); } int averageAge = total / agePassengers.Length; Console.WriteLine("Average age:{0}",averageAge);

Hela programmet, uppdaterat

class Bus { const int busSeats = 25; public int passengers = 0; public int[] agePassengers = new int[busSeats]; public void Run() { int menu = 0; do { Console.WriteLine("------------------------------------"); Console.WriteLine("Welcome, what would you like to do?"); Console.WriteLine("1. Add passenger(s)"); Console.WriteLine("2. See age of passengers"); Console.WriteLine("3. See average age of passengers"); Console.WriteLine("4. Quit program"); Console.WriteLine("-----------------------------------"); Console.Write("Input: "); try { menu = int.Parse(Console.ReadLine()); } catch (Exception) { Console.WriteLine("Your input may only contain intergers"); } switch (menu) { case 1: add_passenger(); break; case 2: print_bus(); break; case 3: calc_total_age(); break; case 4: Console.WriteLine("Programs is exiting"); break; default: Console.WriteLine("Wrong input. Choose a number between 1-4"); break; } } while (menu != 0); } public void add_passenger() { Console.Write("Enter number of passengers: "); int newPassengers = int.Parse(Console.ReadLine()); if (newPassengers > busSeats) { Console.WriteLine("Number of passengers exceeded maximum"); return; } for (int z = 0; z < newPassengers; z++) { for (int i = 0; i < agePassengers.Length; i++) { if (agePassengers[i] == 0) { Console.Write("Enter age of passenger {0}:",(z+1)); agePassengers[i] = int.Parse(Console.ReadLine()); break; } } } } public void print_bus() { Console.WriteLine("Age of passengers from first to last are:"); foreach (int seatAge in agePassengers) { if (seatAge!=0) { Console.WriteLine("{0} years old",seatAge); } } } private void calc_total_age() { int total = 0; for(int i = 0; i < agePassengers.Length; i++){ total += agePassengers[i]; Console.WriteLine("Total age:{0}",total); } int averageAge = total / agePassengers.Length; Console.WriteLine("Average age:{0}",averageAge); /*int[] agePassengers = new int[busSeats]; List.AddRange(agePassengers); List<int> list1 = new List<int>(busSeats); int sum = agePassengers.Sum(); /* foreach (int seatAge in agePassengers) { Console.WriteLine("Sum of ages: "+ sum(agePassengers[seatAge])); } //for (int i=0;i<busSeats.Length; i++) //{ // Console.WriteLine(busSeats[i]); // }*/ } } class Program { public static void Main(string[] args) { var mybus = new Bus(); mybus.Run(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } }

Ändrade så att iterationen är i+=25, men får dock fel i totalt värde samt medelålder

private void calc_total_age() { int total = 0; for(int i = 0; i < agePassengers.Length; i+=25){ total += agePassengers[i]; Console.WriteLine("Total age:{0}",total); } int averageAge = total / agePassengers.Length; Console.WriteLine("Average age:{0}",averageAge);

Fixade code markering
Permalänk
Medlem
Skrivet av Camomille:

The type or namespace name 'List' could not be found...
The type or namespace name 'List' could not be found...
'System.Array' does not contain a definition for 'Sum'...
Vill också påpeka att jag inte använt mig utav list tidigare. Vad är ett using statement och System.Linq, jag är i princip ny på programmering detta verkar lite för avancerat för mig.
Mycket bra läsning, gick igenom allt, jag behärskar det men ibland kan det vara lite struligt.

Precis.
I .NET finns det flera assemblies med funktioner. För att komma åt vissa funktioner behöver man lägga till using statements för att importera funktionaliteten till filen du arbetar i.
Kikar du längst upp i filen står det t.ex. using System; under System finner du dina funktioner som t.ex. Console.WriteLine(); tar du bort System kommer alla dessa att bli röda.
Console i detta fall är en klass (likt din Bus) och WriteLine() är en metod som finns på denna klass (likt de metoderna du har skapat i Bus.

För att få tillgång till Sum() så måste du lägga till using System.Linq;
För att få tillgång till List<T> så måste du lägga till using System.Collections.Generic;

Du kan se detta om du håller med musen över den rad som är rödmarkerad och trycker på Ctrl + . eller den gula glödlampan som visas, där får du lite information om varför det är fel, t.ex. att du behöver importera referenser till andra namespaces.

Skrivet av Camomille:

Ändrade så att iterationen är i+=25, men får dock fel i totalt värde samt medelålder

private void calc_total_age() { int total = 0; for(int i = 0; i < agePassengers.Length; i+=25){ total += agePassengers[i]; Console.WriteLine("Total age:{0}",total); } int averageAge = total / agePassengers.Length; Console.WriteLine("Average age:{0}",averageAge);

Din array är instansierad med längden 25, så även om den är tom så kommer du alltid ha 25 om du kör .Length, även om du inte har 25 passagerare. Det du vill räkna på är din variabel för passengers.

Kan rekommendera dig att lära dig använda debuggern, det är inte alls avancerat.
https://docs.microsoft.com/en-us/visualstudio/debugger/debugg...

Sätt en breakpoint (som bilden visar i länken ovan) där du går in i metoden. Kör igång med debuggern (F5) och anropa din metod med menyval 3. Programmet kommer då att stanna och du kan använda F11 för att gå igenom din kod rad för rad och se värdet på alla variabler.

Permalänk
Skrivet av Camomille:

Ändrade så att iterationen är i+=25, men får dock fel i totalt värde samt medelålder

private void calc_total_age() { int total = 0; for(int i = 0; i < agePassengers.Length; i+=25){ total += agePassengers[i]; Console.WriteLine("Total age:{0}",total); } int averageAge = total / agePassengers.Length; Console.WriteLine("Average age:{0}",averageAge);

Glöm de jag skrev haha
så här måste de väl vara?

int total = 0; for(int i = 0; i < agePassengers.Length; i++){ total += agePassengers[i]; } Console.WriteLine("Total age:{0}",total); int averageAge = total / agePassengers.Length; Console.WriteLine("Average age:{0}",averageAge);

Permalänk
Skrivet av zaibuf:

Kan rekommendera dig att lära dig använda debuggern, det är inte alls avancerat.
https://docs.microsoft.com/en-us/visualstudio/debugger/debugg...

Sätt en breakpoint (som bilden visar i länken ovan) där du går in i metoden. Kör igång med debuggern (F5) och anropa din metod med menyval 3. Programmet kommer då att stanna och du kan använda F11 för att gå igenom din kod rad för rad och se värdet på alla variabler.

Tack, gjorde precis detta och antalet passagerare sparas i newPassengers. När jag vill ta fram medelåldern i private void calc_totalt_age() så har jag skrivit följande men får felmeddelandet: The name 'NewPassengers' does not exist in the current context.
kod:

int total = 0; for(int i = 0; i < agePassengers.Length; i++){ total += agePassengers[i]; } Console.WriteLine("Total age:{0}",total); int averageAge = total / newPassengers; Console.WriteLine("Average age:{0}",averageAge);

Permalänk
Medlem
Skrivet av Camomille:

Tack, gjorde precis detta och antalet passagerare sparas i newPassengers. När jag vill ta fram medelåldern i private void calc_totalt_age() så har jag skrivit följande men får felmeddelandet: The name 'NewPassengers' does not exist in the current context.
kod:

int total = 0; for(int i = 0; i < agePassengers.Length; i++){ total += agePassengers[i]; } Console.WriteLine("Total age:{0}",total); int averageAge = total / newPassengers; Console.WriteLine("Average age:{0}",averageAge);

newPassengers har du bara tillgänglig i metoden för AddPassengers. En variabel lever bara i scopet den deklareras, dvs mellan två curly bracers. Du vill nog räkna på din variabel passengers, som du deklarerar längst upp i Bus. Det är denna som bör ha koll på hur många passagerare du har.

Ett annat alternativ är att du räknar ut antalet passagerare i samma loop, då du vet att om värdet på index inte är 0 så är det en passagerare på den platsen.

int total = 0; int totalPassengers = 0; foreach(var passenger in agePassengers) { if(passenger != 0) { totalPassengers++; total += passenger; } } Console.WriteLine("Total age:{0}",total); if(totalPassengers > 0) { int averageAge = total / totalPassengers; Console.WriteLine("Average age: {0}", averageAge); } // Alternativt med LINQ (using System.Linq) int totalAge = agePassengers.Sum(); int totalPassengers = agePassengers.Where(passenger => passenger != 0).Count(); if(totalPassengers != 0) { int averageAge = totalAge / totalPassengers; }

Permalänk
Skrivet av zaibuf:

newPassengers har du bara tillgänglig i metoden för AddPassengers. En variabel lever bara i ett scope, dvs mellan två curly bracers. Du vill nog räkna på din variabel, passengers, som du deklarerar längst upp i Bus. Det är denna som bör ha koll på hur många passagerare du har.

Ett annat alternativ är att du räknar ut antalet passagerare i samma loop, då du vet att om värdet på index inte är 0 så är det en passagerare på den platsen.

int total = 0; int totalPassengers = 0; foreach(var passenger in agePassengers) { if(passenger != 0) { totalPassengers++; total += passenger; } } Console.WriteLine("Total age:{0}",total); if(totalPassengers > 0) { int averageAge = total / totalPassengers; Console.WriteLine("Average age: {0}", averageAge); } // Alternativt med LINQ (using System.Linq) int totalAge = agePassengers.Sum(); int totalPassengers = agePassengers.Where(passenger => passenger != 0).Count(); if(totalPassengers != 0) { int averageAge = totalAge / totalPassengers; }

Tack så hemskt mycket! det funkar prima nu

Permalänk

Hej igen, till denna uppgift skulle det göras ett diagram i planeringsfasen vilket jag inte har gjort då jag tyckte det va svårt och har sparat det till sist. Det här diagrammet har jag gjort i en tidigare uppgift men nu ska vi göra ett av följande diagram. Det verkar som värsta hoppet i svårighetsgrad, jag menar kolla bara på de nya diagrammen... Har aldrig gjort ett diagram med for loops, menyer, uträkningar m.m. Har någon tips på hur jag ens ska börja? Uppskattar verkligen om någon kunde ge mig lite tips så jag kan börja!! tack på förhand!

Permalänk
Skrivet av Camomille:

Hej igen, till denna uppgift skulle det göras ett diagram i planeringsfasen vilket jag inte har gjort då jag tyckte det va svårt och har sparat det till sist. Det här diagrammet har jag gjort i en tidigare uppgift men nu ska vi göra ett av följande diagram. Det verkar som värsta hoppet i svårighetsgrad, jag menar kolla bara på de nya diagrammen... Har aldrig gjort ett diagram med for loops, menyer, uträkningar m.m. Har någon tips på hur jag ens ska börja? Uppskattar verkligen om någon kunde ge mig lite tips så jag kan börja!! tack på förhand!

Är detta okej vad gäller pseudo-kod för mitt program?

Programmet startas
En meny med alternativ
Om man trycker på 1
Lägg till antal passagerare
Lägg till ålder på antalet passagerare
Om man trycker på 2
Visa åldern på antalet passagerare
Om man trycker på 3
Visa den totala- och medelåldern för antalet passagerare
Om man trycker på 4
Avsluta programmet

Permalänk
Skrivet av zaibuf:

newPassengers har du bara tillgänglig i metoden för AddPassengers. En variabel lever bara i scopet den deklareras, dvs mellan två curly bracers. Du vill nog räkna på din variabel passengers, som du deklarerar längst upp i Bus. Det är denna som bör ha koll på hur många passagerare du har.

Ett annat alternativ är att du räknar ut antalet passagerare i samma loop, då du vet att om värdet på index inte är 0 så är det en passagerare på den platsen.

int total = 0; int totalPassengers = 0; foreach(var passenger in agePassengers) { if(passenger != 0) { totalPassengers++; total += passenger; } } Console.WriteLine("Total age:{0}",total); if(totalPassengers > 0) { int averageAge = total / totalPassengers; Console.WriteLine("Average age: {0}", averageAge); } // Alternativt med LINQ (using System.Linq) int totalAge = agePassengers.Sum(); int totalPassengers = agePassengers.Where(passenger => passenger != 0).Count(); if(totalPassengers != 0) { int averageAge = totalAge / totalPassengers; }

Vet du varför detta inte avrundas? Om jag exempelvis skriver in 4 passagerare med åldrarna 1,2,3,4 så blir medelåldern 2.5 men den avrundar till 2 och inte 3...

private void CalcTotalAge() { double total = 0; double totalPassengers = 0; foreach(double passenger in agePassengers){ if(passenger != 0){ totalPassengers++; total += passenger; } } Console.WriteLine("Total age:{0}",total); if(totalPassengers > 0) { double averageAge = total / totalPassengers; double roundedAge = Math.Round(averageAge); Console.WriteLine("Average age: {0}", roundedAge); } }

Hela programmet om du vill ha det:

class Bus { const int busSeats = 25; public int passengers = 0; public int[] agePassengers = new int[busSeats]; public void Run() { int menu = 0; do { Console.WriteLine("------------------------------------"); Console.WriteLine("Welcome, what would you like to do?"); Console.WriteLine("1. Add passenger(s)"); Console.WriteLine("2. See age of passengers"); Console.WriteLine("3. See average age of passengers"); Console.WriteLine("4. Quit program"); Console.WriteLine("-----------------------------------"); Console.Write("Input: "); try { menu = int.Parse(Console.ReadLine()); } catch (Exception) { Console.WriteLine("Your input may only contain intergers"); } switch (menu) { case 1: AddPassenger(); break; case 2: PrintBus(); break; case 3: CalcTotalAge(); break; case 4: Console.WriteLine("Programs is exiting"); return; default: Console.WriteLine("Wrong input. Choose a number between 1-4"); break; } } while (menu != 0); } public void AddPassenger() { Console.Write("Enter number of passengers: "); int newPassengers = int.Parse(Console.ReadLine()); if (newPassengers > busSeats) { Console.WriteLine("Number of passengers exceeded maximum"); return; } for (int z = 0; z < newPassengers; z++) { for (int i = 0; i < agePassengers.Length; i++){ if (agePassengers[i] == 0){ Console.Write("Enter age of passenger {0}:",(z+1)); agePassengers[i] = int.Parse(Console.ReadLine()); break; } } } } public void PrintBus() { Console.WriteLine("Age of passengers from first to last are:"); foreach (int seatAge in agePassengers) { if (seatAge!=0) { Console.WriteLine("{0} years old",seatAge); } } } private void CalcTotalAge() { double total = 0; double totalPassengers = 0; foreach(double passenger in agePassengers){ if(passenger != 0){ totalPassengers++; total += passenger; } } Console.WriteLine("Total age:{0}",total); if(totalPassengers > 0) { double averageAge = total / totalPassengers; double roundedAge = Math.Round(averageAge); Console.WriteLine("Average age: {0}", roundedAge); } } } class Program { public static void Main(string[] args) { var mybus = new Bus(); mybus.Run(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } }

Permalänk

Angående avrundningen. Det är vanligt att programmeringsspråk avrundar .5 med varannan ner och varannan upp. Det är för att när man summerar flera avrundade tal och räknar medelvärde eller andra statistiska beräkningar så skulle svaret bli fel om man avrundar alla .5 på samma håll.
Det brukar finnas en avrundningsfunktion som alltid avrundar ner eller som kan styras med en extra parameter.

Skickades från m.sweclockers.com

Permalänk
Medlem

@Camomille:
Det underlättar väldigt mycket om man redan från början blir kompis med dokumentationen till det ramverk man vill jobba med.
Som exempel finns svaret på din fråga i:
https://docs.microsoft.com/en-us/dotnet/api/system.math.round...

Läs om MidpointRounding och AwayFromZero så kommer du förstå varför det beter sig som det gör.

Visa signatur

Herman

Permalänk
Skrivet av sworst:

@Camomille:
Det underlättar väldigt mycket om man redan från början blir kompis med dokumentationen till det ramverk man vill jobba med.
Som exempel finns svaret på din fråga i:
https://docs.microsoft.com/en-us/dotnet/api/system.math.round...

Läs om MidpointRounding och AwayFromZero så kommer du förstå varför det beter sig som det gör.

Tack ska du ha!
Är de någon som vet hur jag kan ordna så att om jag har lagt till säg 3 passagerare och sedan väljer att lägga till ytterligare 23 (så det blir totalt 26st) så får jag ett felmeddelande att typ 'Det finns endast 22 platser kvar'?

I och med att det endast finns en variabel 'newPassengers' för att lägga till passagerare både första och andra gången så ser jag inte hur detta skulle kunna ordnas? om det däremot fanns en variabel för de första passagerare man skriver in t.ex. 'newPassengers' och en för de passagerarna man skriver in andra gången typ 'secondPassengers'. Så då skulle man kunna göra en ny int typ maxPassengers = (newPassengers+secondPassengers)-busSeats; //där busSeats då är maxvärdet 25,
Om vi nu hade skrivit ut Console.WriteLine("Du kan endast skriva in {0} platser till",maxPassengers);
Hur skulle vi kunna ordna så vi får det så här?

Hoppas min förklaring inte blev allt för förvirrande, börjar bli seg på den här uppgiften nu tacksam för svar

Permalänk
Medlem
Skrivet av Camomille:

Tack ska du ha!
Är de någon som vet hur jag kan ordna så att om jag har lagt till säg 3 passagerare och sedan väljer att lägga till ytterligare 23 (så det blir totalt 26st) så får jag ett felmeddelande att typ 'Det finns endast 22 platser kvar'?

I och med att det endast finns en variabel 'newPassengers' för att lägga till passagerare både första och andra gången så ser jag inte hur detta skulle kunna ordnas? om det däremot fanns en variabel för de första passagerare man skriver in t.ex. 'newPassengers' och en för de passagerarna man skriver in andra gången typ 'secondPassengers'. Så då skulle man kunna göra en ny int typ maxPassengers = (newPassengers+secondPassengers)-busSeats; //där busSeats då är maxvärdet 25,
Om vi nu hade skrivit ut Console.WriteLine("Du kan endast skriva in {0} platser till",maxPassengers);
Hur skulle vi kunna ordna så vi får det så här?

Hoppas min förklaring inte blev allt för förvirrande, börjar bli seg på den här uppgiften nu tacksam för svar

Enklast är att skapa en metod som returerar en int med uträkningen av antalet lediga platser. Så är det bara att anropa den in den i ditt felmeddelande du har nu.

OM nyaPassagerare ÄR STÖRRE ÄN antalPlatser
Skriv ut:
Antal för stort. Det finns endast xx lediga platser kvar på bussen.

Du har ju din array och du vet sen tidigare hur du kontrollerar om en plats inte är "ledig" (CalcTotalAge).
Nu får du kontrollera om den är ledig.

Skickades från m.sweclockers.com

Permalänk
Skrivet av zaibuf:

Enklast är att skapa en metod som returerar en int med uträkningen av antalet lediga platser. Så är det bara att anropa den in den i ditt felmeddelande du har nu.

OM nyaPassagerare ÄR STÖRRE ÄN antalPlatser
Skriv ut:
Antal för stort. Det finns endast xx lediga platser kvar på bussen.

Du har ju din array och du vet sen tidigare hur du kontrollerar om en plats inte är "ledig" (CalcTotalAge).
Nu får du kontrollera om den är ledig.

Skickades från m.sweclockers.com

Gjorde denna int:en

int rmngSeats = busSeats-newPassengers;

Men den uppdaterar inte varje "varv" jag går i loopen, så om jag skriver in 3 platser först och sedan 1 plats så får jag att det finns 24 platser kvar, vet du varför det är så?

Permalänk
Medlem
Skrivet av Camomille:

Gjorde denna int:en

int rmngSeats = busSeats-newPassengers;

Men den uppdaterar inte varje "varv" jag går i loopen, så om jag skriver in 3 platser först och sedan 1 plats så får jag att det finns 24 platser kvar, vet du varför det är så?

För att busSeats alltid är 25.
Du räknar mot ett tal som alltid är 25, så vid varje nytt anrop är busSeats 25 då det är en konstant.
Du vill räkna mot antalet lediga platser i din buss, dvs. din array agePassengers.
Ett tydligare namn på arrayen skulle vara just Passengers.

public void AddPassenger() { Console.Write("Enter number of passengers: "); int newPassengers = int.Parse(Console.ReadLine()); int remainingSeats = GetEmptySeats(); if (newPassengers > remainingSeats) { Console.WriteLine($"Number of passengers exceeded maximum, there are {remainingSeats} remaining seats."); return; } ... } private int GetEmptySeats() { int emptySeats = 0; foreach(var passenger in agePassengers) { if(passenger == 0) emptySeats++; } return emptySeats; }

Permalänk
Skrivet av zaibuf:

För att busSeats alltid är 25.
Du räknar mot ett tal som alltid är 25, så vid varje nytt anrop är busSeats 25 då det är en konstant.
Du vill räkna mot antalet lediga platser i din buss, dvs. din array agePassengers.
Ett tydligare namn på arrayen skulle vara just Passengers.

public void AddPassenger() { Console.Write("Enter number of passengers: "); int newPassengers = int.Parse(Console.ReadLine()); int remainingSeats = GetEmptySeats(); if (newPassengers > remainingSeats) { Console.WriteLine($"Number of passengers exceeded maximum, there are {remainingSeats} remaining seats."); return; } ... } private int GetEmptySeats() { int emptySeats = 0; foreach(var passenger in agePassengers) { if(passenger == 0) emptySeats++; } return emptySeats; }

Du är en hjälte! tack ska du ha

Permalänk
Skrivet av zaibuf:

För att busSeats alltid är 25.
Du räknar mot ett tal som alltid är 25, så vid varje nytt anrop är busSeats 25 då det är en konstant.
Du vill räkna mot antalet lediga platser i din buss, dvs. din array agePassengers.
Ett tydligare namn på arrayen skulle vara just Passengers.

public void AddPassenger() { Console.Write("Enter number of passengers: "); int newPassengers = int.Parse(Console.ReadLine()); int remainingSeats = GetEmptySeats(); if (newPassengers > remainingSeats) { Console.WriteLine($"Number of passengers exceeded maximum, there are {remainingSeats} remaining seats."); return; } ... } private int GetEmptySeats() { int emptySeats = 0; foreach(var passenger in agePassengers) { if(passenger == 0) emptySeats++; } return emptySeats; }

Har försökt lägga in ett try catch block i metoden AddPassenger men kan inte använda mig av integern efteråt eftersom den inte synns i if satsen, vet du hur jag kan fixa det?

Console.Write("Enter number of passengers: "); try{ int newPassengers = int.Parse(Console.ReadLine()); }catch (Exception){ Console.WriteLine("Your answer may only contain intergers"); } if (newPassengers > busSeats) { Console.WriteLine("Number of passengers exceeded maximum"); return; } int remainingSeats = GetEmptySeats(); if (newPassengers > remainingSeats) { Console.WriteLine("Number of passengers exceeded maximum, there are {0} remaining seats.", remainingSeats); return; } for (int z = 0; z < newPassengers; z++) { for (int i = 0; i < agePassengers.Length; i++){ if (agePassengers[i] == 0){ Console.Write("Enter age of passenger {0}:",(z+1)); agePassengers[i] = int.Parse(Console.ReadLine()); break; } } }

Permalänk
Medlem
Skrivet av Camomille:

Har försökt lägga in ett try catch block i metoden AddPassenger men kan inte använda mig av integern efteråt eftersom den inte synns i if satsen, vet du hur jag kan fixa det?

En variabel som deklareras i ett block (definierat av { och }) kommer "dö" när blocket tar slut, d.v.s.:

{ // Nytt block. int i = 17; } // Slut på block, variabeln "i" försvinner här.

Lösningen är att deklarera variabeln utanför blocket, du måste inte deklarera och tilldela variabler på samma rad:

int i; { i = 17; // Ok att använda variabler från yttre block. } // "i" lever fortfarande.

Permalänk
Skrivet av perost:

En variabel som deklareras i ett block (definierat av { och }) kommer "dö" när blocket tar slut, d.v.s.:

{ // Nytt block. int i = 17; } // Slut på block, variabeln "i" försvinner här.

Lösningen är att deklarera variabeln utanför blocket, du måste inte deklarera och tilldela variabler på samma rad:

int i; { i = 17; // Ok att använda variabler från yttre block. } // "i" lever fortfarande.

Grym förklaring! jag kom fram till detta men får fortfarande fel

public void AddPassenger() { int newPassengers; Console.Write("Enter number of passengers: "); try { newPassengers = int.Parse(Console.ReadLine()); } catch (Exception){ Console.WriteLine("Your input may only contain intergers"); } if (newPassengers > busSeats) { Console.WriteLine("Number of passengers exceeded maximum"); return; } int remainingSeats = GetEmptySeats(); if (newPassengers > remainingSeats) { Console.WriteLine("Number of passengers exceeded maximum, there are {0} remaining seats.", remainingSeats); return; } for (int z = 0; z < newPassengers; z++) { for (int i = 0; i < agePassengers.Length; i++){ if (agePassengers[i] == 0){ Console.Write("Enter age of passenger {0}:",(z+1)); agePassengers[i] = int.Parse(Console.ReadLine()); break; } } } }

Permalänk
Medlem

@Camomille: C# tillåter inte att man använder oinitialiserade variabler, d.v.s. variabler som inte har något värde. I ditt fall så kommer newPassengers inte få något värde om tilldelningen i try-satsen misslyckas (t.ex. för att användaren matar in något som inte är ett tal), men du skriver då bara ut ett meddelande och går sen ändå vidare.

Så du vill nog antingen lägga try-satsen i en loop som snurrar tills användaren matat in ett giltigt värde, alternativt sparka tillbaka användaren till menyn med en return om den matar in ett felaktigt värde.

Jag har lite dålig koll på hur bra C# är på att ta reda på om en variabel fått ett värde eller ej, så oavsett vilken lösning du väljer så blir du kanske lov att ge newPassengers ett värde när du deklarerar variabeln (t.ex. 0).