32 svar
333 visningar
steaktonight 19
Postad: 2 feb 2022 13:28 Redigerad: 2 feb 2022 13:29

Problem med vektor och try catch

I slutuppgift programmering 1 så ska man simulera en buss och passagerare med hjälp av en vektor som håller heltal.

Sedan ska man med hjälp av meny som användare kunna göra olika val. Hittills har jag lyckats ok tycker jag men problemet är att jag kan fortsätta mata in tal i vektorn som bara ska kunna hålla 25 tal.

Dessa överlappar sedan varandra i vektorn.

 

Mitt andra problem är att jag försökt mig på en try catch som ska hantera fel inmatningar. (icke tal)

Men får det inte riktigt att fungera.

Har bara dessa två problem kvar, hade varit skönt att få lite hjälp :) Tack

Här är koden

using System;

namespace MinBuss
{
    class Program
    {
        public static void Main(string[] args)
        {
            var minbuss = new Buss();
            minbuss.Run();
            Console.Write("Press any key to exit the program......");
            Console.ReadKey();
        }
    }
}

class Buss
{
    public int[] passenger = new int[25];
    public int total_passenger;



    public void Run()
    {
        int menu = 0;
        do
        {
            Console.WriteLine("*******************************************************");
            Console.WriteLine("Welcome to the bus simulator!");
            Console.WriteLine("Choose an alternative:");
            Console.WriteLine("1. Add passenger");
            Console.WriteLine("2. Check the age of the passengers on the bus");
            Console.WriteLine("3. Calculate the total age of the passengers");
            Console.WriteLine("0. Exit the program!");
            Console.WriteLine("******************************************************");
            //menu = int.Parse(Console.ReadLine());
            try
            {
                //Läser in användarens val, konverterar string till int och lagrar i variabeln choice.
                menu = int.Parse(Console.ReadLine());
            }
            catch
            {
                //Låter användaren veta att inmatning var felaktig.
                Console.WriteLine("Invalid");
            }
            switch (menu)
            {
                case 1:
                    add_passenger();
                    break;

                case 2:
                    print_buss();
                    break;

                case 3:
                    calc_total_age();
                    break;

                

            }
        } while (menu != 0);
    }

    public void add_passenger()
    {
        Console.WriteLine("How many passengers would you like to add?");
        int addPass = Convert.ToInt32(Console.ReadLine());
        for (int i = 0; i < addPass; i++)
        {
                                                                                                           //trycatch om anv matar in något annat än siffror
                                                                                                           //25 posiutioner, säg till om för många!
                Console.WriteLine("Write the age of the passenger you would like to add: ");
                int pass = Convert.ToInt32(Console.ReadLine());//Konvertera string till int
                passenger[i] = pass; //Adderar värdet till vektoren

            if (pass > 25)
            {
                Console.WriteLine("The bus is full!");
            }

           
            
        }
    }

    public void print_buss()
    {
        Console.WriteLine("The ages of the passengers on the bus are: ");
        for (int i = 0; i < passenger.Length; i++)
        {
            Console.WriteLine(passenger[i] + "years old");
        }
    }


    public int calc_total_age()
    {
        int sum = 0;
        for (int i = 0; i < passenger.Length; i++)
        {
            sum += passenger[i];
        }
        int totalAge = sum;
        Console.WriteLine("The total age of the passengers is " + totalAge);
        return totalAge;
    }


    }

Programmeraren 3390
Postad: 2 feb 2022 13:59 Redigerad: 2 feb 2022 14:01

Vad är det som inte fungerar?

Du sätter menu till 0 innan do-while vilket borde göra att loopen bryts om inmatningen misslyckas eftersom menu då inte ändras.
Om det är felet kan du sätta menu till -1 på raden innan try

Du kanske också borde ha en default i switch:en som skriver "Ogiltigt alternativ". Då behöver du även en "case 0: break" som inte går någonting.

steaktonight 19
Postad: 2 feb 2022 15:53
Programmeraren skrev:

Vad är det som inte fungerar?

Du sätter menu till 0 innan do-while vilket borde göra att loopen bryts om inmatningen misslyckas eftersom menu då inte ändras.
Om det är felet kan du sätta menu till -1 på raden innan try

