Permalänk
Medlem

Fastnat i C#

Hej,

Jag har en skoluppgift som jag suttit med några dagar men inte riktigt får till och tänkte om någon kan kika och se vad det är jag missar?

Programmet ska se ut enligt följande:

"I objektet sodacrate ska det finns en vektor som håller reda på 25 stycken flaskor. Varje element i
vektorn är ett namn som exempelvis ”coca-cola” eller ”Ramlösa”.
Observera att det ska vara just en vektor och inte en lista.
I sodacrate ska det finnas en switch-case meny där alternativen kopplas till olika metoder. Dessa
metoder är:
1. Lägga till en läsk i vektorn (läskbacken)
2. Skriva ut innehållet i vektorn (läskbacken)
3. Beräkna det totala värdet av backen och skriv ut på skärmen
4. Avsluta programmet"

Det jag inte lyckas med är att få programmet att skriva ut/lagra input från användaren. Det fungerar när det randomiseras ut 24 flaskor för att fylla läskbacken. Väljer jag då i menyn att jag vill skriva ut innehållet eller beräkna värdet så gör programmet det.
Om jag däremot väljer läsk en och en så skrivs ingenting ut när jag vill skriva ut innehållet/beräkna värdet.
Ser ni något jag inte ser? Här är koden:

using System; namespace sodas { //En struct som innehåller värdena i form av namn och pris på läskerna. public struct Soda { public string name; public int price; } public class Sodacrate { //Skapar en vektor med 24 positioner. //Håller reda på antalet flaskor. private Soda[] sodaCrate = new Soda[24]; private int bottleNr = 0; public void Run() { int choice; Console.WriteLine("This is a program that helps you structure your sodacrate. Choose in the menu what you'd like to do"); //Skapar en meny. //Loopar menyn tills användaren väljer Exit Program. do { Console.WriteLine(); Console.WriteLine("***MENU***"); Console.WriteLine("1. Add new soda to crate"); Console.WriteLine("2. Show whats inside the crate."); Console.WriteLine("3. Calculate total price for the Sodacrate."); ; Console.WriteLine("0. Exit Program"); Console.WriteLine(); Console.Write("Enter the number representing what you want to do: "); //Felhantering //Ser till så att användaren endast kan mata in siffror. try { choice = int.Parse(Console.ReadLine()); } catch { Console.WriteLine(); Console.WriteLine("***Error*** You can only use numbers. Please try again"); choice = 9; continue; } Console.Clear(); //Ser till så användaren endast kan mata in giltiga siffror. if ((choice > 3) || (choice < 0)) { Console.WriteLine("***Error*** The number most be on the list. Please try again, press enter to continue"); Console.ReadLine(); Console.WriteLine(); } else { //Här bestäms vilken metod som ska köras vid de olika menyvalen. switch (choice) { case 1: add_soda(); break; case 2: print_crate(); break; case 3: int sumSoda = calc_total(); Console.WriteLine("The total price of what's in your crate is: " + sumSoda + " SEK, press enter to go back."); Console.ReadLine(); Console.Clear(); break; } } } while (choice != 0); } //Skapar de 6 olika läskerna man ska kunna välja bland. public Soda[] sodas() { Soda[] sodas = new Soda[6]; sodas[0].name = "Coca Cola"; sodas[0].price = 5; sodas[1].name = "Coca Cola Zero"; sodas[1].price = 5; sodas[2].name = "Fanta"; sodas[2].price = 5; sodas[3].name = "Sprite"; sodas[3].price = 5; sodas[4].name = "Julmust"; sodas[4].price = 5; sodas[5].name = "Påskmust"; sodas[5].price = 5; return sodas; } //Metoden för att lägga till en läsk i backen. public void add_soda() { //Laddar in de olika läskerna. Soda[] availableSodas = sodas(); int choice = 0; Console.WriteLine(); Console.WriteLine("***SODAS***"); //Sriver ut möjliga läskflaskor och deras pris. for (int i = 0; i < availableSodas.Length; i++) { Console.WriteLine("{0}. {1}, {2}kr", i + 1, availableSodas[i].name, availableSodas[i].price); } Console.WriteLine("7. Randomise 24 sodabottles."); Console.WriteLine(); Console.Write("What Soda do you want to add to the crate: "); //Felhantering //Ser till att användaren endast matar in siffror. try { choice = int.Parse(Console.ReadLine()); } catch { Console.WriteLine("Error. You can only use numbers. Please try again, press enter"); Console.ReadLine(); Console.WriteLine(); choice = 10; } Console.Clear(); if (choice == 10) { } //Ser till så att användaren endast matar in giltiga siffror. else if ((choice < 1) || (choice > 7)) { Console.WriteLine("Error. The number most be on the list. Please try again, press enter"); Console.ReadLine(); Console.WriteLine(); } //Om backen är full meddelas användaren här. else if (bottleNr == 24) { Console.WriteLine("The sodacrate is full, you can't add more."); } //För choice 7 (randomiserat val) används Random rnd metoden. else if (choice == 7) { Random rnd = new Random(); //Loopar tills läskbacken är fylld. for (int i = bottleNr; i < sodaCrate.Length; i++) { sodaCrate[i] = availableSodas[rnd.Next(availableSodas.Length)]; bottleNr++; } } } //Metoden för att skriva ut vad som är i läskbacken. public void print_crate() { Console.WriteLine(); Console.WriteLine("Your Sodacrate: "); //Skriver ut alla läskflaskor som finns i läskbacken. for (int i = 0; i < bottleNr; i++) { Console.WriteLine("{0}. {1}, {2}kr", i + 1, sodaCrate[i].name, sodaCrate[i].price); } Console.WriteLine("Press Enter."); Console.ReadLine(); } //Metod för att räkna ut priset på innehållet i backen. public int calc_total() { Console.WriteLine(); int totalPrice = 0; //Går igenom alla läskflaskor i läskbacken och lägger till deras pris till totalpriset. for (int i = 0; i < bottleNr; i++) { totalPrice = totalPrice + sodaCrate[i].price; } return totalPrice; } } class Program { public static void Main(string[] args) { //Skapar ett objekt av klassen Sodacrate som heter sodacrate var sodacrate = new Sodacrate(); sodacrate.Run(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } }

Permalänk
Medlem

Haha, frågor om denna uppgift dyker ofta upp här. Sök i forumet så kan du säkert få inspiration hur du ska fortsätta.

Skickades från m.sweclockers.com

Visa signatur

Windows 11 Pro | Intel i7 8700 | ASUS Prime Z370-P | Corsair 16GB 3000MHz | ASUS GTX 1080 | Fractal Design Define S | Corsair RM750x | Hyper 212 EVO

Permalänk
Medlem
Skrivet av Jan02:

Det jag inte lyckas med är att få programmet att skriva ut/lagra input från användaren.

Du sparar aldrig det inlästa värdet i din vektor. Du läser bara in ett värde, kollar om det är giltigt, och slänger sen bort det.

Permalänk
Medlem

@Jan02: Ser inte riktigt vart du har funktionen för att lägga till en Soda manuellt?
Ser
if (choice == 10)
else if ((choice < 1) || (choice > 7))
else if (bottleNr == 24)
else if (choice == 7)

Men du hanterar inte choice 0-5.

Sen får du nog se över om du verkligen ska använda < 1, då 0 är ett valid choice i din array på availableSodas

Permalänk
Medlem
Skrivet av BlasteRs:

Sen får du nog se över om du verkligen ska använda < 1, då 0 är ett valid choice i din array på availableSodas

Tanken är nog att användaren ska mata in ett värde mellan 1 och 6, d.v.s. ett index i människovänligt format som koden sen konverterar till rätt array-index.

Permalänk
Medlem
Skrivet av perost:

Tanken är nog att användaren ska mata in ett värde mellan 1 och 6, d.v.s. ett index i människovänligt format som koden sen konverterar till rätt array-index.

Jo jag såg att jag missade i+1 i writeline

Permalänk
Medlem

@perost:
Precis, det var de jag tänkte också.
Försökt lösa det med genom denna kod i första for-loopen:

availableSodas[i]= Convert.ToInt32(Console.ReadLine());

Men det fungerar inte för att "Cannot implicitly convert type 'int' to 'sodas.Soda' "
Vill du hjälpa mig lite på traven?

Permalänk
Medlem

@Jan02: Varför vill du använda en for-loop, är det inte meningen att du bara ska lägga till läsken som användaren valt i backen? I add_soda så läser du ju in indexet på läsken som användaren vill lägga till (choice) från din array med alla olika läsker (availableSodas), en läskback att lägga till läsken i (sodaCrate), samt nästa lediga index i backen (bottleNr). Så det handlar bara om att kopiera rätt läsk från listan med läsker till rätt position i backen.

Permalänk
Medlem

@perost:
Jag tänkte att for-loopen skulle hjälpa för att lägga läsken på position i min array. Det var mer ett antagande av mig att det skulle göra det lättare men jag får tyvärr inte till det. Tack för all hjälp! Jag får försöka vidare