Permalänk

En "trasig" switch-case meny C#

Hej!!

Jag gör nu mitt slutprojekt i programmering och har som så många andra fått "Bussen" som uppgift, dock vill jag göra det lite kul och har därför valt att bygga upp en nattklubb istället.

Det finns en tydlig bild för mig hur jag vill att programmet ska se ut när det är färdigt, och jag har ett par veckor på mig men bättre att kunna bygga på det under ett längre tar tycker jag, än att stressa.
Jag undrar varför mitt program fastnar på frågan:
"Console.WriteLine("What is your gender ? \n Female = F \n Male = M \n Other/Prefer not to say : O");"

Har jag missat att lägga till en rad med kod? Är egentligen hela valid grejen svindum?

Tack på förhand.

using System; namespace Nightclub { class Program { public static void Main(string[] args) { var myNightclub = new Club(); myNightclub.Run(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } class Club { private int[] guests = new int[25]; //Skapar vektor med plats för 25 gäster private int totalGuests = 0; private int maxGuests = 25; public void Run() { int menu; do //Skapar loop som leder vidare till olika metoder { Console.WriteLine(" -------------------------------------------------------------------------------"); Console.WriteLine("| Welcome to our nightclub: The Jungle! You will now be asked to make a choice :|"); Console.WriteLine("| |"); Console.WriteLine("| 1. Show all guests: |"); Console.WriteLine("| 2. Add a guest: |"); Console.WriteLine("| 3. Show me the total age of our guests: |"); Console.WriteLine("| 4. Exit the nightclub-program |"); Console.WriteLine(" -------------------------------------------------------------------------------"); menu = int.Parse(Console.ReadLine()); switch (menu) //Knappval i menyn för olika metoder(cases) { case 1: print_nightclub(); break; case 2: add_guest(); break; case 3: calc_total_age(); break; case 4: Console.WriteLine("Program shutting down, thank you for visiting our nightclub. :-)"); break; default: Console.WriteLine("Please only write your choice, a number between 1-4 : "); break; } } while (menu != 4); //Loopar sålänge användare inte väljer case 4 vilket avslutar programmet } public void print_nightclub() //Metod för att skriva ut alla gäster på nattklubben { foreach (var totalGuests in guests) { Console.WriteLine("The passengers on the bus is" + guests); } } public void add_guest() { bool validAge = false; bool validGender = false; bool validDrink = false; bool validDance = false; int ageInput = 0; string genderInput = ""; string drinkInput = ""; string danceInput = ""; Console.WriteLine("Add a guest : "); while (!validAge) { Console.Clear(); Console.WriteLine("Write in your age : "); try { ageInput = int.Parse(Console.ReadLine()); validAge = true; } catch { Console.WriteLine("You have to write your age with numbers, try again : "); ageInput = int.Parse(Console.ReadLine()); validAge = true; } while (!validGender) { Console.WriteLine("What is your gender ? \n Female = F \n Male = M \n Other/Prefer not to say : O"); switch (Console.ReadLine().ToLower()) { case "F": genderInput = "Female"; validGender = true; break; case "M": genderInput = "Male"; validGender = true; break; case "O": genderInput = "Other / Prefer not to say"; validGender = true; break; default: Console.WriteLine("You have to make a choice: F, M or O?"); validGender = false; break; } } while (!validDrink) { Console.WriteLine("What are you gonna drink tonight? \n Beer = B \n Non-alcoholic = N \n Gin and tonic = GT \n I don't know yet = IDK"); switch (Console.ReadLine().ToLower()) { case "B": drinkInput = "Beer"; validDrink = true; break; case "N": drinkInput = "Non-alcoholic"; validDrink = true; break; case "GT": drinkInput = "Gin and tonic"; validDrink = true; break; case "IDK": drinkInput = "I don't know yet"; validDrink = true; break; default: Console.WriteLine("You have to make a choice: B, N, GT or IDK?"); validDrink = false; break; } } while (!validDance) { Console.WriteLine("Are you gonna dance tonight? \n Yes = Y \n No = N \n I don't know = IDK"); switch (Console.ReadLine().ToLower()) { case "Y": danceInput = "Yes"; validDance = true; break; case "N": danceInput = "No"; validDance = true; break; case "IDK": danceInput = "I don't know"; validDance = true; break; default: Console.WriteLine("You have to make a choice: Y, N or IDK?"); validDance = false; break; } } } } public void calc_total_age() //Metod för att räkna ut den totala åldern av alla gäster på nattklubben. { int sum = 0; for (int i = 0; i < totalGuests; i++) { sum += guests[i]; } Console.WriteLine($"\nThe total age for all of our guests is : {sum}"); } } }

Permalänk
Medlem

Det är inte så att du hamnar på default för att du skriver in små bokstäver? Du använder toLower men jämför mot versaler.

Visa signatur

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Permalänk
Vila i frid

Att nyttja breakpoints, debug och watch-variables verkar man glömma bort att lära ut. Även en gammal 60+ gubbe som snart går i pension använder det dagligen.

// ("HASENFRASEN").ToLower() == "hasenfrasen"

Permalänk
Medlem

Vill du göra det lite snyggare så bryt ut alla input-läsningar till egna metoder (och plocka bort nästlade while-loopar).

ToUpper()

Visa signatur

Citera mig för svar.
Arch Linux

Permalänk
Skrivet av Ferrat:

Det är inte så att du hamnar på default för att du skriver in små bokstäver? Du använder toLower men jämför mot versaler.

Du hade mycket rätt i detta.. Nu vet jag inte ens varför jag lagt in det från början längre!
Tack, nu ska bara allting lagras på rätt sätt osv också

Permalänk
Skrivet av hasenfrasen:

Att nyttja breakpoints, debug och watch-variables verkar man glömma bort att lära ut. Även en gammal 60+ gubbe som snart går i pension använder det dagligen.

// ("HASENFRASEN").ToLower() == "hasenfrasen"

Ja det stämmer säkert, för jag har inte lärt mig något om detta i kursmaterialet, skulle du kunna berätta mer?

Permalänk
Skrivet av Dimman:

Vill du göra det lite snyggare så bryt ut alla input-läsningar till egna metoder (och plocka bort nästlade while-loopar).

ToUpper()

Du menar att jag ska bugga nya metoder till varje fråga i princip då? hur sparar jag då ner alltid i min array?

Permalänk
Medlem

Vem har lärt er skriva metoder såhär i C#: calc_total_age(), print_nightclub() etc..

Visa signatur

Ryzen 3600 | RX6800

Permalänk
Medlem
Skrivet av Hjälplös nybörjare:

Ja det stämmer säkert, för jag har inte lärt mig något om detta i kursmaterialet, skulle du kunna berätta mer?

Det här handlar ju i huvudsak om att lära sig att använda funktionerna i verktygen snarare än specifikt c#, så jag antar att du använder Visual Studio?

Här finns ett relevant avsnitt i Microsofts "getting started"-del av dokumentationen:
https://docs.microsoft.com/en-us/visualstudio/get-started/csh...

Och ja, jag håller helt med om att lära sig att använda den inbyggda debuggern *borde* vara bland det första man får lära sig om det är en nybörjarkurs (dvs att man inte redan förväntas vara bekant med antingen Visual Studio eller motsvarande sedan tidigare).

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Skrivet av JesperDa:

Vem har lärt er skriva metoder såhär i C#: calc_total_age(), print_nightclub() etc..

Vi fick ett färdigt kodskal att utgå ifrån.

Permalänk
Skrivet av evil penguin:

Det här handlar ju i huvudsak om att lära sig att använda funktionerna i verktygen snarare än specifikt c#, så jag antar att du använder Visual Studio?

Här finns ett relevant avsnitt i Microsofts "getting started"-del av dokumentationen:
https://docs.microsoft.com/en-us/visualstudio/get-started/csh...

Och ja, jag håller helt med om att lära sig att använda den inbyggda debuggern *borde* vara bland det första man får lära sig om det är en nybörjarkurs (dvs att man inte redan förväntas vara bekant med antingen Visual Studio eller motsvarande sedan tidigare).

Ska kolla på den! Får bli kvällens underhållning. Stort tack!

Permalänk
Medlem
Skrivet av Hjälplös nybörjare:

Du menar att jag ska bugga nya metoder till varje fråga i princip då? hur sparar jag då ner alltid i min array?

Du låter bara metoderna returnera värdena de läser in, t.ex. ålder, kön, etc. Koden för att stoppa in allt i arrayen blir inte annorlunda utan det enda som skiljer är att du anropar metoder istället för att ha while-satserna direkt i add_guest.

Fördelen med att dela upp koden i mindre delar på det sättet är att det blir lättare att se om koden gör rätt, om du t.ex. har en metod readGuestAge så behöver den metoden bara bry sig om att läsa in och returnera en ålder och inget annat. Nu gör add_guest en massa olika saker, och p.g.a. du blandat ihop inläsningarna så gör koden fel om användaren matar in en felaktig ålder.

Permalänk
Skrivet av perost:

Du låter bara metoderna returnera värdena de läser in, t.ex. ålder, kön, etc. Koden för att stoppa in allt i arrayen blir inte annorlunda utan det enda som skiljer är att du anropar metoder istället för att ha while-satserna direkt i add_guest.

Fördelen med att dela upp koden i mindre delar på det sättet är att det blir lättare att se om koden gör rätt, om du t.ex. har en metod readGuestAge så behöver den metoden bara bry sig om att läsa in och returnera en ålder och inget annat. Nu gör add_guest en massa olika saker, och p.g.a. du blandat ihop inläsningarna så gör koden fel om användaren matar in en felaktig ålder.

Har jag tänkt rätt om jag bygger nya metoder längre ner, som har en switch meny i varje (förutom age) + felhantering?
Och lägger dom som private void?

Permalänk
Medlem
Skrivet av Hjälplös nybörjare:

Har jag tänkt rätt om jag bygger nya metoder längre ner, som har en switch meny i varje (förutom age) + felhantering?
Och lägger dom som private void?

Nästan. Läs vad @perost skrev ovan och fundera sen lite på vad void innebär.

Visa signatur

Citera mig för svar.
Arch Linux

Permalänk
Skrivet av Dimman:

Nästan. Läs vad @perost skrev ovan och fundera sen lite på vad void innebär.

Hunnit tänka lite mer nu och lyckats lösa ner så det sparas på ett eget ställe. Ska pilla lite mer sen be om er kritik igen! 😊

Permalänk

Nu har jag kommit en bra bit på koden, dock inte lagt in så mycket olika metoder och val i menyn som ska in men kanske en bra start?

Ser det fortfarande för kladdigt ut?

using System; namespace Nattklubben { class Program { public static void Main(string[] args) { var myNightclub = new Nightclub(); myNightclub.Run(); Console.ReadKey(true); } } class Nightclub { Guests[] guestList = new Guests[25]; int minimumAgeLimitGuest = 18; public void Run() { while (true) { //Meny med olika val för användaren Console.Clear(); Console.WriteLine(" -------------------------------------------------------------------------------"); Console.WriteLine("| Welcome to the Nightclub! You will now be asked to make a choice : |"); Console.WriteLine("| |"); Console.WriteLine("| [S] Show all guests: |"); Console.WriteLine("| [A] Add a guest: |"); Console.WriteLine("| [T] Show me the total age of our guests: |"); Console.WriteLine("| [Q] Exit the nightclub-program |"); Console.WriteLine(" -------------------------------------------------------------------------------"); ConsoleKeyInfo inputFromUser = Console.ReadKey(true); switch (inputFromUser.Key) //Metoder som anropas för olika val användaren gör { case ConsoleKey.S: { printGuests(); //Anropar metod som skriver ut alla platser på nattklubben break; } case ConsoleKey.A: { AddGuest(); //Anropar metod som låter programmet lägga till en gäst break; } case ConsoleKey.T: { TotAge(); //Aropar metod som lägger ihop alla åldrar på gästerna break; } case ConsoleKey.Q: { Environment.Exit(0); //Stänger ner program return; } default: //Om användare försöker skriva in ett val som inte finns skrivs stringen ut: { Console.WriteLine("Please choose one of the options from the menu. "); break; } } } } //Metoder för huvudmenyns olika val: public void AddGuest() { string newName = ""; int newAge = 0; string newGender = "a"; string newDrink = "a"; ConsoleKeyInfo userInput; Console.Clear(); Console.WriteLine("--> Add a guest <--"); while (true) { Console.Write("Enter your name : "); try { newName = Console.ReadLine(); break; //Godkänt namn } catch (Exception ex) { Console.WriteLine(ex.Message); } } while (true) { try { Console.Write("Enter your age : "); newAge = Convert.ToInt32(Console.ReadLine()); if (newAge < minimumAgeLimitGuest) { Console.WriteLine("Please don't lie about your age.. You know you have to be 18 + to get in.. ;-)"); } else { break; //Ålder 18+ inskriven } } catch (FormatException) { Console.WriteLine("Please only write numbers."); } catch (Exception ex) { Console.WriteLine(ex.Message); } } while (true) { Console.Write("Choose your gender pronouns :\nShe = S\nHe = H\nThey = T\n"); try { userInput = Console.ReadKey(true); //Sparar användarens svar i ConsoleKeyInfo newGender = userInput.Key.ToString(); //Gör om ConsoleKeyInfo till en string } catch (Exception ex) { Console.WriteLine(ex.Message); } if (newGender == "S" || newGender == "H" || newGender == "T") { break; //Godkänt svar från användare } else { Console.WriteLine("Please give us your answer : S, H or T : "); } } while (true) { Console.Write("What do you want to drink tonight : \nBeer = B\nSoda = S\nGin and tonic = X\n"); try { userInput = Console.ReadKey(true); //Sparar användarens svar i ConsoleKeyInfo newDrink = userInput.Key.ToString(); //Gör om consoleKeyInfo till en string } catch (Exception ex) { Console.WriteLine(ex.Message); } if (newDrink == "B" || newDrink == "S" || newDrink == "X") { break; //Godkänt svar från användaren } else { Console.WriteLine("Please give us your answer : B, S or X : "); } } for (int i = 0; i < guestList.Length - 1; i++) { if (guestList[i] == null) //om vektorn är tom läggs info om nya gästerna på element [0] { guestList[i] = new Guests(newName, newAge, newGender, newDrink); break; } else //annars på nästa plats i array { continue; } } Console.WriteLine("Welcome in to our club ! "); Console.ReadKey(true); } public void printGuests() { Console.Clear(); Console.WriteLine("--> Guests in the nightclub at the moment <-- \n"); int guestListNumber = 0; foreach (Guests human in guestList) //kollar av gäster i guestlist, (vektorn där all information om gästerna blir lagrad) { guestListNumber++; if (human == null) { continue; //Hoppa över att skriva ut platser som är tomma } else { Console.WriteLine("Nightclub-guest {0} is : {1}, {2} years old. Tonight {3} is drinking {4}.", guestListNumber, human.Name, human.Age, human.GenderPronoun(), human.DrinkType()); } } Console.WriteLine("Press any key to get back to the menu."); Console.ReadKey(true); } public void TotAge() { Console.Clear(); Console.WriteLine("--> Total age of our guests <--"); int TotalAgeGuests = 0; foreach (Guests human in guestList) { if (human == null) { continue; //hoppa över i loopen då elementet är tomt } else { TotalAgeGuests += human.Age; } } Console.WriteLine("The total age of all our guests is {0} years.", TotalAgeGuests); Console.WriteLine("Press any key to get back to the menu."); Console.ReadKey(true); } } //Klass som sparar ner info om gästerna class Guests { //Datan om gäster private string name; private int age; private string gender; private string drink; public Guests(string _name, int _age, string _gender, string _drink) { this.name = _name; this.age = _age; this.gender = _gender; this.drink = _drink; } public string Name { get { return name; } set { name = value; } } public int Age { get { return age; } set { age = value; } } public string Gender { get { return gender; } set { gender = value; } } public string GenderPronoun() { switch (gender) { case "S": { gender = "she"; break; } case "H": { gender = "he"; break; } case "T": { gender = "they"; break; } } return gender; } public string Drink { get { return drink; } set { drink = value; } } public string DrinkType() { switch (drink) { case "B": { drink = "beer"; break; } case "S": { drink = "soda"; break; } case "X": { drink = "gin and tonic"; break; } } return drink; } } }

Permalänk

Sista problemen..

Skrivet av JesperDa:

Vem har lärt er skriva metoder såhär i C#: calc_total_age(), print_nightclub() etc..

Skrivet av evil penguin:

Det här handlar ju i huvudsak om att lära sig att använda funktionerna i verktygen snarare än specifikt c#, så jag antar att du använder Visual Studio?

Här finns ett relevant avsnitt i Microsofts "getting started"-del av dokumentationen:
https://docs.microsoft.com/en-us/visualstudio/get-started/csh...

Och ja, jag håller helt med om att lära sig att använda den inbyggda debuggern *borde* vara bland det första man får lära sig om det är en nybörjarkurs (dvs att man inte redan förväntas vara bekant med antingen Visual Studio eller motsvarande sedan tidigare).

Skrivet av perost:

Du låter bara metoderna returnera värdena de läser in, t.ex. ålder, kön, etc. Koden för att stoppa in allt i arrayen blir inte annorlunda utan det enda som skiljer är att du anropar metoder istället för att ha while-satserna direkt i add_guest.

Fördelen med att dela upp koden i mindre delar på det sättet är att det blir lättare att se om koden gör rätt, om du t.ex. har en metod readGuestAge så behöver den metoden bara bry sig om att läsa in och returnera en ålder och inget annat. Nu gör add_guest en massa olika saker, och p.g.a. du blandat ihop inläsningarna så gör koden fel om användaren matar in en felaktig ålder.

Skrivet av Dimman:

Nästan. Läs vad @perost skrev ovan och fundera sen lite på vad void innebär.

Hej allihop! Har kommit en bra bit på koden nu och har egentligen bara två "problem" kvar.
Jag hade velat lösa så att metoden AddGuest bara funkar om vektorn inte är fylld än. Alltså om den har lediga platser. Löser jag detta bäst med en if sats?

Andra frågan är varför TotAge och OldestGuest inte vill bli public int istället för void. Jag förstår att av felmeddelandet att inte all kod i metoden retunerar ett värde vilket blir ett problem, men jag gar svårt att förstå VARFÖR. Har suttit med koden dag och natt i en vecka nu och löst mer komplexa påroblem än så här?!

Koden nu (som funkar felfritt för iallafall mig)

using System; using System.Collections.Generic; namespace Nattklubben { class Program { public static void Main(string[] args) { var myNightclub = new Nightclub(); myNightclub.Run(); Console.ReadKey(true); } } class Nightclub { Guests[] guestList = new Guests[25]; //Skapar vektor där klassen Guests lagras, max 25 platser int minimumAgeLimitGuest = 18; //Ingen under 18 ska få komma in på klubben public void Run() { while (true) { //Meny med olika val för användaren Console.Clear(); Console.WriteLine(" -------------------------------------------------------------------------------"); Console.WriteLine("| Welcome to the Nightclub! You will now be asked to make a choice : |"); Console.WriteLine("| |"); Console.WriteLine("| [A] Add a guest: |"); Console.WriteLine("| [S] Show all guests: |"); Console.WriteLine("| [T] Show the total age of all guests: |"); Console.WriteLine("| [Y] Show the average age of our guests: |"); Console.WriteLine("| [F] Find guests based on their age: |"); Console.WriteLine("| [O] Show the oldest guest in the club ATM: |"); Console.WriteLine("| [B] Sort all guests by age: |"); Console.WriteLine("| [Q] Exit the nightclub-program |"); Console.WriteLine(" -------------------------------------------------------------------------------"); ConsoleKeyInfo inputFromUser = Console.ReadKey(true); switch (inputFromUser.Key) //Meny för vilken metod som ska anropas när användaren trycker in specifik knapp (S, A osv) { case ConsoleKey.A: { AddGuest(); //Anropar metod som låter programmet lägga till en gäst break; } case ConsoleKey.S: { PrintGuest(); //Anropar metod som skriver ut alla platser på nattklubben break; } case ConsoleKey.T: { TotAge(); //Aropar metod som lägger ihop alla åldrar på gästerna break; } case ConsoleKey.Y: { AverageAge(); //Anropar metod som räknar ut genomsnittlig ålder på gäster break; } case ConsoleKey.F: { FindAge(); //Anropar metod som låter användaren söka upp vilka användare som har en viss ålder break; } case ConsoleKey.O: { OldestGuest(); //Anropar metod för att visa den äldsta gästen just nu break; } case ConsoleKey.B: { SortByAge(); //Anropar metod för att sortera alla gäster efter ålder break; } case ConsoleKey.Q: { Environment.Exit(0); //Stänger ner program return; } default: //Om användare försöker skriva in ett val som inte finns skrivs stringen ut: { Console.WriteLine("Please choose one of the options from the menu. "); break; } } } } //Metoder för huvudmenyns olika val: public void AddGuest() //Metod för att lägga till en ny gäst { string newName = ""; //Användaren får skriva in sträng som blir inlagt som dess namn i newName int newAge = 0; //Användaren får skriva in int som blir inlagt som dess ålder i newAge string newGender = "a"; //Användaren får göra ett val som är en string, alltså val där svaret ska vara ett av valen, sparas i newGender string newDrink = "a"; //samma sak som ovan men sparas i newDrink ConsoleKeyInfo userInput; //Användarens input (val) gäller för consoleKeyInfo Console.Clear(); Console.WriteLine("--> Add a guest <--\n"); while (true) { Console.Write("Enter your name : "); //Ber användaren skriva in sitt namn try { newName = Console.ReadLine(); break; //Godkänt namn (man kan ju faktiskt heta vad som helst nu för tiden) } catch (Exception ex) { Console.WriteLine(ex.Message); } } while (true) { try { Console.Write("Enter your age : "); newAge = Convert.ToInt32(Console.ReadLine()); //Gör om användarens svar till int if (newAge < minimumAgeLimitGuest) //String kommer upp vid ogiltig ålder dvs mindre än 18, låter användaren skriva in giltig ålder istället { Console.WriteLine("Please don't lie about your age.. You know you have to be 18 + to get in.. ;-)"); } else { break; //Avslutar loop om ålder 18+ inskriven } } catch (FormatException) { Console.WriteLine("Please only write numbers."); //Om annat än tal skrivs in kommer sträng upp } catch (Exception ex) { Console.WriteLine(ex.Message); } } while (true) { Console.Write("Choose your gender pronouns :\nShe = S\nHe = H\nThey = T\n"); try { userInput = Console.ReadKey(true); //Sparar användarens svar i ConsoleKeyInfo newGender = userInput.Key.ToString(); //Gör om ConsoleKeyInfo (de olika valen t.ex s, m) till en string } catch (Exception ex) { Console.WriteLine(ex.Message); } if (newGender == "S" || newGender == "H" || newGender == "T") { break; //Godkänt svar från användare } else { Console.WriteLine("Please give us your answer : S, H or T : "); } } while (true) { Console.Write("What do you want to drink tonight : \nBeer = B\nSoda = S\nGin and tonic = X\n"); //Låter användaren göra sitt val ang dryck. try { userInput = Console.ReadKey(true); //Sparar användarens svar i ConsoleKeyInfo newDrink = userInput.Key.ToString(); //Gör om consoleKeyInfo till en string } catch (Exception ex) { Console.WriteLine(ex.Message); } if (newDrink == "B" || newDrink == "S" || newDrink == "X") { break; //Godkänt svar från användaren } else { Console.WriteLine("Please give us your answer : B, S or X : "); } } for (int i = 0; i < guestList.Length - 1; i++) { if (guestList[i] == null) //om vektorn är tom läggs info om ny gäst på element [0] { guestList[i] = new Guests(newName, newAge, newGender, newDrink); break; } else //annars på nästa plats i array { continue; } } Console.WriteLine("Welcome in to our club ! "); Console.ReadKey(true); } public void PrintGuest() //Metod för att skriva ut alla nuvarande gäster på nattklubben { Console.Clear(); Console.WriteLine("--> Guests in the nightclub at the moment <-- \n"); int guestListNumber = 0; foreach (Guests element in guestList) //kollar av gäster i guestlist, (vektorn där all information om gästerna blir lagrad) { guestListNumber++; if (element == null) { continue; //Hoppa över att skriva ut platser som är tomma } else { Console.WriteLine("Nightclub-guest {0} is : {1}, {2} years old. Tonight {3} is drinking {4}.", guestListNumber, element.Name, element.Age, element.GenderPronoun(), element.DrinkType()); } } Console.WriteLine("Press any key to get back to the menu."); Console.ReadKey(true); } public void TotAge() //Metod för att räkna ut total ålder av alla gäster i array //vill göra om void till int? hur? { Console.Clear(); Console.WriteLine("--> Total age of our guests <--\n"); int totalAgeOfGuests = 0; //Skapar variabel int att lagra totala åldern från element.Age i foreach (Guests element in guestList) { if (element == null) { continue; //hoppa över i loopen då elementet är tomt } else { totalAgeOfGuests += element.Age; //Hämta åldrar från human.Age och lägg in i totalAgeOfGuests } } Console.WriteLine("The total age of all our guests is {0} years.\n", totalAgeOfGuests); Console.WriteLine("Press any key to get back to the menu."); Console.ReadKey(true); } public void AverageAge() //Metod för att räkna ut genomsnittlig ålder på besökare //vill göra om void till int? hur? { Console.Clear(); Console.WriteLine("--> Average age of our guests <--"); int numberOfGuests = 0; //skapar variabel int att lagra antal element som är med i totalAgeGuests int totalAgeOfGuests = 0; //Skapar variabel int att lagra totala åldern från element.Age i foreach (Guests element in guestList) { if (element == null) { continue; //Hoppa över tomma element i array } else { totalAgeOfGuests += element.Age; //Tar fram alla upptagna element.Age i Guests och plussar ihop numberOfGuests++; //Ökar värdet i variabeln varje gång ett nytt värde plockas fram } } Console.WriteLine("The average age of the guests in our club is approximately {0} years.\n", totalAgeOfGuests / numberOfGuests); Console.WriteLine("Press any key to get back to the menu."); Console.ReadKey(true); } public void FindAge() //Metod för att hitta någon i array baserat på deras ålder { Console.Clear(); int findSpecificAge = 0; //Skapar int-variabel som ska lagra användares val while (true) { Console.Write("What age do you want to search for along our guests ? "); try { findSpecificAge = Convert.ToInt32(Console.ReadLine()); if (findSpecificAge < minimumAgeLimitGuest) //Eftersom nattkklubben inte godkänner att folk under 18 kommer in så är det meningslöst för en användare att söka på det. { Console.WriteLine("That's unnecessary, we only allow people over the age of 18 in here, try again : "); } else { break; //Ålder man kan söka efter, alltså bryter detta while } } catch (FormatException) { Console.WriteLine("Please only write in numbers : "); } catch (Exception ex) { Console.WriteLine(ex.Message); } } int totalNumberOfFoundGuests = 0; //Skapar variabel som ska hålla koll på hur många personer som matchar sökningen foreach (Guests element in guestList) //Loop som kollar igenom alla element i guestList { if (element == null) { continue; //Hoppa över tomma element } else if (element.Age == findSpecificAge) { Console.WriteLine("{0} matches your search.", element.Name); //Skriver ut namnet på elementet som matchar med sökningen totalNumberOfFoundGuests++; //Ökar värdet i variabeln som räknar va hur många som matchar med sökningen } } if (totalNumberOfFoundGuests == 0) { Console.WriteLine("\nNo guests matches your search."); } else { Console.WriteLine("\nYou got {0} matches on your search,", totalNumberOfFoundGuests); } Console.WriteLine("Press any key to get back to the menu."); Console.ReadKey(true); } public void OldestGuest() //Metod för att hitta äldsta gästen just nu //vill göra om void till int? hur? { int oldest = 0; Console.Clear(); Console.WriteLine("--> Oldest person in the Nightclub <--"); foreach (Guests element in guestList) { if (element == null) { continue; //Hoppa över tomma element i array } else if (element.Age > oldest) //Kollar alla åldrar mot värdet i oldest (som blir nytt varje gång det finns en äldre i array { oldest = element.Age; //Sparar ner det högsta talet och elementet i oldest } } foreach (Guests element in guestList) { if (element == null) { continue; } else if (element.Age == oldest) { Console.WriteLine("The oldest person in the nightclub right now is :\n{0}, {1} is {2} years old.", element.Name, element.GenderPronoun(), element.Age); } } Console.WriteLine("Press any key to get back to the menu."); Console.ReadKey(true); } public void SortByAge() //Metod för att sortera gästerna på ålder istället för plats i vektorn { Console.Clear(); Console.WriteLine("--> Sort guests by age <--"); List<Guests> sortingList = new List<Guests>(); foreach (Guests element in guestList) //Lägger till alla gäster i en lista { if (element == null) //Om det inte finns någon på elementet så hoppa över plats { continue; } else { sortingList.Add(element); //Om det finns någon på elementet så lägg till uppgifter om den i listan } } for (int i = 0; i < sortingList.Count; i++) //Kod som sorterar i listan { int currentGuest = i; for (int j = i + 1; j < sortingList.Count; j++) if (sortingList[j].Age < sortingList[currentGuest].Age) { currentGuest = j; } if (currentGuest != i) { Guests valueHolder = sortingList[i]; sortingList[i] = sortingList[currentGuest]; sortingList[currentGuest] = valueHolder; } } Array.Clear(guestList, 0, guestList.Length - 1); //Tar bort alla från guestList for (int i = 0; i < sortingList.Count; i++) //Lägger till alla på nytt, men nu sorterade efter ålder { guestList[i] = (sortingList[i]); //alla nya värden ifrån guestList läggs nu över i sortingList } int guestListNumber = 0; //Skriver in ny ordning på gästerna foreach (Guests element in guestList) { guestListNumber++; if (element == null) { continue; //Om plats är ledig så hoppa över } else { Console.WriteLine("Nightclub-guest {0}, {1}, is {2} years old.", guestListNumber, element.Name, element.Age); //Skriver ut nattklubbsgäst [plats 1], med namn x är y år gammal. } } Console.WriteLine("Press any key to get back to the menu."); Console.ReadKey(true); } } //Klass som sparar ner info om gästerna class Guests { //Datan om gäster private string name, gender, drink; private int age; public Guests(string name, int age, string gender, string drink) { this.name = name; this.age = age; this.gender = gender; this.drink = drink; } public string Name { get { return name; } set { name = value; } } public int Age { get { return age; } set { age = value; } } public string Gender { get { return gender; } set { gender = value; } } public string GenderPronoun() { switch (gender) { case "S": { gender = "she"; break; } case "H": { gender = "he"; break; } case "T": { gender = "they"; break; } } return gender; } public string Drink { get { return drink; } set { drink = value; } } public string DrinkType() { switch (drink) { case "B": { drink = "beer"; break; } case "S": { drink = "soda"; break; } case "X": { drink = "gin and tonic"; break; } } return drink; } } }

Permalänk
Medlem
Skrivet av Hjälplös nybörjare:

Hej allihop! Har kommit en bra bit på koden nu och har egentligen bara två "problem" kvar.
Jag hade velat lösa så att metoden AddGuest bara funkar om vektorn inte är fylld än. Alltså om den har lediga platser. Löser jag detta bäst med en if sats?

Det brukar vara en del av uppgiften att hålla reda på antalet fyllda platser med en variabel, men det finns säkert en del variationer av uppgiften. Men gör man på det sättet så behöver man inte hålla på och kolla vilka platser som är tomma överallt, utan då vet man direkt om det är fullt samt att man bara behöver loopa över de fyllda platserna.

Men om du vill använda din nuvarande lösning så kan du lösa det på många olika sätt. Ett sätt är att ändra for-loopen till att bara hitta nästa tomma plats och inte fylla den, sen kollar du om någon plats hittades innan du stoppar in personen (sätt indexet till t.ex. -1 innan loopen, är den fortfarande -1 efter så vet du att ingen tom plats hittades). En annan lösning är att använda en bool-variabel för att hålla koll på om du lyckades stoppa in personen eller ej, och ge ett felmeddelande efteråt om det inte lyckades.

Tänk bara på att det kanske inte är så användarvänligt att säga att klubben är full efter att användaren redan matat in en gäst, det vore bättre att göra det innan så att användaren inte behöver mata in uppgifter i onödan.

Skrivet av Hjälplös nybörjare:

Andra frågan är varför TotAge och OldestGuest inte vill bli public int istället för void. Jag förstår att av felmeddelandet att inte all kod i metoden retunerar ett värde vilket blir ett problem, men jag gar svårt att förstå VARFÖR. Har suttit med koden dag och natt i en vecka nu och löst mer komplexa påroblem än så här?!

Svårt att säga, du visar inte hur du försökt att returnera något från metoderna. Om du vill att de ska returnera ett värde så måste du ha en return någonstans, t.ex. return totalAgeOfGuests; i slutet av TotAge.

Permalänk
Skrivet av perost:

Det brukar vara en del av uppgiften att hålla reda på antalet fyllda platser med en variabel, men det finns säkert en del variationer av uppgiften. Men gör man på det sättet så behöver man inte hålla på och kolla vilka platser som är tomma överallt, utan då vet man direkt om det är fullt samt att man bara behöver loopa över de fyllda platserna.

Men om du vill använda din nuvarande lösning så kan du lösa det på många olika sätt. Ett sätt är att ändra for-loopen till att bara hitta nästa tomma plats och inte fylla den, sen kollar du om någon plats hittades innan du stoppar in personen (sätt indexet till t.ex. -1 innan loopen, är den fortfarande -1 efter så vet du att ingen tom plats hittades). En annan lösning är att använda en bool-variabel för att hålla koll på om du lyckades stoppa in personen eller ej, och ge ett felmeddelande efteråt om det inte lyckades.

Tänk bara på att det kanske inte är så användarvänligt att säga att klubben är full efter att användaren redan matat in en gäst, det vore bättre att göra det innan så att användaren inte behöver mata in uppgifter i onödan.

Svårt att säga, du visar inte hur du försökt att returnera något från metoderna. Om du vill att de ska returnera ett värde så måste du ha en return någonstans, t.ex. return totalAgeOfGuests; i slutet av TotAge.

Du har helt rätt i att det inte känns speciellt användarvänligt alls, har nu skapat en public variabel i klass Nightclub som

int maxNumbersOfGuests = 25;

Ska se om jag lyckas lösa det.. antar att jag får köra en for-loop, jag som struntade i det från början för tänkte att det var enkelt att sätta in nåt villkor, man kan inte alltid vara smart.

För övrigt fungerade return; superbra, det hade jag inte alls förstått, så ett stort tack, ska läsa mer om det också och bli mer införstådd.

Permalänk
Medlem
Skrivet av Hjälplös nybörjare:

Du har helt rätt i att det inte känns speciellt användarvänligt alls, har nu skapat en public variabel i klass Nightclub som

int maxNumbersOfGuests = 25;

Ska se om jag lyckas lösa det.. antar att jag får köra en for-loop, jag som struntade i det från början för tänkte att det var enkelt att sätta in nåt villkor, man kan inte alltid vara smart.

Det var inte riktigt det jag menade, maxgränsen har du ju redan tillgänglig som guestList.Length. Vad jag menade var att du ska ha en variabel som håller reda på hur många gäster du lagt till, som du uppdaterar varje gång du t.ex. lägger till en ny gäst. Då kan du även ta bort en hel del if (element == null)-kod, för om du vet hur många platser som är fyllda så kan du loopa över endast dessa och inte behöva ta hänsyn till tomma platser.

Permalänk
Skrivet av perost:

Det var inte riktigt det jag menade, maxgränsen har du ju redan tillgänglig som guestList.Length. Vad jag menade var att du ska ha en variabel som håller reda på hur många gäster du lagt till, som du uppdaterar varje gång du t.ex. lägger till en ny gäst. Då kan du även ta bort en hel del if (element == null)-kod, för om du vet hur många platser som är fyllda så kan du loopa över endast dessa och inte behöva ta hänsyn till tomma platser.

Någon sida eller vad jag ska kolla på microsoft? Nu blev jag tokförrvirrad och kommer snart börja slita av mig håret.
Om jag t.ex. gör en variabel av typ int som får heta guestsATM och sätter denna till 0. Så menar du att i slutet på AddGuest, när all information lagras, lägga till typ guestATM++?

Permalänk
Vila i frid

Sök på stackoverflow, det som inte redan har frågats om där - är nog inte värt att fråga om.

https://stackoverflow.com/questions

Permalänk
Medlem
Skrivet av Hjälplös nybörjare:

Någon sida eller vad jag ska kolla på microsoft? Nu blev jag tokförrvirrad och kommer snart börja slita av mig håret.
Om jag t.ex. gör en variabel av typ int som får heta guestsATM och sätter denna till 0. Så menar du att i slutet på AddGuest, när all information lagras, lägga till typ (guestsATM + 1)? Eller har jag missförstått dig då?

Ja, precis. Det är inget komplicerat alls, bara en int-variabel som du använder för att hålla koll på hur många gäster du lagt till.

Problemet är ju att en array alltid har så många element som den deklareras med, så vill du veta hur många gäster du har så måste du hålla koll på det manuellt (eller räkna varje gång du vill veta det, som du gör nu). Senare kommer du oftast använda t.ex. List istället för arrayer i många fall, som själv håller reda på hur många värden du lagt till i den. Men även List använder en array internt, så det är bra att lära sig allt från grunden.

Permalänk
Skrivet av perost:

Ja, precis. Det är inget komplicerat alls, bara en int-variabel som du använder för att hålla koll på hur många gäster du lagt till.

Problemet är ju att en array alltid har så många element som den deklareras med, så vill du veta hur många gäster du har så måste du hålla koll på det manuellt (eller räkna varje gång du vill veta det, som du gör nu). Senare kommer du oftast använda t.ex. List istället för arrayer i många fall, som själv håller reda på hur många värden du lagt till i den. Men även List använder en array internt, så det är bra att lära sig allt från grunden.

Jag gjorde en variabel som jag satte till ++ i slutet av AddGuest

for (int i = 0; i < guestList.Length - 1; i++) { if (guestList[i] == null) //om vektorn är tom läggs info om ny gäst på element [0] { guestList[i] = new Guests(newName, newAge, newGender, newDrink); guestsATM++; break; } else //annars på nästa plats i array { guestsATM++; continue; } } } Console.WriteLine("Welcome in to our club ! "); Console.ReadKey(true);

Satte sedan en if (guestsATM == guestList.Lenght)
Utskrift : Nattklubb är full
else
All kod från tidigare.

Men det funkar ändå inte, inget meddelande kommer upp hur många gäster man än trycker in. Vad gör jag för fel, nu har jag provat att sätta guestsATM++ och att sätta olika if satser på tusen olika ställen i metoden.

Permalänk
Medlem

@Hjälplös nybörjare: Problemet nu är att du ökar guestsATM alldeles för mycket, så guestsATM kommer vara större än guestList.Length när du gör jämförelsen. Du ska endast öka den när du faktiskt lägger till en gäst.

Du behöver för övrigt inte din for-loop alls för att lägga till en ny gäst. Om du vet hur många gäster du redan har så vet du ju också vilken nästa lediga plats är utan att behöva söka igenom arrayen efter en tom plats.

Permalänk
Skrivet av perost:

@Hjälplös nybörjare: Problemet nu är att du ökar guestsATM alldeles för mycket, så guestsATM kommer vara större än guestList.Length när du gör jämförelsen. Du ska endast öka den när du faktiskt lägger till en gäst.

Du behöver för övrigt inte din for-loop alls för att lägga till en ny gäst. Om du vet hur många gäster du redan har så vet du ju också vilken nästa lediga plats är utan att behöva söka igenom arrayen efter en tom plats.

Fast jag förstår verkligen inte, kan du förklara som du skulle gjort för en åttaåring typ?
Den borde ju bara ökas när en gäst läggs till i vektorn, alltså i else villkoret. Problemet är väl egentligen inte att den blir större eller mindre, utan att det inte händer någonting alls är det stora problemet. If villkoret används aldrig.
Jag lagrar väl gästerna på element genom for-loop, tar jag bort den så kommer dom ju inte att sparas alls?

Permalänk
Medlem
Skrivet av Hjälplös nybörjare:

Fast jag förstår verkligen inte, kan du förklara som du skulle gjort för en åttaåring typ?
Den borde ju bara ökas när en gäst läggs till i vektorn, alltså i else villkoret. Problemet är väl egentligen inte att den blir större eller mindre, utan att det inte händer någonting alls är det stora problemet. If villkoret används aldrig.
Jag lagrar väl gästerna på element genom for-loop, tar jag bort den så kommer dom ju inte att sparas alls?

Problemet du har är att du ökar guestsATM för varje element du söker igenom just nu. Så efter första gästen är guestsATM 1, efter den andra 3, efter den tredje 6, 10, o.s.v. Så när klubben väl är full så kommer guestsATM vara 210, och ditt if-villkor kommer inte stämma. Använd debuggern för att se vad som händer så kanske det blir klarare.

Och du använder egentligen inte for-loopen för att lagra gäster, du använder den för att hitta nästa lediga plats som du kan lägga in en gäst på. Men som sagt, om du håller reda på hur många gäster du har så behöver du inte göra det, då vet du redan vilken nästa lediga plats är och kan bara lägga in gästen direkt utan att loopa igenom arrayen.

Permalänk
Skrivet av perost:

Problemet du har är att du ökar guestsATM för varje element du söker igenom just nu. Så efter första gästen är guestsATM 1, efter den andra 3, efter den tredje 6, 10, o.s.v. Så när klubben väl är full så kommer guestsATM vara 210, och ditt if-villkor kommer inte stämma. Använd debuggern för att se vad som händer så kanske det blir klarare.

Och du använder egentligen inte for-loopen för att lagra gäster, du använder den för att hitta nästa lediga plats som du kan lägga in en gäst på. Men som sagt, om du håller reda på hur många gäster du har så behöver du inte göra det, då vet du redan vilken nästa lediga plats är och kan bara lägga in gästen direkt utan att loopa igenom arrayen.

Äntligen klarnade det! Får nu ÄNTLIGEN upp felmeddelandet när det blivit fullt, hallelujah!!
Så då undrar jag hur du menar med att ta bort alla if element == null och vadå ta bort for-loopen? Tar jag bort den och lägger bara själva koden så sparas det inte ner. Har aldrig sparat nåpot till en array utan en for-loop.
Upptäckte också att PrintGuest gör något tokigt, tar bort ett värde. Får väl göra array till 26 för att slippa få upp plats 0 som det blir ifall jag inte kör guestListNumber++ direkt..

Permalänk
Medlem
Skrivet av Hjälplös nybörjare:

Äntligen klarnade det! Får nu ÄNTLIGEN upp felmeddelandet när det blivit fullt, hallelujah!!
Så då undrar jag hur du menar med att ta bort alla if element == null och vadå ta bort for-loopen? Tar jag bort den och lägger bara själva koden så sparas det inte ner. Har aldrig sparat nåpot till en array utan en for-loop.
Upptäckte också att PrintGuest gör något tokigt, tar bort ett värde. Får väl göra array till 26 för att slippa få upp plats 0 som det blir ifall jag inte kör guestListNumber++ direkt..

Din for-loop kan skrivas om som:

int index = 0; for (int i = 0; i < guestList.Length - 1; i++) { if (guestList[i] != null) { index = i; break; } } guestList[index] = new Guests(newName, newAge, newGender, newDrink); guestsATM++;

D.v.s. du behöver inte for-loopen för att lägga till en ny gäst, den är egentligen bara till för att hitta nästa lediga index. Men om du vet hur många gäster du redan har så vet du redan vad nästa lediga index är, eftersom nästa gäst alltid hamnar på platsen efter den förra. Så t.ex. gäst nr 5 hamnar alltid på index 4 (eftersom array-index börjar på 0).

Vad problemet med PrintGuest är ser jag inte i koden som du postat tidigare, men du behöver garanterat inte öka storleken på arrayen till 26 utan det beror på något annat fel du gör. Undvik såna fullösningar, för de kommer bara ge dig problem senare.

Permalänk
Skrivet av perost:

Din for-loop kan skrivas om som:

int index = 0; for (int i = 0; i < guestList.Length - 1; i++) { if (guestList[i] != null) { index = i; break; } } guestList[index] = new Guests(newName, newAge, newGender, newDrink); guestsATM++;

D.v.s. du behöver inte for-loopen för att lägga till en ny gäst, den är egentligen bara till för att hitta nästa lediga index. Men om du vet hur många gäster du redan har så vet du redan vad nästa lediga index är, eftersom nästa gäst alltid hamnar på platsen efter den förra. Så t.ex. gäst nr 5 hamnar alltid på index 4 (eftersom array-index börjar på 0).

Vad problemet med PrintGuest är ser jag inte i koden som du postat tidigare, men du behöver garanterat inte öka storleken på arrayen till 26 utan det beror på något annat fel du gör. Undvik såna fullösningar, för de kommer bara ge dig problem senare.

När jag testade din for-loop så slutade den spara ner mer än ett värde. Alltså när jag lägger till t.ex. 3 personer och sen tar show guestlist så blir får jag bara upp en enda gäst, nr 1.. Vad det kan bero på förstår jag inte. Och JA, jag har försökt använda debugger men jag löser inte den på nåt bra sätt.