Du kanske också borde ha en default i switch:en som skriver "Ogiltigt alternativ". Då behöver du även en "case 0: break" som inte går någonting.

 

 

 

  Som det är nu så kraschar programmet om jag skriver tecken i menyn exempelvis.  + jag får endast invalid om jag lägger till över 25 passagerare samtidigt. Lägger jag till en åt gången så kan jag lägga till hur många som helst. Och då överlappar de varann i vektorn när jag når 25. Förstår du mitt problem? 

Programmeraren 3390
Postad: 2 feb 2022 16:15 Redigerad: 2 feb 2022 16:16

När du säger "kraschar", men du det eller avslutas loopen eftersom menu=0 oförändrat (enligt det jag skrev ovan)?
Gör en utskrift av menu efter catch men innan switch om du inte förstår vad jag menar. Men du menar nog att det kraschar i add_passenger. Men det jag skrev ovan är nog relevant oavsett.

add_passenger():
Här saknas try/catch på Convert.ToInt32 vilket jag antar att du behöver (vet inte om det är någon skillnad på att använda Convert.ToInt32 eller int.Parse).

Du har en loop som går addPass (det inmatade) antalet varv. Den bör du kolla innan loopen att den inte är >25.
"if (pass > 25)" kontrollerar åldern på den senast inmatade passageraren. Det är nog inte det du vill. Om du innan kollat att addPass <= 25 behöver du inte kontrollera inuti loopen också.

Definiera en variabel först, "int maxPassengers = 25;" och använd den på alla ställen du skriver 25. "Magiska tal" är fult och gör de dessutom svårt att ändra om man vill det.

steaktonight 19
Postad: 2 feb 2022 16:22
Programmeraren skrev:

När du säger "kraschar", men du det eller avslutas loopen eftersom menu=0 oförändrat (enligt det jag skrev ovan)?
Gör en utskrift av menu efter catch men innan switch om du inte förstår vad jag menar. Men du menar nog att det kraschar i add_passenger. Men det jag skrev ovan är nog relevant oavsett.

add_passenger():
Här saknas try/catch på Convert.ToInt32 vilket jag antar att du behöver (vet inte om det är någon skillnad på att använda Convert.ToInt32 eller int.Parse).

Du har en loop som går addPass (det inmatade) antalet varv. Den bör du kolla innan loopen att den inte är >25.
"if (pass > 25)" kontrollerar åldern på den senast inmatade passageraren. Det är nog inte det du vill. Om du innan kollat att addPass <= 25 behöver du inte kontrollera inuti loopen också.

Definiera en variabel först, "int maxPassengers = 25;" och använd den på alla ställen du skriver 25. "Magiska tal" är fult och gör de dessutom svårt att ändra om man vill det.

Tack. Tror jag förstår vad du menar. If pass> 25 gör att jag får buss is full om jag skriver in en ålder över 25. Ska testa åtgärda detta med en int när jag kommer hem.

 

Menar du sedan att jag ska lägga in en till try catch i add pass?

Programmeraren 3390
Postad: 2 feb 2022 16:31

Alla parsningar av text till int måste vara i try/catch, annars smäller det om det inmatade inte kan tolkas som en int.
Du har 3 ställen där man ska mata in ett tal. Vore snyggare att lägga den koden i en egen funktion som ställer frågan, tar emot inmatning, tolkar till int, och om det inte går (blir en "catch") loopar tillbaka och ställer frågan igen. Typ:

public int readInt(String question) {
  while (true) {
    try {
     // print question
     // read console
     // parse int
     // return int
  } catch {
    // write error message
  }
}

Då kan du använda den på all tre ställena där du behöver ett tal.

"if (pass > 25)" är fel oavsett, du menar typ "if (i >= 25)" men då måste den ligga INNAN "passenger[i] = pass", 25 är ju utanför längden av passenger.
Bättre ta bort den och kolla att addPass <= 25 innan loopen.

steaktonight 19
Postad: 2 feb 2022 17:15
Programmeraren skrev:

Alla parsningar av text till int måste vara i try/catch, annars smäller det om det inmatade inte kan tolkas som en int.
Du har 3 ställen där man ska mata in ett tal. Vore snyggare att lägga den koden i en egen funktion som ställer frågan, tar emot inmatning, tolkar till int, och om det inte går (blir en "catch") loopar tillbaka och ställer frågan igen. Typ:

public int readInt(String question) {
  while (true) {
    try {
     // print question
     // read console
     // parse int
     // return int
  } catch {
    // write error message
  }
}

Då kan du använda den på all tre ställena där du behöver ett tal.

"if (pass > 25)" är fel oavsett, du menar typ "if (i >= 25)" men då måste den ligga INNAN "passenger[i] = pass", 25 är ju utanför längden av passenger.
Bättre ta bort den och kolla att addPass <= 25 innan loopen.

Intressant. Säg att jag gör en funktion som denna. Hur anropar jag den i de andra funktionerna? Går det ha samma anrop på alla ställen där tal ska matas in?  Förlåt. Väldigt ny fortfarande på programmering. 

steaktonight 19
Postad: 2 feb 2022 17:17

Jag har valt att sikta på betyg d. Med 3 funktioner. Kände att högre var lite överkurs. En funktion för all inmatning låter ju rätt. Är bara osäker på hur jag anropar den inuti de andra funktionerna

Programmeraren 3390
Postad: 2 feb 2022 17:59

Du anropar samma på alla tre ställena.

int menu = readInt("Choose an alternative");

int addPass = readInt("How many passengers would you like to add?");

int pass = readInt("Write the age of the passenger you would like to add:");

steaktonight 19
Postad: 2 feb 2022 19:01
Programmeraren skrev:

Du anropar samma på alla tre ställena.

int menu = readInt("Choose an alternative");

int addPass = readInt("How many passengers would you like to add?");

int pass = readInt("Write the age of the passenger you would like to add:");

tack för din hjälp. ska sätta mig och försöka mig på detta nu :)

steaktonight 19
Postad: 3 feb 2022 14:45
Programmeraren skrev:

När du säger "kraschar", men du det eller avslutas loopen eftersom menu=0 oförändrat (enligt det jag skrev ovan)?
Gör en utskrift av menu efter catch men innan switch om du inte förstår vad jag menar. Men du menar nog att det kraschar i add_passenger. Men det jag skrev ovan är nog relevant oavsett.

add_passenger():
Här saknas try/catch på Convert.ToInt32 vilket jag antar att du behöver (vet inte om det är någon skillnad på att använda Convert.ToInt32 eller int.Parse).

Du har en loop som går addPass (det inmatade) antalet varv. Den bör du kolla innan loopen att den inte är >25.
"if (pass > 25)" kontrollerar åldern på den senast inmatade passageraren. Det är nog inte det du vill. Om du innan kollat att addPass <= 25 behöver du inte kontrollera inuti loopen också.

Definiera en variabel först, "int maxPassengers = 25;" och använd den på alla ställen du skriver 25. "Magiska tal" är fult och gör de dessutom svårt att ändra om man vill det.

Behöver jag en public int maxPassangers också för att det ska fungera? Lyvkas inte riktigt

Programmeraren 3390
Postad: 3 feb 2022 15:18

Ja, om du vill ersätta alla ställen det står "25" på. Men funkar utan (som du har nu med 25 överallt).

steaktonight 19
Postad: 3 feb 2022 20:41 Redigerad: 3 feb 2022 20:44

såhär ser min kod ut nu

using System;

namespace MinBuss
{
    class Program
    {
        public static void Main(string[] args)
        {
            var minbuss = new Buss();
            minbuss.Run();
            Console.Write("Press any key to exit the program......");
            Console.ReadKey();
        }
    }
}

class Buss
{
    public int[] passenger = new int[25];
    public int total_passenger;
    private int pass;

    public void Run()
    {
        int menu = -1;
        do
        {
            Console.WriteLine("*******************************************************");
            Console.WriteLine("Welcome to the bus simulator!");
            Console.WriteLine("Make your choice:");
            Console.WriteLine("1. Add passenger");
            Console.WriteLine("2. Check the age of the passengers on the bus");
            Console.WriteLine("3. Calculate the total age of the passengers");
            Console.WriteLine("0. Exit the program!");
            Console.WriteLine("******************************************************");
            //menu = int.Parse(Console.ReadLine());
            try
            {
                //Läser in användarens val, konverterar string till int och lagrar i variabeln choice.
                menu = int.Parse(Console.ReadLine());
            }
            catch
            {
                //Låter användaren veta att inmatning var felaktig.
                Console.WriteLine("Invalid");
            }
            switch (menu)
            {
                case 1:
                    add_passenger();
                    break;

                case 2:
                    print_buss();
                    break;

                case 3:
                    calc_total_age();
                    break;



            }
        } while (menu != 0);
    }

    public void add_passenger()
    {
        Console.WriteLine("How many passengers would you like to add?");
        int addPass = Convert.ToInt32(Console.ReadLine());
        for (int i = 0; i < addPass; i++)
        {
            //trycatch om anv matar in något annat än siffror
            //25 posiutioner, säg till om för många!
            Console.WriteLine("Write the age of the passenger you would like to add: ");
            try
            {
                int pass = Convert.ToInt32(Console.ReadLine());//Konvertera string till int
                passenger[i] = pass; //Adderar värdet till vektoren
            }
            catch
            {
                Console.WriteLine("Choose a number");
            }

            if (pass > 25)
            {
                Console.WriteLine("The bus is full!");
            }



        }
    }

    public void print_buss()
    {
        Console.WriteLine("The ages of the passengers on the bus are: ");
        for (int i = 0; i < passenger.Length; i++)
        {
            Console.WriteLine(passenger[i] + "years old");
        }
    }


    public int calc_total_age()
    {
        int sum = 0;
        for (int i = 0; i < passenger.Length; i++)
        {
            sum += passenger[i];
        }
        int totalAge = sum;
        Console.WriteLine("The total age of the passengers is " + totalAge);
        return totalAge;
    }


}

 

Probelemet jag har nu är att att programmet kraschar när jag i menyn väljer val 1. och sedan skriver en bokstav istället för tal. Men om jag i meny skriver tal först och sedan kommer "age of passenger så fungerar min try catch loop där.

Hur får jag in try catch i roten på val add passenger? (Blir galen)

ska jag köra 

try

{ for (int i =....

} ?

 

Förskte mig även på att lägga till en int med maxPassengers men får det inte att fungera :(

Programmeraren 3390
Postad: 3 feb 2022 21:23 Redigerad: 3 feb 2022 21:25

Tycker huvudloopen ser bra ut nu.

i add_passenger() måste du skydda Convert.ToInt32 med try / catch.
Eftersom du har samma behov på tre ställen tror jag fortfarande det blir enklare med en separat metod som du använder på alla tre ställena.

Nästa problemet att om du inte matar in ett tal så kommer det indexet (det i:et) hoppas över.
Du kan lösa detta på olika sätt:

A) Sätt en while(true) runt utskriften och try/catch:en. I try-delen sätter du "break;" efter passenger[i] = pass;, dvs då den lyckats ta in ett tal.

B) Byt for-loopen mot
int i = 0;
while (i < 25) { ...
och räkna upp variablen i efter du gjort passenger[i] = pass;

C) Med en metod som tar hand om fel och inte returnerar förrän ett tal matats in.

if (pass >25) ... förstår jag inte vad den ska göra, pass är ju åldern. Känns som den ska bort.

 

En metod för att läsa in ett tal kan se ut så här ungefär. Utan att ha provkompilerat så säkert småfel:

public int readInt(String question) {
  while (true) {
    try {
     // print question
            Console.WriteLine(question);
     // read console and parse int
     int x = Convert.ToInt32(Console.ReadLine())

     return x;
  } catch {
    Console.WriteLine("Ange ett tal");
  }
}

steaktonight 19
Postad: 3 feb 2022 21:42
Programmeraren skrev:

Tycker huvudloopen ser bra ut nu.

i add_passenger() måste du skydda Convert.ToInt32 med try / catch.
Eftersom du har samma behov på tre ställen tror jag fortfarande det blir enklare med en separat metod som du använder på alla tre ställena.

Nästa problemet att om du inte matar in ett tal så kommer det indexet (det i:et) hoppas över.
Du kan lösa detta på olika sätt:

A) Sätt en while(true) runt utskriften och try/catch:en. I try-delen sätter du "break;" efter passenger[i] = pass;, dvs då den lyckats ta in ett tal.

B) Byt for-loopen mot
int i = 0;
while (i < 25) { ...
och räkna upp variablen i efter du gjort passenger[i] = pass;

C) Med en metod som tar hand om fel och inte returnerar förrän ett tal matats in.

