Programmering 1 C# projektplanering

Permalänk

Programmering 1 C# projektplanering

Hej!
Jag läser programmering 1 på distans och nu håller jag på med den sista uppgiften i kursen. Jag ska skapa ett program som ska kunna hålla reda på åldrarna på olika biobesökare. Jag ska kunna lägga till besökare, skriva ut alla besökarnas åldrar, räkna ut alla besökares totala ålder, beräkna den genomsnittliga åldern, räkna ut vilken besökare som är äldst, visa alla besökare mellan ett valt åldersspann och sortera besökarna utifrån deras ålder. Jag har kommit en bra bit, men jag har stött på några problem som jag har försökt lösa i flera timmar både själv och med lärarens stöttning, men det går bara inte. Såhär ser min kod ut hittills:

class Bio { public int[] visitor = new int[20]; //vektor deklarerad public int new_visitors; //int där vi lägger det vi använder från vektorn public void Run() { Console.WriteLine("---------------------------"); Console.WriteLine("Välkommen till denna besöksregistrerare för biografer!"); Console.WriteLine("---------------------------"); Console.WriteLine(" "); int menu; //int meny deklareras do { Console.WriteLine("---------------------------"); //menyn användaren ser Console.WriteLine("Välj ett alternativ: "); Console.WriteLine("1. Lägg till besökare. "); Console.WriteLine("2. Skriv ut åldern på alla besökarna. "); Console.WriteLine("3. Beräkna den sammanlagda åldern på besökarna. "); Console.WriteLine("4. Beräkna medelåldern på besökarna. "); Console.WriteLine("5. Identifiera den äldsta besökaren. "); Console.WriteLine("6. Identifiera besökarna inom ett valt åldersspann. "); Console.WriteLine("7. Sortera besökarna efter ålder. "); Console.WriteLine("0. Avsluta programmet. "); Console.WriteLine("---------------------------"); Console.WriteLine(" "); menu = int.Parse(Console.ReadLine()); //översätter vad användaren skriver in till en int switch (menu) //switch case meny { case 1: Add_visitor(); break; case 2: Print_age_in_cinema(); break; case 3: Calculate_total_age(); break; case 4: Calculate_average_age(); break; case 5: Oldest_visitor(); break; case 6: Find_visitors_age(); break; case 7: Sort_age(); break; case 0: menu = 0; break; } } while (menu != 0); //avslutas! } public void Add_visitor() //metod för att lägga till besökare { Console.WriteLine("Hur många besökare vill du lägga till?"); try //try catch för att vi endast vill ha siffror { int size = Convert.ToInt32(Console.ReadLine()); if (size + new_visitors > 20) //endast siffror under 20 är ok { Console.WriteLine("Biosalongen får endast ta emot 20 besökare p.g.a. Coronarestriktionerna. Försök igen."); //annars skrivs detta ut } else //om de skriver siffror under 20 { for (int i = 0; i < size; i++) //så körs for-loopen { Console.WriteLine("Lägg till en besökare genom att skriva in hens ålder: "); int added_visitors = Convert.ToInt32(Console.ReadLine()); //översätt svaret till int och lagra i vår variabel visitor[i] = added_visitors; //lagra i vektorn new_visitors++; //kör om på nytt } } } catch { Console.WriteLine("Du kan endast fylla i besökarens ålder! Försök igen."); //visas om de skriver bokstäver } } public void Print_age_in_cinema() //metod för att skriva ut alla passagerare { for (int i = 0; i < visitor.Length; i++) //for-loop som kör igenom åldern på alla besökare { if (visitor[i] > 0) { Console.WriteLine("Besökarnas ålder är " + visitor[i]); //skriver ut åldrarna i vektorn Console.WriteLine(" "); } if (visitor[i] < 1) { Console.WriteLine("Platsen är ledig"); } } } public void Calculate_total_age() //metod för att räkna alla besökarnas ålder { int sum = 0; for (int i = 0; i < new_visitors; i++) //for-loop som kör igenom alla_besökarna-variabeln { sum += visitor[i]; //läser in besökarna från vektorn & adderar och lägger in i variabeln sum } Console.WriteLine("Den sammanlagda åldern på alla besökare är " + sum + "."); Console.WriteLine(" "); } public void Calculate_average_age() //metod för att räkna ut medelåldern { int sum = 0; for (int i = 0; i < new_visitors; i++) //for-loop som kör igenom alla-besökare-variabeln { sum += visitor[i]; //läser in besökarna från vektorn & adderar och lägger in i variabeln sum } double doublesum = Convert.ToDouble(sum); //översätter till en double double doublesum1 = doublesum / new_visitors; //räknar ut medelåldern Console.WriteLine("Medelåldern på besökarna är " + doublesum1 + " år."); Console.WriteLine(" "); } public int Oldest_visitor() //metod för att räkna ut maxåldern { int mostAge = 0; //ny variabel for (int i = 0; i < new_visitors; i++) //for-loop som kör igenom alla-besökarna-variabeln { if (visitor[i] > mostAge) { mostAge = visitor[i]; //lägger alla i vektorn i variabeln mostAge } } Console.WriteLine("Den äldsta besökaren är " + mostAge + " år gammal."); Console.WriteLine(" "); return mostAge; } public void Find_visitors_age() { { Console.WriteLine("Vilken är den lägsta åldern du vill ha i sökspannet?"); //användaren får välja lägsta ålder int low = Convert.ToInt32(Console.ReadLine()); //lagrar i int Console.WriteLine("Vilken är den högsta åldern du vill ha i sökspannet?"); int high = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Besökarna mellan åldern " + low + " och " + high + " sitter på: "); for (int i = 0; i < new_visitors; i++) //for-loop som kör igenom alla-besökarna-variabeln { if (visitor[i] > low || visitor[i] < high) //identifierar spannet { Console.WriteLine("Biosäte " + i); //skriver ut sätesnumren } } Console.WriteLine(" "); Console.WriteLine("OBS; Det finns 20 säten och de är numrerade mellan 0-19."); //pga att det börjar på noll... } } public void Sort_age() { int max = visitor.Length - 1; for (int i = 0; i < max; i++) { int nrLeft = max - i; for (int j = 0; j < nrLeft; j++) { if (visitor[j] < visitor[j + 1]) { int temp = visitor[j]; visitor[j] = visitor[j + 1]; visitor[j + 1] = temp; } } } for (int i = 0; i < visitor.Length; i++) Console.WriteLine(" " + visitor[i]); } class Program { public static void Main(string[] args) //programmetoden { var minbio = new Bio(); //programmet minbio.Run(); //körs Console.Write("Tryck på någon tangent för att fortsätta avslutningen."); Console.ReadKey(true); } } } }

Det som inte funkar är:
1. Metoden som ska skriva ut alla besökarnas åldrar
2. Metoden som ska beräkna den totala summan av alla besökarnas åldrar
3. Metoden som ska visa alla besökarna inom ett visst åldersspann
4. Metoden som ska sortera besökarna utifrån deras ålder

Metoden som ska visa alla besökarna inom ett visst åldersspann funkar aldrig, men alla de andra metoderna som jag behöver hjälp med fungerar som de ska om man bara lägger till besökare i en omgång. Alltså om jag väljer att lägga in fem besökare på en och samma gång och sedan skriva ut att deras åldrar så funkar det. Det funkar dock inte om jag först lägger till två och sedan väljer att lägga till tre till och sedan skriva ut deras åldrar. Då skrivs endast åldrarna på besökarna som jag la till i sista omgången, ut.
Jag hoppas att jag har varit tydlig med vad som är problemet, annars är det bara att ställa frågor.
Jag menar såklart inte att ni ska göra jobbet åt mig, vill bara få andras (mer erfarna programmerare) synpunkter. All hjälp uppskattas!
Tack på förhand

Code-taggar
Permalänk
Medlem

Ett litet tips bara, använd PascalCase (MinMetod) på metod-namn och camelCase (minVariabel) på variabel-namn.

Permalänk
Medlem

Problemet med att det inte fungerar att lägga till besökare är för att din metod för att lägga till besökare alltid börjar från början av arrayen, så den skriver över gamla besökare.

I din metod för att skriva ut ålderspann så kollar du för övrigt om åldern är större än minimumvärdet eller mindre än maximumvärdet, är det verkligen vad du vill göra?

Ett annat problem är att du blandar hur du hanterar vilka säten som är fyllda, på vissa ställen använder du att tomma säten har värdet 0 medan du på andra ställen antar att de första new_visitors sätens är fyllda. Vad händer t.ex. om du inte fyller alla platser, kör Sort_age, och sen t.ex. Calculate_total_age?

Använd för övrigt gärna code-taggar när du postar kod så att formatering bevaras:
[code]
Kod här
[/code]

Permalänk
Skrivet av ChrisDev:

Ett litet tips bara, använd PascalCase (MinMetod) på metod-namn och camelCase (minVariabel) på variabel-namn.

Tack så mycket för tipset! Jag uppskattar det verkligen

Permalänk
Medlem

Testade funktionerna 1-7 och de funkar.

Istället för att skriva

Console.WriteLine(" ");

Kan du skriva \n i slutet av din Console.WriteLine ovanför för att skapa en tom rad efter den
Exempelvis:

Console.WriteLine("Den äldsta besökaren är " + mostAge + " år gammal."); Console.WriteLine(" ");

blir

Console.WriteLine("Den äldsta besökaren är " + mostAge + " år gammal.\n");

En reflektion jag gör på funktionen Find_visitors_age är att du använder > istället för >= samt < istället för <= för att den lägsta åldern blir inte att inkludera den lägsta åldern. Så skriver jag t.ex. att lägsta åldern är 4 så måste det vara större än 4. Samma tvärtom, tar jag en person som max får vara 90 så kommer inte 90 med, bara 89.

Så > hade jag bytt till >= och < till <= på raden för

if (visitor[i] > low || visitor[i] < high) //identifierar spannet

PS:
Om du skriver (i+1) istället för bara i på

Console.WriteLine("Biosäte " + i);

slipper du att den räknar från 0

Console.WriteLine("Biosäte " + (i+1));

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Skrivet av freddyfresh:

Testade funktionerna 1-7 och de funkar.

Istället för att skriva

Console.WriteLine(" ");

Kan du skriva \n i slutet av din Console.WriteLine ovanför för att skapa en tom rad efter den
Exempelvis:

Console.WriteLine("Den äldsta besökaren är " + mostAge + " år gammal."); Console.WriteLine(" ");

blir

Console.WriteLine("Den äldsta besökaren är " + mostAge + " år gammal.\n");

En reflektion jag gör på funktionen Find_visitors_age är att du använder > istället för >= samt < istället för <= för att den lägsta åldern blir inte att inkludera den lägsta åldern. Så skriver jag t.ex. att lägsta åldern är 4 så måste det vara större än 4. Samma tvärtom, tar jag en person som max får vara 90 så kommer inte 90 med, bara 89.

Så > hade jag bytt till >= och < till <= på raden för

if (visitor[i] > low || visitor[i] < high) //identifierar spannet

PS:
Om du skriver (i+1) istället för bara i på

Console.WriteLine("Biosäte " + i);

slipper du att den räknar från 0

Console.WriteLine("Biosäte " + (i+1));

Tack så jättemycket för feedbacken! Nu lärde jag mig en hel del nya saker, och min kod fick en välbehövlig makeover

Permalänk
Medlem

Inga problem alls, skriv här om du kommer på något mer!

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Moderator
Festpilot 2020, Antiallo

@programmeringärsvårt:

Hipp hopp och välkommen.
Jag gav ditt första inlägg lite kärlek i form av [code]-taggar som nämndes tidigare i tråden

/Moderator

Visa signatur

