3 svar
604 visningar
syon901 behöver inte mer hjälp
syon901 4 – Fd. Medlem
Postad: 3 maj 2021 03:36 Redigerad: 3 maj 2021 03:37

Sorterar "tomma" platser vektor (Bussen)

Hej!

Jag vet inte hur jag ska lösa detta och skulle behöva lite hjälp.

Ex: När jag lägger till 10 passagerare, kan jag beräkna total ålder, plocka fram äldsta/yngsta passageraren osv. Allt funkar bra, tills jag väljer att sortera bussen efter ålder. Då visas även de "tomma" vektorerna (vilket jag i värsta fall hade kunnat leva med), men efter detta fungerar inte mina andra metoder heller, lägsta ålder visas som 0, trots att den lägsta jag angett varit 5 t.ex. 

Hur får jag min metod till att endast sortera de jag angett? Jag har ju fått det till att funka t.ex. i metoden print_buss. Men nu står det still..

  class Buss
    {
        public int[] passenger = new int[25]; //vektor deklarerad
        public int new_passengers; //int där vi lägger det vi använder från vektorn
        public void Run()

        {
            Console.WriteLine("***************************");
            Console.WriteLine("Welcome to the bus!");
            Console.WriteLine("***************************");
            Console.WriteLine(" ");
            Console.WriteLine(" ");
            Console.WriteLine(" ");
            int menu; //int meny deklareras
            do
            {
                Console.WriteLine("***************************************************"); //menyn användaren ser
                Console.WriteLine("Chose an action:");
                Console.WriteLine("***************************************************");
                Console.WriteLine("1. Add passenger");
                Console.WriteLine("2. Check the age of all passengers.");
                Console.WriteLine("3. Calculate the total age of all passengers.");
                Console.WriteLine("4. Calculate the average age of the passengers.");
                Console.WriteLine("5. Identify the oldest passenger.");
                Console.WriteLine("6. Identify the youngest passenger.");
                Console.WriteLine("7. Identify passengers between chosen ages.");
                Console.WriteLine("8. Sort passengers after age. ");
                Console.WriteLine("0. Quit program. ");
                Console.WriteLine("***************************************************");
                Console.WriteLine(" ");


                menu = int.Parse(Console.ReadLine()); //översätter string till int


                switch (menu) //switch case meny 
                {
                    case 1:
                        Add_passenger();
                        break;

                    case 2:
                        Print_buss();
                        break;

                    case 3:
                        Calc_total_age();
                        break;

                    case 4:
                        Calc_average_age();
                        break;

                    case 5:
                        Max_age();
                        break;

                    case 6:
                        Min_age();
                        break;

                    case 7:
                        Find_age();
                        break;

                    case 8:
                        Sort_buss();
                        break;

                    case 0:
                        menu = 0;
                        break;

                    default:
                        Console.WriteLine("This action is not available, please try again by typing a number from the menu (0 - 8).");
                        break;
                }

            } while (menu != 0); //avslutas! 
        }
        public void Add_passenger() //metod för att lägga till passagerare 
        {
            Console.WriteLine("How many passengers would you like to add?");
            try //try catch för att vi endast vill ha siffror 
            {
                int size = Convert.ToInt32(Console.ReadLine());
                if (size > 25) //endast siffror under 25 är ok 
                {
                    Console.WriteLine("The bus doesn't have that many seats available, sorry."); //annars skrivs detta ut
                }
                else //om de skriver siffror under 25
                {
                    for (int i = 0; i < size; i++) //så körs for-loopen
                    {
                        Console.WriteLine("Add a passenger by writing the age: ");
                        int added_passengers = Convert.ToInt32(Console.ReadLine()); //översätt svaret till int och lagra i vår variabel
                        passenger[i] = added_passengers; //lagra i vektorn
                        new_passengers++; //kör om på nytt                     
                    }
                }
            }
            catch
            {
                Console.WriteLine("You can only type in the passengers age, please try again."); //visas om de skriver bokstäver 
            }
        }

        public void Print_buss() //metod för att skriva ut alla passagerare 
        {
            for (int i = 0; i < new_passengers; i++) //for-loop som kör igenom alla_passagerare-variabeln

            {
                Console.WriteLine("This passenger is " + passenger[i] + " years old."); //skriver ut passagerarna i vektorn
                Console.WriteLine(" ");
            }
        }

        public void Calc_total_age() //metod för att räkna alla passagerares ålder
        {
            int sum = 0;
            for (int i = 0; i < new_passengers; i++) //for-loop som kör igenom alla_passagerare-variabeln
            {
                sum += passenger[i]; //läser in passagerarna från vektorn & adderar och lägger in i variabeln sum
            }
            Console.WriteLine("The total age of the passengers is " + sum + ".");
            Console.WriteLine(" ");
        }
        public void Calc_average_age() //metod för att räkna ut medelåldern
        {
            int sum = 0;
            for (int i = 0; i < new_passengers; i++) //for-loop som kör igenom alla_passagerare-variabeln
            {
                sum += passenger[i]; //läser in passagerarna från vektorn & adderar och lägger in i variabeln sum
            }
            double dsum = Convert.ToDouble(sum); //översätter till en double 
            double dsum1 = dsum / new_passengers; //räknar ut medelåldern
            Console.WriteLine("The passengers average age sums up to " + dsum1 + " years old.");
            Console.WriteLine(" ");
        }
        public int Max_age() //metod för att räkna ut maxåldern
        {
            int maxAge = 0; //ny variabel
            for (int i = 0; i < new_passengers; i++) //for-loop som kör igenom alla_passagerare-variabeln
            {
                if (passenger[i] > maxAge)
                {
                    maxAge = passenger[i]; //lägger alla i vektorn i variabeln maxAge
                }
            }
            Console.WriteLine("The oldest passenger is " + maxAge + " years old.");
            Console.WriteLine(" ");
            return maxAge;
        }

        public int Min_age() //metod för att räkna ut minåldern
        {
            int minAge = 2000; //ny variabel
            for (int i = 0; i < new_passengers; i++) //for-loop som kör igenom alla_passagerare-variabeln
            {
                if (passenger[i] < minAge)
                {
                    minAge = passenger[i]; //lägger alla i vektorn i variabeln minAge
                }
            }
            Console.WriteLine("The youngest passenger is " + minAge + " years old.");
            Console.WriteLine(" ");
            return minAge;
        }

        public void Find_age()
        {
            {
                Console.WriteLine("Whats the youngest age you want to search for?"); //användaren får välja lägsta ålder
                int low = Convert.ToInt32(Console.ReadLine()); //lagrar i int
                Console.WriteLine("Whats the oldest age you want to search for?");
                int high = Convert.ToInt32(Console.ReadLine());
                Console.WriteLine("Passengers between " + low + " and " + high + " sits on seats: ");
                for (int i = 0; i < new_passengers; i++) //for-loop som kör igenom "alla_passagerare"-variabeln
                {
                    if (passenger[i] > low || passenger[i] > high) //identifierar spannet 
                    {
                        Console.WriteLine("Seat " + i); //skriver ut sätet
                    }
                }
                Console.WriteLine(" ");
                Console.WriteLine("NOTE; There is 25 seats numbered between 0 and 24."); //eftersom det börjar på noll... 
            }
        }
        public void Sort_buss()
        {
            int max = passenger.Length - 1;
            for (int i = 1; i < max; i++)
            {
                int nrLeft = max - i;

                for (int j = 0; j < nrLeft; j++)
                {
                    if (passenger[j] > passenger[j + 1])
                    {
                        int temp = passenger[j];
                        passenger[j] = passenger[j + 1];
                        passenger[j + 1] = temp;
                    }
                }
            }
            for (int i = 1; i < passenger.Length; i++)
                Console.WriteLine(passenger[i]);
        }
        class Program
        {
            static void Main(string[] args)
            {
                var minbuss = new Buss(); //programmet
                minbuss.Run(); //körs
                Console.Write("Press any key to continue...");
                Console.ReadKey(true);
            }
        }
    }
}
Yngve 40279 – Livehjälpare
Postad: 3 maj 2021 07:21 Redigerad: 3 maj 2021 07:25