if (pass >25) ... förstår jag inte vad den ska göra, pass är ju åldern. Känns som den ska bort.

 

En metod för att läsa in ett tal kan se ut så här ungefär. Utan att ha provkompilerat så säkert småfel:

public int readInt(String question) {
  while (true) {
    try {
     // print question
            Console.WriteLine(question);
     // read console and parse int
     int x = Convert.ToInt32(Console.ReadLine())

     return x;
  } catch {
    Console.WriteLine("Ange ett tal");
  }
}

När jag gör en try catch i add_passenger blir addPass i for loopen ogiltig av någon anledning

   public void add_passenger()
    {
        try
        { 
 
            Console.WriteLine("How many passengers would you like to add?");
            int addPass = Convert.ToInt32(Console.ReadLine());
            
        }
        catch
        {
            Console.WriteLine("Please choose a number:");
        }

        for (int i = 0; i < addPass; i++)
        {
            while (true)
            { 
            //trycatch om anv matar in något annat än siffror
            //25 posiutioner, säg till om för många!
            Console.WriteLine("Write the age of the passenger you would like to add: ");
            try
            {
                int pass = Convert.ToInt32(Console.ReadLine());//Konvertera string till int
                passenger[i] = pass; //Adderar värdet till vektoren
                break;
            }
            catch
            {
                Console.WriteLine("Choose a number");
            }

Tillägg: 3 feb 2022 22:07

gjorde en public int addPass och då får jag det att fungera men menyn beter sig lite konstigt då och jag kickas ut till början om jag exempelvis skriver ett tecken i add pass

Programmeraren 3390
Postad: 3 feb 2022 22:09 Redigerad: 3 feb 2022 22:10

Problemet är att om du inte matar in ett tal så kommer du till catch, programmet skriver "Please choose a number:" men du kommer inte tillbaka till 

Console.WriteLine("How many passengers would you like to add?");
int addPass = Convert.ToInt32(Console.ReadLine());

Och dessutom är addPass deklarerad i ett block(inom ett par av måsvingar) och då finns den inte utanför blocket.

Principen är att du måste loopa tills du fått in ett korrekt värde. Sen kan du låta programmet gå vidare. Att catch:a ett fel gör ingen nytta om programmet inte sen gör om inläsningen.

Att använda en separat metod som jag skrev ovan är både enklast och snyggast.

steaktonight 19
Postad: 3 feb 2022 22:14 Redigerad: 3 feb 2022 22:15
Programmeraren skrev:

Problemet är att om du inte matar in ett tal så kommer du till catch, programmet skriver "Please choose a number:" men du kommer inte tillbaka till 

Console.WriteLine("How many passengers would you like to add?");
int addPass = Convert.ToInt32(Console.ReadLine());

Och dessutom är addPass deklarerad i ett block(inom ett par av måsvingar) och då finns den inte utanför blocket.

Principen är att du måste loopa tills du fått in ett korrekt värde. Sen kan du låta programmet gå vidare. Att catch:a ett fel gör ingen nytta om programmet inte sen gör om inläsningen.

Att använda en separat metod som jag skrev ovan är både enklast och snyggast.

 

 

löste det nu genom en public addPass och hade missat break;

 public void add_passenger()
    {
        while (true)
        { 
        try
        {

            Console.WriteLine("How many passengers would you like to add?");
            int addPass = Convert.ToInt32(Console.ReadLine());
            break;

        }
        catch
        {
            Console.WriteLine("Please choose a number:");

        }
    }

        for (int i = 0; i < addPass; i++)
        {
            while (true)
            { 
            //trycatch om anv matar in något annat än siffror
            //25 posiutioner, säg till om för många!
            Console.WriteLine("Write the age of the passenger you would like to add: ");
            try
            {
                int pass = Convert.ToInt32(Console.ReadLine());//Konvertera string till int
                passenger[i] = pass; //Adderar värdet till vektoren
                break;
            }
            catch
            {
                Console.WriteLine("Choose a number");
steaktonight 19
Postad: 3 feb 2022 22:17 Redigerad: 3 feb 2022 22:17

Vet att denna lösningen är lite rörig som jag har nu. Men det är den jag kommer köra på för det känns som det är här jag ligger i nivå just nu. Detta fattar jag. 

Det enda som jag har kvar är att hålla koll på när vektorn är full (25 tal)

 

Vill också tacka för all hjälp jag fått av dig programmeraren :)

Programmeraren 3390
Postad: 3 feb 2022 22:18

Nu har du en fungerande loop högst upp för att ta in addPass.
Du kan deklarera addPass innan while-loopen så funkar det.
int addPass = -1;

I for-loopen verkar du ha samma typ av konstruktion, det borde funka.

For-loopen kommer att bryta av sig själv eftersom du har "i < addPass" i den.

steaktonight 19
Postad: 3 feb 2022 22:18

edit det blev visst inte rätt ändå, nu kan jag inte skriva in några passagerare istället utan kommer till menu

Programmeraren 3390
Postad: 3 feb 2022 22:20

När programmet gör något "konstigt" är det enklast att lägga till utskrifter (som du tar bort när allt funkar).

Efter "int addPass = Convert.ToInt32(Console.ReadLine());", skriv ut addPass så du ser vad det blev.

Du kan göra samma sak i loopen där du sen tar in alla åldrar.

steaktonight 19
Postad: 3 feb 2022 22:37
Programmeraren skrev:

När programmet gör något "konstigt" är det enklast att lägga till utskrifter (som du tar bort när allt funkar).

Efter "int addPass = Convert.ToInt32(Console.ReadLine());", skriv ut addPass så du ser vad det blev.

Du kan göra samma sak i loopen där du sen tar in alla åldrar.

jag kickas ut till menu, komemr alltså inte vidare till for loopen nu när jag har try catch runt addPass

steaktonight 19
Postad: 3 feb 2022 22:40

Programmeraren 3390
Postad: 3 feb 2022 22:43

Nog bäst att du postar hela programmet här igen.

steaktonight 19
Postad: 3 feb 2022 22:54
using System;

namespace MinBuss
{
    class Program
    {
        public static void Main(string[] args)
        {
            var minbuss = new Buss();
            minbuss.Run();
            Console.Write("Press any key to exit the program......");
            Console.ReadKey();
        }
    }
}

class Buss
{
    public int[] passenger = new int[25];
    public int total_passenger;
    private int pass;
    public int addPass;

    public void Run()
    {
        int menu = -1;
        do
        {
            Console.WriteLine("*******************************************************");
            Console.WriteLine("Welcome to the bus simulator!");
            Console.WriteLine("Make your choice:");
            Console.WriteLine("1. Add passenger");
            Console.WriteLine("2. Check the age of the passengers on the bus");
            Console.WriteLine("3. Calculate the total age of the passengers");
            Console.WriteLine("0. Exit the program!");
            Console.WriteLine("******************************************************");
            //menu = int.Parse(Console.ReadLine());
            try
            {
                //Läser in användarens val, konverterar string till int och lagrar i variabeln menu.
                menu = int.Parse(Console.ReadLine());
            }
            catch
            {
                //Låter användaren veta att inmatning var felaktig.
                Console.WriteLine("Choose a number from the menu");
            }
            //switch och case meny som anropar våra metoder
            switch (menu)
            {
                case 1:
                    add_passenger();
                    break;

                case 2:
                    print_buss();
                    break;

                case 3:
                    calc_total_age();
                    break;



            }
        } while (menu != 0);
    }

    public void add_passenger()
    {
        //
        while (true)
        {
            try
            {

                Console.WriteLine("How many passengers would you like to add?");
                int addPass = Convert.ToInt32(Console.ReadLine());
                break;

            }
            catch
            {
                Console.WriteLine("Please choose a number:");

            }
        }

            for (int i = 0; i < addPass; i++)
            {
                while (true)
                {
                    //trycatch om anv matar in något annat än siffror
                    //25 posiutioner, säg till om för många!
                    Console.WriteLine("Write the age of the passenger you would like to add: ");
                    try
                    {
                        int pass = Convert.ToInt32(Console.ReadLine());//Konvertera string till int
                        passenger[i] = pass; //Adderar värdet till vektoren

                        break;
                    }
                    catch
                    {
                        Console.WriteLine("Choose a number");
                    }

                }

            }
        }
    

    public void print_buss()
    {
        Console.WriteLine("The ages of the passengers on the bus are: ");
        for (int i = 0; i < passenger.Length; i++)
        {
            Console.WriteLine(passenger[i] + "years old");
        }
    }


    public int calc_total_age()
    {
        int sum = 0;
        for (int i = 0; i < passenger.Length; i++)
        {
            sum += passenger[i];
        }
        int totalAge = sum;
        Console.WriteLine("The total age of the passengers is " + totalAge);
        return totalAge;
    }


}
Programmeraren 3390
Postad: 3 feb 2022 23:01 Redigerad: 3 feb 2022 23:02

Du deklarerar en ny "int addPass" när antalet ska matas in i början av add_passenger(), ta bort "int " framför.

Ta även bort "private in pass;" från början av Buss.
Du ska inte deklarera variabler med samma namn på flera ställen, förvirrande.

steaktonight 19
Postad: 3 feb 2022 23:04
Programmeraren skrev:

Du deklarerar en ny "int addPass" när antalet ska matas in i början av add_passenger(), ta bort "int " framför.

Ta även bort "private in pass;" från början av Buss.
Du ska inte deklarera variabler med samma namn på flera ställen, förvirrande.

aah, min miss. nu funkar det som det ska :) Tack för all hjälp

bara maxPassengers kvar. lyckas inte med den, tycker det blir så fruktansvärt rörigt. men ska jobba på det

Programmeraren 3390
Postad: 3 feb 2022 23:07

Du kan strunta i maxPassengers. Om du vill få till det, se till att den deklareras och sätts till 25 som första variabel i class Buss.

steaktonight 19
Postad: 3 feb 2022 23:15 Redigerad: 3 feb 2022 23:30
Programmeraren skrev:

Du kan strunta i maxPassengers. Om du vill få till det, se till att den deklareras och sätts till 25 som första variabel i class Buss.

skriver jag i över 25 st tal i add pass får jag choose a number i oändlighet. kan man ha två utgångar(utskrifter) och typ en break för att komma ur det?

steaktonight 19
Postad: 4 feb 2022 08:08 Redigerad: 4 feb 2022 08:09
using System;

namespace MinBuss
{
    class Program
    {
        public static void Main(string[] args)
        {
            var minbuss = new Buss();
            minbuss.Run();
            Console.Write("Press any key to exit the program......");
            Console.ReadKey();
        }
    }
}

class Buss
{
    public int[] passenger = new int[25];
    public int total_passenger;
    public int addPass;

    public void Run()
    {
        int menu = -1;
        do
        {
            Console.WriteLine("*******************************************************");
            Console.WriteLine("Welcome to the bus simulator!");
            Console.WriteLine("Make your choice:");
            Console.WriteLine("1. Add passenger");
            Console.WriteLine("2. Check the age of the passengers on the bus");
            Console.WriteLine("3. Calculate the total age of the passengers");
            Console.WriteLine("0. Exit the program!");
            Console.WriteLine("******************************************************");
            //menu = int.Parse(Console.ReadLine());
            try
            {
            //Läser in användarens val, konverterar string till int och lagrar i variabeln menu.
                menu = int.Parse(Console.ReadLine());
            }
            catch
            {
            //Låter användaren veta att inmatning var felaktig.
                Console.WriteLine("Choose a number from the menu");
            }
            //switch och case meny som anropar våra metoder
            switch (menu)
            {
                case 1:
                    add_passenger();
                    break;

                case 2:
                    printPass();
                    break;

                case 3:
                    calcAge();
                    break;



            }
        } while (menu != 0);
    }

    public void add_passenger()
    {
        //metod för att lägga till tal(passagerare) i våran vektor och spara deras ålder
        while (true)
        {
            try
            {
            //mata in antal passagerare
                Console.WriteLine("How many passengers would you like to add?");
                addPass = Convert.ToInt32(Console.ReadLine());
                break;

            }
            catch
            {
                Console.WriteLine("Please choose a number:");
            }
        }
            //mata in ålder
            for (int i = 0; i < addPass; i++)
            {
                while (true)
                {    
                    Console.WriteLine("Write the age of the passenger you would like to add: ");
                //Konvertera int och addera värdet till vektorn
                try
                {
                    int pass = Convert.ToInt32(Console.ReadLine());
                    passenger[i] = pass;
                    break;
                    }

                    catch
                    {
                        Console.WriteLine("Choose a number");
                    }

                }

            }
        }
    
    //Metod för att lista passagerarna och deras ålder sparade i vektorn
    public void printPass()
    {
        Console.WriteLine("The ages of the passengers on the bus are: ");
        for (int i = 0; i < passenger.Length; i++)
        {
            Console.WriteLine(passenger[i] + "years old");
        }
    }

    //metod för att räkna ut total ålder på passagerare. 
    public int calcAge()
    {
        int sum = 0;
        for (int i = 0; i < passenger.Length; i++)
        {
            sum += passenger[i];
        }
        int totalAge = sum;
        Console.WriteLine("The total age of the passengers is " + totalAge);
        return totalAge;
    }




}

 

Såhär ser koden ut nu. när jag uppnår 25 tal i vektorn i add_passenger så kommer jag till catch "please choose a number"  som loopas i oändlighet. Om jag vill ha en till utgång som "the bus is full" och gå åter till menyn. behöver jag använda mig av en bool och case då?

Programmeraren 3390
Postad: 4 feb 2022 08:43

Efter att du tagit in addPass, kontrollera att addPass inte är större än 25. Om det är det, sätt den till 25 och skriv ut att maxantalet är 25 och att du justerat till det.

Du kan också göra så att du skapar vektorn när du vet hur stor ben behöver vara. Efter att du tagit addPass kan du göra 

passenger = new int[assPass];

Då behöver du inte ha new int[25] vid deklarationen i början av class Buss.

Att det blir oändlig loop efter 25 stycken borde bara ske om du matar in ett större tal än 25 på antal passagerare. I så fall är det som händer att du försöker sätta in ålder med ett index som är större än 25 vilket orsakar ett exception eftersom du hamnar utanför vekorn. Då hamnar du i catch. Löses enligt ovan.

steaktonight 19
Postad: 4 feb 2022 15:24
Programmeraren skrev:

Efter att du tagit in addPass, kontrollera att addPass inte är större än 25. Om det är det, sätt den till 25 och skriv ut att maxantalet är 25 och att du justerat till det.

Du kan också göra så att du skapar vektorn när du vet hur stor ben behöver vara. Efter att du tagit addPass kan du göra 

passenger = new int[assPass];

Då behöver du inte ha new int[25] vid deklarationen i början av class Buss.

Att det blir oändlig loop efter 25 stycken borde bara ske om du matar in ett större tal än 25 på antal passagerare. I så fall är det som händer att du försöker sätta in ålder med ett index som är större än 25 vilket orsakar ett exception eftersom du hamnar utanför vekorn. Då hamnar du i catch. Löses enligt ovan.

 

 

 

Känner mig helt bränd nu, begöver jag deklarera 25 efter public int addpass

eller löser jag det med en if sats i metoden?

Programmeraren 3390
Postad: 4 feb 2022 16:40

Du deklararer den i början på Buss

class Buss {
  public int[] passenger;
  public int addPass;

Och du allokerar vektorn då du vet storleken:

public void add_passenger() {
  while (true) {
    try {
      Console.WriteLine("How many passengers would you like to add?");
      addPass = Convert.ToInt32(Console.ReadLine());
      if (addPass > 25) {
        Console.WriteLine("25 is max");
        continue;   // back to start of loop
      }
      passenger = new int|addPass];
      break;

Har som vanligt inte kompilerat så kan vara syntaxfel etc.

Svara
Close