 | PM:a Moderatorerna | Kontaktformuläret | Geeks Discord |
Testpilot, Skribent, Moderator & Geeks Gaming Huvudadmin

Permalänk

Hej igen allihopa och tack så otroligt mycket för all hjälp! Nu funkar allting i koden som det ska om jag lägger in besökare i endast en omgång. Dock så fungerar det inte som det ska om jag lägger in besökare i fler omgångar. Då körs programmet endast med de nya värdena som lagts in i den senaste omgången. Dessa värden ersätter alltså de redan lagrade värdena.
Vet inte var problemet ligger och hur jag ska kunna få med alla värdena från alla omgångarna?
Som sagt så menar jag inte att ni ska göra själva jobbet och ge mig lösningen, utan jag vill bara ha hjälp med att förstå var problemet är och vad som skapat det😅
Här är min lite uppdaterade kod:

class Bio { public int[] visitor = new int[20]; //vektor deklarerad public int newVisitors; //int där vi lägger det vi använder från vektorn public void Run() { Console.WriteLine("---------------------------"); Console.WriteLine("Välkommen till denna besöksregistrerare för biografer!"); Console.WriteLine("---------------------------"); Console.WriteLine(" "); int menu; //int meny deklareras do { Console.WriteLine("---------------------------"); //menyn användaren ser Console.WriteLine("Välj ett alternativ: "); Console.WriteLine("1. Lägg till besökare. "); Console.WriteLine("2. Skriv ut åldern på alla besökarna. "); Console.WriteLine("3. Beräkna den sammanlagda åldern på besökarna. "); Console.WriteLine("4. Beräkna medelåldern på besökarna. "); Console.WriteLine("5. Identifiera den äldsta besökaren. "); Console.WriteLine("6. Identifiera besökarna inom ett valt åldersspann. "); Console.WriteLine("7. Sortera besökarna efter ålder. "); Console.WriteLine("0. Avsluta programmet. "); Console.WriteLine("---------------------------"); Console.WriteLine(" "); menu = int.Parse(Console.ReadLine()); //översätter vad användaren skriver in till en int switch (menu) //switch case meny { case 1: AddVisitor(); break; case 2: PrintAge(); break; case 3: CalculateTotalAge(); break; case 4: CalculateAverageAge(); break; case 5: OldestVisitor(); break; case 6: FindVisitors(); break; case 7: SortAge(); break; case 0: menu = 0; break; } } while (menu != 0); //avslutas! } public void AddVisitor() //metod för att lägga till besökare { Console.WriteLine("Hur många besökare vill du lägga till?"); try //try catch för att vi endast vill ha siffror { int size = Convert.ToInt32(Console.ReadLine()); if (size + newVisitors > 20) //endast siffror under 20 är ok { Console.WriteLine("Biosalongen får endast ta emot 20 besökare p.g.a. Coronarestriktionerna. Försök igen."); //annars skrivs detta ut } else //om de skriver siffror under 20 { for (int i = 0; i < size; i++) //så körs for-loopen { Console.WriteLine("Lägg till en besökare genom att skriva in hens ålder: "); int addedVisitors = Convert.ToInt32(Console.ReadLine()); //översätt svaret till int och lagra i vår variabel visitor[i] = addedVisitors; //lagra i vektorn newVisitors++; //kör om på nytt } } } catch { Console.WriteLine("Du kan endast fylla i besökarens ålder! Försök igen."); //visas om de skriver bokstäver } } public void PrintAge() //metod för att skriva ut alla passagerare { for (int i = 0; i < visitor.Length; i++) //for-loop som kör igenom åldern på alla besökare { if (visitor[i] > 0) { Console.WriteLine("Besökarnas ålder är " + visitor[i]); //skriver ut åldrarna i vektorn Console.WriteLine(" "); } if (visitor[i] < 1) { Console.WriteLine("Platsen är ledig"); } } } public void CalculateTotalAge() //metod för att räkna alla besökarnas ålder { int sum = 0; for (int i = 0; i < newVisitors; i++) //for-loop som kör igenom alla_besökarna-variabeln { sum += visitor[i]; //läser in besökarna från vektorn & adderar och lägger in i variabeln sum } Console.WriteLine("Den sammanlagda åldern på alla besökare är " + sum + "."); Console.WriteLine(" "); } public void CalculateAverageAge() //metod för att räkna ut medelåldern { int sum = 0; for (int i = 0; i < newVisitors; i++) //for-loop som kör igenom alla-besökare-variabeln { sum += visitor[i]; //läser in besökarna från vektorn & adderar och lägger in i variabeln sum } double doublesum = Convert.ToDouble(sum); //översätter till en double double doublesum1 = doublesum / newVisitors; //räknar ut medelåldern Console.WriteLine("Medelåldern på besökarna är " + doublesum1 + " år."); Console.WriteLine(" "); } public int OldestVisitor() //metod för att räkna ut maxåldern { int mostAge = 0; //ny variabel for (int i = 0; i < newVisitors; i++) //for-loop som kör igenom alla-besökarna-variabeln { if (visitor[i] > mostAge) { mostAge = visitor[i]; //lägger alla i vektorn i variabeln mostAge } } Console.WriteLine("Den äldsta besökaren är " + mostAge + " år gammal. \n"); return mostAge; } public void FindVisitors() { { Console.WriteLine("Vilken är den lägsta åldern du vill ha i sökspannet?"); //användaren får välja lägsta ålder int low = Convert.ToInt32(Console.ReadLine()); //lagrar i int Console.WriteLine("Vilken är den högsta åldern du vill ha i sökspannet?"); int high = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Besökarna mellan åldern " + low + " och " + high + " sitter på: "); for (int i = 0; i < newVisitors; i++) //for-loop som kör igenom alla-besökarna-variabeln { if (visitor[i] >= low && visitor[i] <= high) //identifierar spannet { Console.WriteLine("Biosäte " + (i+1)); //skriver ut sätesnumren } } } } public void SortAge() { int max = visitor.Length - 1; for (int i = 0; i < max; i++) { int nrLeft = max - i; for (int j = 0; j < nrLeft; j++) { if (visitor[j] < visitor[j + 1]) { int temp = visitor[j]; visitor[j] = visitor[j + 1]; visitor[j + 1] = temp; } } } for (int i = 0; i < visitor.Length; i++) Console.WriteLine(" " + visitor[i]); } class Program { public static void Main(string[] args) //programmetoden { var minbio = new Bio(); //programmet minbio.Run(); //körs Console.Write("Tryck på någon tangent för att fortsätta avslutningen."); Console.ReadKey(true); } } } }

Permalänk
Medlem
Skrivet av programmeringärsvårt:

Hej igen allihopa och tack så otroligt mycket för all hjälp! Nu funkar allting i koden som det ska om jag lägger in besökare i endast en omgång. Dock så fungerar det inte som det ska om jag lägger in besökare i fler omgångar. Då körs programmet endast med de nya värdena som lagts in i den senaste omgången. Dessa värden ersätter alltså de redan lagrade värdena.
Vet inte var problemet ligger och hur jag ska kunna få med alla värdena från alla omgångarna?
Som sagt så menar jag inte att ni ska göra själva jobbet och ge mig lösningen, utan jag vill bara ha hjälp med att förstå var problemet är och vad som skapat det😅
Här är min lite uppdaterade kod:

class Bio { public int[] visitor = new int[20]; //vektor deklarerad public int newVisitors; //int där vi lägger det vi använder från vektorn public void Run() { Console.WriteLine("---------------------------"); Console.WriteLine("Välkommen till denna besöksregistrerare för biografer!"); Console.WriteLine("---------------------------"); Console.WriteLine(" "); int menu; //int meny deklareras do { Console.WriteLine("---------------------------"); //menyn användaren ser Console.WriteLine("Välj ett alternativ: "); Console.WriteLine("1. Lägg till besökare. "); Console.WriteLine("2. Skriv ut åldern på alla besökarna. "); Console.WriteLine("3. Beräkna den sammanlagda åldern på besökarna. "); Console.WriteLine("4. Beräkna medelåldern på besökarna. "); Console.WriteLine("5. Identifiera den äldsta besökaren. "); Console.WriteLine("6. Identifiera besökarna inom ett valt åldersspann. "); Console.WriteLine("7. Sortera besökarna efter ålder. "); Console.WriteLine("0. Avsluta programmet. "); Console.WriteLine("---------------------------"); Console.WriteLine(" "); menu = int.Parse(Console.ReadLine()); //översätter vad användaren skriver in till en int switch (menu) //switch case meny { case 1: AddVisitor(); break; case 2: PrintAge(); break; case 3: CalculateTotalAge(); break; case 4: CalculateAverageAge(); break; case 5: OldestVisitor(); break; case 6: FindVisitors(); break; case 7: SortAge(); break; case 0: menu = 0; break; } } while (menu != 0); //avslutas! } public void AddVisitor() //metod för att lägga till besökare { Console.WriteLine("Hur många besökare vill du lägga till?"); try //try catch för att vi endast vill ha siffror { int size = Convert.ToInt32(Console.ReadLine()); if (size + newVisitors > 20) //endast siffror under 20 är ok { Console.WriteLine("Biosalongen får endast ta emot 20 besökare p.g.a. Coronarestriktionerna. Försök igen."); //annars skrivs detta ut } else //om de skriver siffror under 20 { for (int i = 0; i < size; i++) //så körs for-loopen { Console.WriteLine("Lägg till en besökare genom att skriva in hens ålder: "); int addedVisitors = Convert.ToInt32(Console.ReadLine()); //översätt svaret till int och lagra i vår variabel visitor[i] = addedVisitors; //lagra i vektorn newVisitors++; //kör om på nytt } } } catch { Console.WriteLine("Du kan endast fylla i besökarens ålder! Försök igen."); //visas om de skriver bokstäver } } public void PrintAge() //metod för att skriva ut alla passagerare { for (int i = 0; i < visitor.Length; i++) //for-loop som kör igenom åldern på alla besökare { if (visitor[i] > 0) { Console.WriteLine("Besökarnas ålder är " + visitor[i]); //skriver ut åldrarna i vektorn Console.WriteLine(" "); } if (visitor[i] < 1) { Console.WriteLine("Platsen är ledig"); } } } public void CalculateTotalAge() //metod för att räkna alla besökarnas ålder { int sum = 0; for (int i = 0; i < newVisitors; i++) //for-loop som kör igenom alla_besökarna-variabeln { sum += visitor[i]; //läser in besökarna från vektorn & adderar och lägger in i variabeln sum } Console.WriteLine("Den sammanlagda åldern på alla besökare är " + sum + "."); Console.WriteLine(" "); } public void CalculateAverageAge() //metod för att räkna ut medelåldern { int sum = 0; for (int i = 0; i < newVisitors; i++) //for-loop som kör igenom alla-besökare-variabeln { sum += visitor[i]; //läser in besökarna från vektorn & adderar och lägger in i variabeln sum } double doublesum = Convert.ToDouble(sum); //översätter till en double double doublesum1 = doublesum / newVisitors; //räknar ut medelåldern Console.WriteLine("Medelåldern på besökarna är " + doublesum1 + " år."); Console.WriteLine(" "); } public int OldestVisitor() //metod för att räkna ut maxåldern { int mostAge = 0; //ny variabel for (int i = 0; i < newVisitors; i++) //for-loop som kör igenom alla-besökarna-variabeln { if (visitor[i] > mostAge) { mostAge = visitor[i]; //lägger alla i vektorn i variabeln mostAge } } Console.WriteLine("Den äldsta besökaren är " + mostAge + " år gammal. \n"); return mostAge; } public void FindVisitors() { { Console.WriteLine("Vilken är den lägsta åldern du vill ha i sökspannet?"); //användaren får välja lägsta ålder int low = Convert.ToInt32(Console.ReadLine()); //lagrar i int Console.WriteLine("Vilken är den högsta åldern du vill ha i sökspannet?"); int high = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Besökarna mellan åldern " + low + " och " + high + " sitter på: "); for (int i = 0; i < newVisitors; i++) //for-loop som kör igenom alla-besökarna-variabeln { if (visitor[i] >= low && visitor[i] <= high) //identifierar spannet { Console.WriteLine("Biosäte " + (i+1)); //skriver ut sätesnumren } } } } public void SortAge() { int max = visitor.Length - 1; for (int i = 0; i < max; i++) { int nrLeft = max - i; for (int j = 0; j < nrLeft; j++) { if (visitor[j] < visitor[j + 1]) { int temp = visitor[j]; visitor[j] = visitor[j + 1]; visitor[j + 1] = temp; } } } for (int i = 0; i < visitor.Length; i++) Console.WriteLine(" " + visitor[i]); } class Program { public static void Main(string[] args) //programmetoden { var minbio = new Bio(); //programmet minbio.Run(); //körs Console.Write("Tryck på någon tangent för att fortsätta avslutningen."); Console.ReadKey(true); } } } }

Ditt problem handlar om en klassisk utmaning med länkad lista. Du måste nämligen lagra värdena i minnet. Föreställ dig ett tåg, varje gång du kör om programmet så förlängs tåget med en vagn. Det gäller att hålla koll på lok+vagnarna. Du hanterar också dynamiskt minnesallokering. Så din array som lagrar informationen utökas allt eftersom du kör programmet. Så när du kör summeringen då kollar den hur stor arrayen är och sen kör alla värdena. Var 20 år sen jag programmerade C++.

Permalänk
Medlem
Skrivet av programmeringärsvårt:

Hej igen allihopa och tack så otroligt mycket för all hjälp! Nu funkar allting i koden som det ska om jag lägger in besökare i endast en omgång. Dock så fungerar det inte som det ska om jag lägger in besökare i fler omgångar. Då körs programmet endast med de nya värdena som lagts in i den senaste omgången. Dessa värden ersätter alltså de redan lagrade värdena.
Vet inte var problemet ligger och hur jag ska kunna få med alla värdena från alla omgångarna?

Missade du mitt tidigare inlägg som svarade på detta, eller är det något som är oklart?

Permalänk
Skrivet av perost:

Problemet med att det inte fungerar att lägga till besökare är för att din metod för att lägga till besökare alltid börjar från början av arrayen, så den skriver över gamla besökare.

I din metod för att skriva ut ålderspann så kollar du för övrigt om åldern är större än minimumvärdet eller mindre än maximumvärdet, är det verkligen vad du vill göra?

Ett annat problem är att du blandar hur du hanterar vilka säten som är fyllda, på vissa ställen använder du att tomma säten har värdet 0 medan du på andra ställen antar att de första new_visitors sätens är fyllda. Vad händer t.ex. om du inte fyller alla platser, kör Sort_age, och sen t.ex. Calculate_total_age?

Använd för övrigt gärna code-taggar när du postar kod så att formatering bevaras:
[code]
Kod här
[/code]

Tusen tack för ditt svar!
I mitt nya inlägg här så använde jag mig av code-taggarna som du lärde mig, så tack
I min metod för att skriva ut åldersspann så ändrade jag utifrån din kommentar och nu funkar den!! Den hade jag aldrig kunnat lösa utan din hjälp.
I det andra problemet du skrev om, som handlade om vilka säten som är fyllda, så är jag inte helt säker på vad problemet är. Om jag lägger in t.ex. 3 besökare och sedan kör SortAge och till sist CalculateTotalAge så funkar det. Dock så funkar ju varken denna eller de andra metoderna om jag lägger in besökare i flera omgångar.
I det första du skrev, har jag förstått dig rätt med att problemet (som gör att programmet bara funkar vid en omgång besökare) ligger i metoden som lägger till besökare?

Permalänk
Skrivet av slipbit:

Ditt problem handlar om en klassisk utmaning med länkad lista. Du måste nämligen lagra värdena i minnet. Föreställ dig ett tåg, varje gång du kör om programmet så förlängs tåget med en vagn. Det gäller att hålla koll på lok+vagnarna. Du hanterar också dynamiskt minnesallokering. Så din array som lagrar informationen utökas allt eftersom du kör programmet. Så när du kör summeringen då kollar den hur stor arrayen är och sen kör alla värdena. Var 20 år sen jag programmerade C++.

Tack så mycket för din kommentar! Nu har jag verkligen fått en förståelse för problemet. Tåg-liknelsen var väldigt bra och pedagogisk

Permalänk
Medlem
Skrivet av programmeringärsvårt:

I det andra problemet du skrev om, som handlade om vilka säten som är fyllda, så är jag inte helt säker på vad problemet är. Om jag lägger in t.ex. 3 besökare och sedan kör SortAge och till sist CalculateTotalAge så funkar det. Dock så funkar ju varken denna eller de andra metoderna om jag lägger in besökare i flera omgångar.

Jag missade att du sorterade i omvänd ordning, d.v.s. äldst först, så då fungerar det eftersom de inmatade åldrarna ändå hamnar först. Om du däremot sorterar dem yngst först så får du problem eftersom alla tomma platser har åldern 0, så alla inmatade besökare hamnar då längst bak i arrayen vilket inte fungerar med din övriga kod. Om du istället bara sorterar de fyllda platserna i arrayen istället för hela arrayen så fungerar det oavsett sorteringsordningen.

Skrivet av programmeringärsvårt:

I det första du skrev, har jag förstått dig rätt med att problemet (som gör att programmet bara funkar vid en omgång besökare) ligger i metoden som lägger till besökare?

Ja, tänk på vad som händer just nu när du lägger till besökare. Om du redan har lagt till n besökare, på vilken plats ska då nästa besökare läggas in på i arrayen? Du kan testa att skriva en AddVisitor-metod som bara lägger till en besökare istället för flera som nu, om du får det att fungera så har du i stort sett löst problemet.

Permalänk
Skrivet av perost:

Jag missade att du sorterade i omvänd ordning, d.v.s. äldst först, så då fungerar det eftersom de inmatade åldrarna ändå hamnar först. Om du däremot sorterar dem yngst först så får du problem eftersom alla tomma platser har åldern 0, så alla inmatade besökare hamnar då längst bak i arrayen vilket inte fungerar med din övriga kod. Om du istället bara sorterar de fyllda platserna i arrayen istället för hela arrayen så fungerar det oavsett sorteringsordningen.

Ja, tänk på vad som händer just nu när du lägger till besökare. Om du redan har lagt till n besökare, på vilken plats ska då nästa besökare läggas in på i arrayen? Du kan testa att skriva en AddVisitor-metod som bara lägger till en besökare istället för flera som nu, om du får det att fungera så har du i stort sett löst problemet.

Jag har försökt ändra utifrån vad du har skrivit. Det funkar fortfarande inte, men jag hoppas att jag rör mig i rätt riktning iallafall😅 Ser det bättre ut eller är jag helt ute och cyklar? Såhär ser min metod för att lägga till besökare ut:

public void AddVisitor() //metod för att lägga till besökare { Console.WriteLine("Hur många besökare vill du lägga till?"); try //try catch för att vi endast vill ha siffror { int size = Convert.ToInt32(Console.ReadLine()); if (size + newVisitors > 20) //endast siffror under 20 är ok { Console.WriteLine("Biosalongen får endast ta emot 20 besökare p.g.a. Coronarestriktionerna. Försök igen."); //annars skrivs detta ut } else //om de skriver siffror under 20 { for (int i = newVisitors; i < size + newVisitors; i++) //så körs for-loopen { Console.WriteLine("Lägg till en besökare genom att skriva in hens ålder: "); int addedVisitors = Convert.ToInt32(Console.ReadLine()); //översätt svaret till int och lagra i vår variabel visitor[i] = addedVisitors; //lagra i vektorn } newVisitors++; //kör om på nytt } } catch { Console.WriteLine("Du kan endast fylla i besökarens ålder! Försök igen."); //visas om de skriver bokstäver } }

Permalänk
Medlem
Skrivet av programmeringärsvårt:

Jag har försökt ändra utifrån vad du har skrivit. Det funkar fortfarande inte, men jag hoppas att jag rör mig i rätt riktning iallafall😅 Ser det bättre ut eller är jag helt ute och cyklar? Såhär ser min metod för att lägga till besökare ut:

Ett steg framåt, ett steg bakåt Du har förstått att du behöver använda newVisitors, men det är som du säger inte riktigt rätt än.

Tänk på att själva processen att lägga till en ny besökare alltid är densamma, det enda du faktiskt behöver loopen till är att upprepa den processen ett visst antal gånger. Om du tar bort for-loopen så bör koden fortfarande fungera utan att ändra på den men bara lägga till en besökare istället för flera, det var därför jag tipsade om att börja med det fallet.

Permalänk
Skrivet av perost:

Ett steg framåt, ett steg bakåt Du har förstått att du behöver använda newVisitors, men det är som du säger inte riktigt rätt än.

Tänk på att själva processen att lägga till en ny besökare alltid är densamma, det enda du faktiskt behöver loopen till är att upprepa den processen ett visst antal gånger. Om du tar bort for-loopen så bör koden fortfarande fungera utan att ändra på den men bara lägga till en besökare istället för flera, det var därför jag tipsade om att börja med det fallet.

Tack så mycket för ditt tålamod och din feedback. Jag förstår vad du säger, men jag vet bara inte var eller hur jag ska kunna lösa det. Som sagt är jag ny på programmering och tycker det är väldigt svårt. Kursen jag läser är också på distans vilket har gjort det hela ännu svårare då det inte känns som att jag har fått den behövda undervisningen som kan behövas för att lösa detta. Eller så är det bara jag som inte är så bra på detta😅 Finns det någon mer information om problemet som du kan ge mig?

Permalänk
Medlem
Skrivet av programmeringärsvårt:

Tack så mycket för ditt tålamod och din feedback. Jag förstår vad du säger, men jag vet bara inte var eller hur jag ska kunna lösa det. Som sagt är jag ny på programmering och tycker det är väldigt svårt. Kursen jag läser är också på distans vilket har gjort det hela ännu svårare då det inte känns som att jag har fått den behövda undervisningen som kan behövas för att lösa detta. Eller så är det bara jag som inte är så bra på detta😅 Finns det någon mer information om problemet som du kan ge mig?

Om du har newVisitors antal besökare inlagda, på vilken plats ska då nästa besökare läggas på?

Permalänk
Medlem
Skrivet av perost:

Om du har newVisitors antal besökare inlagda, på vilken plats ska då nästa besökare läggas på?

i++