Hej och välkommen till Pluggakuten!

Din kod är baserad på att ålder 0 betyder "tom plats" och att alla passagerare sitter "längst fram", i bussen dvs i början av vektorn passenger.

Det betyder att när du i sorteringsalgoritmen kommer fram till en ålder som är 0 så är den platsen tom och ska inte sorteras. Du kan då använda continue i loopen för att skippa just den sorteringen.

Så länge du behåller slla passagerare längst fram så kan du istället använda break för att avsluta loopen. Detta eftersom du vet att när du väl stöter på en tom plats så kommer även platserna bakom den att vara tomma.

Fundera på skillnaderna och vilken metod som är bäst för dig.

syon901 4 – Fd. Medlem
Postad: 20 maj 2021 12:02

Tack! Efter många om och men fick jag rätt på det 

anderssonasan19 1
Postad: 2 aug 2023 18:43 Redigerad: 3 aug 2023 00:55
syon901 skrev:

Tack! Efter många om och men fick jag rätt på det 

Hur löste du sort bus vad i koden ändrade du? :)

public void Sort_buss() 
{ 
	int max = passenger.Length - 1; 

	for (int i = 1; i < max; i++) 
	{ 
		int nrLeft = max - i; 
		for (int j = 0; j < nrLeft; j++) 
		{ 
			if (passenger[j] > passenger[j + 1]) 
			{
				int temp = passenger[j]; 
				passenger[j] = passenger[j + 1]; 
				passenger[j + 1] = temp; } 
			} 
		} 
	
	for (int i = 1; i < passenger.Length; i++) 
	{
		Console.WriteLine(passenger[i]);
	}
}
Svara
Close