Permalänk
Medlem

c# bussen

Hej,
Jag är nybörjare på programmering och har lite problem med min kod nedan.

När jag ska räkna ut totala åldern t.ex. så kommer bara sista talet med, om man väljer alternativ 1 och matar in ålder 20 t.ex. och sen väljer man alternativ 1 igen och skriver in 35 så kommer bara 35 med när man väljer alternativ 3.

Hoppas det går att förstå vad jag menar.

class buss { public int[] passagerare = new int[25]; // Antal platser i vektorn public int antal_passagerare; // maxantal public void Run () // meny { int val = 0; do { Console.WriteLine("Välkommen till bussen. Gör ett val"); Console.WriteLine("1. Lägg till passagerare"); Console.WriteLine("2. Skriv ut åldern på passagerarna"); Console.WriteLine("3. Räkna ut den totala åldern på passagerarna"); Console.WriteLine("4. Avsluta programmet"); val = int.Parse(Console.ReadLine()); switch (val) { case 1: läggatill(); break; case 2: SkrivUt(); break; case 3: Totålder(); break; case 4: avsluta(); break; default: Console.WriteLine("Du har tryckt på en knapp som inte finns att välja."); break; } } while (val != 4); // Trycker man 4 så avslutar man programmet } public void avsluta() // avslutar programmet { Console.WriteLine("Nu avslutas programmet."); } public void läggatill () // lägger till passagerare { Console.WriteLine("Du vill lägga till en passagerare. Välj antal. "); string antal = Console.ReadLine(); antal_passagerare = Convert.ToInt32(antal); for (int a = 0; a < antal_passagerare; a++) { Console.WriteLine("Lägg till en ny passagerare genom att skriva in passagerarens ålder : "); passagerare[a] = int.Parse(Console.ReadLine()); if (a + antal_passagerare == passagerare.Length) { a = passagerare.Length; antal += antal_passagerare; Console.WriteLine("Nu är bussen full"); } else { a++; } } } public void SkrivUt () // skriver ut alla passagerare som lagras i vektorn { for (int a = 0; a < passagerare.Length; a++ ) Console.WriteLine("Plats {0} på bussen är {1} år gammal",a , passagerare[a]); } public int Totålder() // räknar ut totala åldern på bussen { int summa = 0; Console.WriteLine("Du har valt att beräkna den totala åldern på bussen."); for (int a = 0; a < passagerare.Length; a++) { summa += passagerare[a]; } int ålder = summa; Console.WriteLine("Den totala åldern på bussen är {0}", ålder); return summa; } }

Lagt till code-taggar
Permalänk
Medlem

Du lägger alltid till passagerare i början av vektorn, så tidigare passagerare skrivs över.

Du använder för övrigt inte antal_passagerare korrekt, du ska använda den variabeln för att hålla reda på hur många passagerare som lagts till. Det enda ställe du ska använda passagerare.Length på är när du kollar om bussen är full.

Permalänk

Ett tips är att använda [code]-taggar så att koden är lättare att läsa.

Min kompilator klagar:

error CS5001: Program `buss.exe' does not contain a static `Main' method suitable for an entry point Compilation failed: 1 error(s), 0 warnings

Jag gjorde några enkla ändringar så att koden gick att köra.

Om man svarar 2 utan att ha lagt in några passagerare, står det att det sitter passagerare som är noll år gamla på alla platser:

Citat:

Plats 0 på bussen är 0 år gammal
Plats 1 på bussen är 0 år gammal
Plats 2 på bussen är 0 år gammal
[...]

Är det inte bättre att skriva att platsen är tom?

Sedan är det den här raden:

Console.WriteLine("Plats {0} på bussen är {1} år gammal",a , passagerare[a]);

Index räknas från 0, men numrerade platser på en buss brukar gå från 1, så jag föreslår att du ändrar koden så att det står att passagerare[a] sitter på plats a + 1 istället.

Kolla hur många a++ du har i for-loopen där du anger passagerarnas ålder. Du stoppar bara in en passagerare på varannan plats.

Om du försöker lägga in 50 passagerare kraschar programmet (System.IndexOutOfRangeException: Index was outside the bounds of the array.) eftersom det inte finns 50 sittplatser på bussen.

Om du har lagt in 5 passagerare och sedan försöker lägga in 5 passagerare en andra gång, skrivs de första 5 över. Är det inte meningen att de första 5 ska stanna kvar på bussen så att det finns totalt 10? Kolla startvärdet i for-loopen i läggatill().

Permalänk
Medlem

C# bussen

Skrivet av Kommenterande 2:

Ett tips är att använda [code]-taggar så att koden är lättare att läsa.

Min kompilator klagar:

error CS5001: Program `buss.exe' does not contain a static `Main' method suitable for an entry point Compilation failed: 1 error(s), 0 warnings

Jag gjorde några enkla ändringar så att koden gick att köra.

Om man svarar 2 utan att ha lagt in några passagerare, står det att det sitter passagerare som är noll år gamla på alla platser:Är det inte bättre att skriva att platsen är tom?

Sedan är det den här raden:

Console.WriteLine("Plats {0} på bussen är {1} år gammal",a , passagerare[a]);

Index räknas från 0, men numrerade platser på en buss brukar gå från 1, så jag föreslår att du ändrar koden så att det står att passagerare[a] sitter på plats a + 1 istället.

Kolla hur många a++ du har i for-loopen där du anger passagerarnas ålder. Du stoppar bara in en passagerare på varannan plats.

Om du försöker lägga in 50 passagerare kraschar programmet (System.IndexOutOfRangeException: Index was outside the bounds of the array.) eftersom det inte finns 50 sittplatser på bussen.

Om du har lagt in 5 passagerare och sedan försöker lägga in 5 passagerare en andra gång, skrivs de första 5 över. Är det inte meningen att de första 5 ska stanna kvar på bussen så att det finns totalt 10? Kolla startvärdet i for-loopen i läggatill().

//

Tack för svaren!
Du har helt rätt att om man lägger till 5 passagerare och sedan lägger till fler ska dem gamla inte skrivas över. I mitt program kommer man bara kunna lägga till 1 passagerare åt gången så jag behöver få till "sparnings" funktionen.
Jag blir osäker vad som ska ändras på den. Jag har bara jobbat med for-loopen när startvärdet är 0.

I den andra for-loopen under passagerarnas ålder så tog jag bort a++ under else.

Tack för tipset gällande platserna på bussen, ändrade så det står från plats 1.

Permalänk
Medlem
Skrivet av perost:

Du lägger alltid till passagerare i början av vektorn, så tidigare passagerare skrivs över.

Du använder för övrigt inte antal_passagerare korrekt, du ska använda den variabeln för att hålla reda på hur många passagerare som lagts till. Det enda ställe du ska använda passagerare.Length på är när du kollar om bussen är full.

//

Hur ska jag använda den menar du?
Tusen tack för svar!

Permalänk
Medlem
Skrivet av lunkan47:

Hur ska jag använda den menar du?
Tusen tack för svar!

Just nu använder du antal_passagerare för att läsa in hur många passagerare användaren vill lägga till, men tanken är att du ska använda den variabeln för att hålla reda på det totala antalet passagerare som lagts till. Om du håller reda på hur många passagerare som lagts till så vet du också var nästa tomma plats i vektorn är.

Permalänk
Medlem
Skrivet av perost:

Just nu använder du antal_passagerare för att läsa in hur många passagerare användaren vill lägga till, men tanken är att du ska använda den variabeln för att hålla reda på det totala antalet passagerare som lagts till. Om du håller reda på hur många passagerare som lagts till så vet du också var nästa tomma plats i vektorn är.

Jag får inte till det..

Har ändrat till.
Men blir galet ändå.

Console.WriteLine("Du vill lägga till en passagerare. Välj antal. ");
string antal = Console.ReadLine();
int nyap = Convert.ToInt32(antal);

for (int a= 0; a < nyap; a ++)
{
Console.WriteLine("Lägg till en ny passagerare genom att skriva in passagerarens ålder : ");
passagerare[a] = int.Parse(Console.ReadLine());

if (a + nyap == passagerare.Length)
{
a = passagerare.Length;
antal += antal_passagerare;

Console.WriteLine("Nu är bussen full");

Permalänk
Medlem

@lunkan47: Säg att du lägger till 3 passagerare första gången, då ska antal_passagerare = 3 efter att läggatill anropats. Om du sen vill lägga till fler passagerare, vilket index ska nästa passagerare läggas in på i vektorn?

Permalänk
Medlem

Tanken är att antal_passagerare alltid ska reflektera aktuellt antal som finns "på bussen". Det görs enklast genom att öka dess värde med ett direkt efter en insättning. Då är det enkelt att hålla koll på hur många som finns, det är bara att kontrollera dess värde.

När du är med på det så kan du tänka på det som perost skriver ovan. Det finns alltså en relation mellan hur många som finns i bussen och vilken plats som ska fyllas nästa gång.

Permalänk
Medlem
Skrivet av perost:

@lunkan47: Säg att du lägger till 3 passagerare första gången, då ska antal_passagerare = 3 efter att läggatill anropats. Om du sen vill lägga till fler passagerare, vilket index ska nästa passagerare läggas in på i vektorn?

Den ska läggas in på 4.

Fattar inte hur jag får till just det...

Permalänk
Medlem
Skrivet av lunkan47:

Den ska läggas in på 4.

Fattar inte hur jag får till just det...

Nej, tänk på att första indexet i en C#-array är 0.

Permalänk
Medlem
Skrivet av perost:

Nej, tänk på att första indexet i en C#-array är 0.

Ja juste.
Plats 3 ska den läggas in på.
Dock förstår jag inte hur jag ska få dit den.

Det står helt still i skallen på mig just nu.

Permalänk
Medlem

Fylla på första platsen: passagerare[0] =
Fylla på andra platsen: passagerare[1] =
Fylla på tredje platsen: passagerare[2] =

Fylla på en plats som bestäms av en variabel: passagerare[position] =

Här kan värdet på position vara t.ex. 0, 1, 2 eller vilket värde (som alltså motsvarar den position i arrayen) som du vill tilldela ett värde.

Permalänk
Medlem
Skrivet av lunkan47:

Ja juste.
Plats 3 ska den läggas in på.
Dock förstår jag inte hur jag ska få dit den.

Det står helt still i skallen på mig just nu.

Du ser alltså inget samband mellan att antal_passagerare och indexet för nästa tomma plats är samma värde?

Permalänk
Medlem
Skrivet av perost:

Du ser alltså inget samband mellan att antal_passagerare och indexet för nästa tomma plats är samma värde?

Jo men jag förstår inte hur jag ska skriva det i kod. Vart jag ska ändra osv...
När jag kör programmet och ska skriva in en passagerare och sedan en till så hämtar den bara senaste värdet men skriver ut plats två också men hämtar inte mitt första värde som jag skrev in.

Välkommen till bussen. Gör ett val mellan 1-4.
1. Lägg till passagerare.
2. Skriv ut åldern på passagerarna.
3. Räkna ut den totala åldern på passagerarna.
4. Avsluta programmet.
1
Du vill lägga till en passagerare. Välj antal.
1
Lägg till en ny passagerare genom att skriva in passagerarens ålder :
10
Välkommen till bussen. Gör ett val mellan 1-4.
1. Lägg till passagerare.
2. Skriv ut åldern på passagerarna.
3. Räkna ut den totala åldern på passagerarna.
4. Avsluta programmet.
1
Du vill lägga till en passagerare. Välj antal.
1
Lägg till en ny passagerare genom att skriva in passagerarens ålder :
50
Välkommen till bussen. Gör ett val mellan 1-4.
1. Lägg till passagerare.
2. Skriv ut åldern på passagerarna.
3. Räkna ut den totala åldern på passagerarna.
4. Avsluta programmet.
2
Passageraren är 50 år gammal och sitter på plats 1
Passageraren är 0 år gammal och sitter på plats 2

Permalänk
Medlem

Mitt tips är att skriva om/förenkla metoden som tar hand om insättning.

Gör en första version där du tar bort möjligheten att mata in fler än 1 passagerare.

Se till att få det flödet att fungera först och bygg sedan ut lösningen med mer avancerade funktioner.

Permalänk
Medlem

Console.WriteLine("Lägg till en ny passagerare genom att skriva in passagerarens ålder : ");
passagerare[ ... ] = int.Parse(Console.ReadLine());
antal_passagerare++;

Hur kan du lista ut på vilken position i din array som du ska sätta in nästa passagerare på?

Permalänk
Medlem
Skrivet av MickeBoy:

Console.WriteLine("Lägg till en ny passagerare genom att skriva in passagerarens ålder : ");
passagerare[ ... ] = int.Parse(Console.ReadLine());
antal_passagerare++;

Hur kan du lista ut på vilken position i din array som du ska sätta in nästa passagerare på?

Tack!

Jag vet inte hur jag kan lista ut det tyvärr.. Jag provade att skriva in 0 då blev det fel när man skrev in flera, då tog den bara med sista talet...

Välkommen till bussen. Gör ett val mellan 1-4.
1. Lägg till passagerare.
2. Skriv ut åldern på passagerarna.
3. Räkna ut den totala åldern på passagerarna.
4. Avsluta programmet.
1
Lägg till en ny passagerare genom att skriva in passagerarens ålder :
25

Välkommen till bussen. Gör ett val mellan 1-4.
1. Lägg till passagerare.
2. Skriv ut åldern på passagerarna.
3. Räkna ut den totala åldern på passagerarna.
4. Avsluta programmet.
1
Lägg till en ny passagerare genom att skriva in passagerarens ålder :
15

Välkommen till bussen. Gör ett val mellan 1-4.
1. Lägg till passagerare.
2. Skriv ut åldern på passagerarna.
3. Räkna ut den totala åldern på passagerarna.
4. Avsluta programmet.
2
Passageraren är 15 år gammal och sitter på plats 1
Passageraren är 15 år gammal och sitter på plats 2

Permalänk
Medlem

Jag gör ett försök till att få dig att komma på det själv:

Startvillkor
Om det inte finns några passagerare på bussen då borde variabeln antal_passagerare ha värdet 0.

Upprepning
När passagerare nummer 1 stiger på bussen så hamnar den på den första positionen i arrayen. Denna position har indexvärde 0.
Efter att 1 passagerare har stigit på så borde variabeln antal_passagerare ha värdet 1.

När passagerare nummer 2 stiger på bussen så hamnar den på den andra positionen i arrayen. Denna position har indexvärde 1.
Efter att 2 passagerare har stigit på så borde variabeln antal_passagerare ha värdet 2.

När passagerare nummer 3 stiger på bussen så hamnar den på den tredje positionen i arrayen. Denna position har indexvärde 2.
Efter att 3 passagerare har stigit på så borde variabeln antal_passagerare ha värdet 3.

När passagerare nummer 4 stiger på bussen så hamnar den på den fjärde positionen i arrayen. Denna position har indexvärde 3.
Efter att 4 passagerare har stigit på så borde variabeln antal_passagerare ha värdet 4.

När passagerare nummer 5 stiger på bussen så hamnar den på den femte positionen i arrayen. Denna position har indexvärde 4.
Efter att 5 passagerare har stigit på så borde variabeln antal_passagerare ha värdet 5.

Permalänk
Medlem
Skrivet av MickeBoy:

Jag gör ett försök till att få dig att komma på det själv:

Startvillkor
Om det inte finns några passagerare på bussen då borde variabeln antal_passagerare ha värdet 0.

Upprepning
När passagerare nummer 1 stiger på bussen så hamnar den på den första positionen i arrayen. Denna position har indexvärde 0.
Efter att 1 passagerare har stigit på så borde variabeln antal_passagerare ha värdet 1.

När passagerare nummer 2 stiger på bussen så hamnar den på den andra positionen i arrayen. Denna position har indexvärde 1.
Efter att 2 passagerare har stigit på så borde variabeln antal_passagerare ha värdet 2.

När passagerare nummer 3 stiger på bussen så hamnar den på den tredje positionen i arrayen. Denna position har indexvärde 2.
Efter att 3 passagerare har stigit på så borde variabeln antal_passagerare ha värdet 3.

När passagerare nummer 4 stiger på bussen så hamnar den på den fjärde positionen i arrayen. Denna position har indexvärde 3.
Efter att 4 passagerare har stigit på så borde variabeln antal_passagerare ha värdet 4.

När passagerare nummer 5 stiger på bussen så hamnar den på den femte positionen i arrayen. Denna position har indexvärde 4.
Efter att 5 passagerare har stigit på så borde variabeln antal_passagerare ha värdet 5.

Jag kommer inte på.. blir tokig..
Har provat att lägga in en for-loop men får inte till det heller.

Jag tänker att man skriver 0 för det är startvärdet men sen försökte jag skriva in 0++ för att den ska öka men det går inte.

Permalänk
Medlem
Skrivet av lunkan47:

Jag kommer inte på.. blir tokig..
Har provat att lägga in en for-loop men får inte till det heller.

Jag tänker att man skriver 0 för det är startvärdet men sen försökte jag skriva in 0++ för att den ska öka men det går inte.

++ fungerar bara på variabler. 0 är inte en variabel.

antal_passagerare är en variabel som du kan göra ++ på däremot och den är ju 0 ifrån början. *wink wink*

Permalänk
Medlem

Ändra i början till:

public int antal_passagerare = 0; // antalet passagerare på bussen, startvärdet är 0

och skriv metoden för att lägga till som

public void läggatill () // lägger till passagerare { Console.WriteLine("Lägg till en ny passagerare genom att skriva in passagerarens ålder : "); passagerare[antal_passagerare] = int.Parse(Console.ReadLine()); antal_passagerare ++; }

Dessutom ser det ut som att din utskriftsmetod inte riktigt fungerar då du får samma ålder på trots olika inmatningar.
Jag hjälper dig lite med strukturen, men du behöver rätta upp TODO.

public void SkrivUt () // skriver ut alla passagerare som lagras i vektorn { // Eftersom antal_passagerare hela tiden kommer att hålla reda på antalet passagerare på bussen kan detta värde användas som stoppvillkor i for-loopen for (int passagerarposition = 0; passagerarposition < antal_passagerare; passagerarposition ++ ) { Console.WriteLine("Plats {0} på bussen är {1} år gammal",a , passagerare[a]); //TODO: Måste justeras } }

Permalänk
Medlem

++ (och --) är ju bara förkortningar i språket liksom, x++ är ju exakt samma sak som x = x + 1. 0 = 0 + 1 går ju inte ihop för 0 kan ju aldrig vara lika med någonting som inte är 0.

Permalänk
Medlem
Skrivet av adzer:

++ fungerar bara på variabler. 0 är inte en variabel.

antal_passagerare är en variabel som du kan göra ++ på däremot och den är ju 0 ifrån början. *wink wink*

Skrivet av MickeBoy:

Ändra i början till:

public int antal_passagerare = 0; // antalet passagerare på bussen, startvärdet är 0

och skriv metoden för att lägga till som

public void läggatill () // lägger till passagerare { Console.WriteLine("Lägg till en ny passagerare genom att skriva in passagerarens ålder : "); passagerare[antal_passagerare] = int.Parse(Console.ReadLine()); antal_passagerare ++; }

Dessutom ser det ut som att din utskriftsmetod inte riktigt fungerar då du får samma ålder på trots olika inmatningar.
Jag hjälper dig lite med strukturen, men du behöver rätta upp TODO.

public void SkrivUt () // skriver ut alla passagerare som lagras i vektorn { // Eftersom antal_passagerare hela tiden kommer att hålla reda på antalet passagerare på bussen kan detta värde användas som stoppvillkor i for-loopen for (int passagerarposition = 0; passagerarposition < antal_passagerare; passagerarposition ++ ) { Console.WriteLine("Plats {0} på bussen är {1} år gammal",a , passagerare[a]); //TODO: Måste justeras } }

Skrivet av snajk:

++ (och --) är ju bara förkortningar i språket liksom, x++ är ju exakt samma sak som x = x + 1. 0 = 0 + 1 går ju inte ihop för 0 kan ju aldrig vara lika med någonting som inte är 0.

Tack för all hjälp!

Det löste sig nu. Såklart skulle det vara antal_passagerare. Det låser sig i skallen. Svår kurs när den är på distans och man aldrig provat det innan.

Ska försöka utveckla den om det går annars får det vara som det är nu.
Tack!

Permalänk
Vila i frid
Skrivet av lunkan47:

Det löste sig nu. Såklart skulle det vara antal_passagerare. Det låser sig i skallen.

Tips för framtiden. Använd debuggern (med brytpunkter) och stega igenom koden och visa "Auto Locals" så ser du direkt vad som händer och inte händer.

Permalänk
Medlem
Skrivet av hasenfrasen:

Tips för framtiden. Använd debuggern (med brytpunkter) och stega igenom koden och visa "Auto Locals" så ser du direkt vad som händer och inte händer.

Hur får man fram den funktionen? Jag har bara kört utan.

Permalänk
Vila i frid

Eftersom du inte beskrivit din utvecklingsmiljö förmodar jag att du kör Visual Studio. Sätt en brytpunkt på lämpligt ställe och kör, välj sen Debug -> Windows -> Locals eller vad du nu vill kika på.

Permalänk
Medlem
Skrivet av hasenfrasen:

Eftersom du inte beskrivit din utvecklingsmiljö förmodar jag att du kör Visual Studio. Sätt en brytpunkt på lämpligt ställe och kör, välj sen Debug -> Windows -> Locals eller vad du nu vill kika på.

Yes jag kör Visual Studio men jag hade inte valet Locals.
Tack iaf!

Permalänk
Vila i frid
Skrivet av lunkan47:

Yes jag kör Visual Studio men jag hade inte valet Locals.

Alltså, debuggern måste köras och vara aktiv och ha stannat vid en brytpunkt för att alternativet Watch Locals ska vara tillgängligt.