Hjälp med projekt arbete läskbacken! Nybörjare inom programmering!

Permalänk

Hjälp med projekt arbete läskbacken! Nybörjare inom programmering!

Hej! Jag håller på med ett projekt arbete för programmering 1 och jag får det inte att fungera som jag vill.

Uppgiften går ut på att jag ska lagra 24 stycken drycker i en vektor, inte en lista.
Jag ska göra en meny med fyra val.

1. Lägg till dryck
2. Visa innehåll
3. Beräkna värde
4. Avsluta

När man lägger till dryck ska det stå: Vilken tryck vill du ha i backen?: Hur många flaskor vill du lägga till?:

Jag vill sen att det ska stå: Du valde att lägga till Ex: 5 st Ex: Fanta i din back. Du har nu 20 platser kvar i backen.

När man sedan klickar på alternativ 2. Visa innehåll så vill jag att det ska skrivas ut vilken läsk som ligger i vilket fack/position.

Jag förstår att det är rätt simpelt för er som är lite mer kunniga och hoppas därför på att kunna få hjälp ifrån er, all hjälp uppskattas!!!

Så här ser min kod ut just nu:

namespace sodacrate { class Sodacrate { //Skapar vektor med 24 element private string[] flaskor = new string[24]; private int antal_flaskor = 0; //Håller reda på antal flaskor //Meny public void Run() { int meny = 0; //Gör detta do { Console.WriteLine(""); Console.WriteLine("Välj ett alternativ"); Console.WriteLine("1. Lägg till en dryck"); Console.WriteLine("2. Visa innehåll"); Console.WriteLine("3. Beräkna värde"); Console.WriteLine("4. Avsluta program"); meny = int.Parse(Console.ReadLine()); switch (meny) { case 1: add_soda(); //Lägg till läsk break; case 2: print_crate();//Visa innehåll break; case 3: ; //Beräkna värde break; case 4: Console.WriteLine("Programmet avslutas!"); // Avsluta program //meny = false; break;????? break; default: Console.WriteLine("Felaktig inmatning"); break; } //Medan detta stämmer } while (meny != 4); } public void add_soda() // Lägg till dryck och skriv antal tomma platser //amount_bottles används för att byta ut dryck mot ny dryck { Console.WriteLine("Vilken dryck vill du lägga till i backen?: "); Console.WriteLine("1. Coca Cola"); Console.WriteLine("2. Fanta"); Console.WriteLine("3. julmust"); Console.WriteLine("4. Lättöl"); Console.WriteLine("5. Ramlösa"); switch (Console.ReadLine()) { case "1": Console.WriteLine("Coca Cola"); break; case "2": Console.WriteLine("Fanta"); break; case "3": Console.WriteLine("Julmust"); break; case "4": Console.WriteLine("Lättöl"); break; case "5": Console.WriteLine("Ramlösa"); break; default: Console.WriteLine("Felaktig inmatning"); break; } //Nu lagras antal läsk men inte vilken läsk HÄR Console.Write("Hur många flaskor vill du lägga till?: "); flaskor[antal_flaskor] = Console.ReadLine(); antal_flaskor++; } public void print_crate() //Visa innehåll { for (int i = 0; i < flaskor.Count(); i++) { if (flaskor.Length > 0) Console.WriteLine("Fack {0}: {1}", i, flaskor[i]); //Här vill jag skriva ut fack och sedan vilken läsk som är lagrad i den positionen. OCH HÄR else Console.WriteLine("Dryckfack {0} är tom.", i); } } /*public int calc_total() //Beräkna backens värde { //Tänk på att inte räkna med tomma positioner i vektorn }*/ } class Program { public static void Main(string[] args) { Console.WriteLine("Välkommen till läskbacken!"); //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

I din add_soda funktion vill du egentligen göra flera saker.
1. Fråga vilken dryck användaren vill lägga till.
2. Fråga hur många av den valda drycken som ska läggas till.
3. Lägg till den valda drycken x antal gånger i backen (där x är svaret från punkt 2).
4. Skriv ut lite bra info till användare, vad den lagt till och hur många platser det finns kvar i backen.

Istället för att göra punk tre lägger du nu till antalet gånger direkt i backen. För att göra punk tre behöver du då alltså istället veta vad användaren svarade i punkt 1 och 2 för att sedan kunna göra punkt 3.

Permalänk
Avstängd

@Bananeripyamas: I add_soda-funktionen så gör du ju inget med valet som användaren gör förutom att skriva ut vad de valde. Jag hade nog gjort typ:

case "1": Console.WriteLine("Hur många Coca Cola vill du lägga till?"); var antal = Console.ReadLine(); addColas(antal); ... void addColas(antal) { for (i = 0; i < antal; i++) { //lägg till Coca Cola i första lediga position i arrayen och öka antalet flaskor med 1... } }

Tänk också på att kontrollera input så du kan hantera om man inte skriver in en siffra osv. För beräkna pris funktionen så hade jag nog gjort det i casen också (edit: eller snarare i addColas-metoden och motsvarande), i alla fall om det är olika priser på olika läsksorter.

Permalänk
Medlem
Skrivet av snajk:

@Bananeripyamas: I add_soda-funktionen så gör du ju inget med valet som användaren gör förutom att skriva ut vad de valde. Jag hade nog gjort typ:

case "1": Console.WriteLine("Hur många Coca Cola vill du lägga till?"); var antal = Console.ReadLine(); addColas(antal); ... void addColas(antal) { for (i = 0; i < antal; i++) { //lägg till Coca Cola i första lediga position i arrayen och öka antalet flaskor med 1... } }

Tänk också på att kontrollera input så du kan hantera om man inte skriver in en siffra osv. För beräkna pris funktionen så hade jag nog gjort det i casen också (edit: eller snarare i addColas-metoden och motsvarande), i alla fall om det är olika priser på olika läsksorter.

Eller så skapar man en funktion som tar två parametrar, typ "void addSodas(string typeOfSoda, int numberOfBottles)" så slipper man en funktion för varje sorts dricka, då dessa funktioner skulle innehålla identisk kod, bortsett från just strängen som anger drickasort.

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Avstängd
Skrivet av PeCe:

Eller så skapar man en funktion som tar två parametrar, typ "void addSodas(string typeOfSoda, int numberOfBottles)" så slipper man en funktion för varje sorts dricka, då dessa funktioner skulle innehålla identisk kod, bortsett från just strängen som anger drickasort.

Jo absolut, men ska man räkna pris så skiljer ju sig det också förstås, men det kan man ju göra på annan plats med. Men man vill ju inte göra för mycket i en sådan här fråga liksom, bara en knuff i rätt riktning.

Permalänk

Console.WriteLine("Vilken dryck vill du lägga till i backen?: "); Console.WriteLine("1. Coca Cola"); Console.WriteLine("2. Fanta"); Console.WriteLine("3. julmust"); Console.WriteLine("4. Lättöl"); Console.WriteLine("5. Ramlösa"); // Här skriver du bara ut vilken flaska som användaren har valt, du sparar aldrig vilken de vart dock. // string flaska; switch (Console.ReadLine()) // switch (flaska) { case "1": // flaska = "Coca Cola"; Console.WriteLine("Coca Cola"); break; case "2": // flaska = "Fanta"; Console.WriteLine("Fanta"); break; case "3": // flaska = "Julmust"; Console.WriteLine("Julmust"); break; case "4": // flaska = "Lättöl"; Console.WriteLine("Lättöl"); break; case "5": // flaska = "Ramlösa"; Console.WriteLine("Ramlösa"); break; default: // flaska = ""; Console.WriteLine("Felaktig inmatning"); break; } // Här lägger du till flaskan, men du frågar hur många läskar som ska in i backen. // Därför hade det vart lämpligt att spara vilken flaska som användaren valde i en variabel, som du sedan lägger till här. Console.Write("Hur många flaskor vill du lägga till?: "); flaskor[antal_flaskor] = Console.ReadLine(); // Här kommer du lägga till en siffra, eller vad användaren nu väljer att mata in. Du lägger aldrig till en flaska. antal_flaskor++; // flaskor[antal_flaskor] = flaska; // antal_flaskor++; /* Exempel över hur du kan lägga till flera flaskor. * Console.Write("Hur många flaskor vill du lägga till: "); * int antal = int.Parse(Console.ReadLine()); * for(int i = 0; i < antal; i++) * { * flaskor[antal_flaskor] = flaska; * antal_flaskor++; * } * * Använd dock endast detta om ni gått igenom for-loopen. Strunta i antalet flaskor annars. */

Kommenterade in lite hjälpkod.

Du saknar ett sätt att kontrollera ifall backen är full. Kontrollera i slutet av metoden om antal_flaskor är 24. Då ska man inte få lägga till fler flaskor.

Hade det inte vart enklare att använda en klass för varje läsk? Typ

class Soda { public string Namn { get; set; } public int Värde { get; set; } }

Så när du vill skapa en läsk skriver du bara

Soda nyLäsk = new Soda() { Namn = "namnet på läsken", Värde = Värdet på läsken }; // Går alldeles utmärkt göra detta direkt i vectorn också. flaskor[antalflaskor] = new Soda() { Namn = "namnet på läsken", Värde = Värdet på läsken };

Begriper dock inte varför ni gjort en ny klass för menyer och så? Så här tidigt in i programmering 1 duger nog Main metoden alldeles utmärkt för detta. Plus på de så läser man väl inte ens OOP i programmering 1.

Permalänk
Skrivet av noyce:

I din add_soda funktion vill du egentligen göra flera saker.
1. Fråga vilken dryck användaren vill lägga till.
2. Fråga hur många av den valda drycken som ska läggas till.
3. Lägg till den valda drycken x antal gånger i backen (där x är svaret från punkt 2).
4. Skriv ut lite bra info till användare, vad den lagt till och hur många platser det finns kvar i backen.

Istället för att göra punk tre lägger du nu till antalet gånger direkt i backen. För att göra punk tre behöver du då alltså istället veta vad användaren svarade i punkt 1 och 2 för att sedan kunna göra punkt 3.

Jag har försökt göra som du sagt och jag har lyckats med 1, 2, 3 och sen skriva ut lite bra info till användaren men inte hur många platser det finns kvar i vektorn :/

Min kod ser ut så här nu i metoden add_soda:

public void add_soda() // Lägger till dryck och skriv antal tomma platser //amount_bottles används för att byta ut dryck mot ny dryck { Console.WriteLine("Vilken dryck vill du lägga till i backen?: "); Console.WriteLine("1. Coca Cola"); Console.WriteLine("2. Fanta"); Console.WriteLine("3. Julmust"); Console.WriteLine("4. Lättöl"); Console.WriteLine("5. Ramlösa"); string flaska; switch (Console.ReadLine()) { case "1": flaska = "Coca Cola"; Console.WriteLine("Du valde att lägga till Coca Cola"); break; case "2": flaska = "Fanta"; Console.WriteLine("Du valde att lägga till Fanta"); break; case "3": flaska = "Julmust"; Console.WriteLine("Du valde att lägga till Julmust"); break; case "4": flaska = "Lättöl"; Console.WriteLine("Du valde att lägga till Lättöl"); break; case "5": flaska = "Ramlösa"; Console.WriteLine("Du valde att lägga till Ramlösa"); break; default: flaska = ""; Console.WriteLine("Felaktig inmatning"); break; } Console.Write("Hur många {0} vill du lägga till: ", flaska); int antal = int.Parse(Console.ReadLine()); for (int i = 0; i < antal; i++) { flaskor[antal_flaskor] = flaska; antal_flaskor++; } Console.WriteLine("Du valde att lägga till {0} styck {1}", antal, flaska);

Permalänk
Medlem

@Bananeripyamas:

Console.WriteLine(flaskor.Length - antalFlaskor + " platser kvar");

Bonusuppgift, se till att inte kunna lägga till mer än antalet platser kvar

Permalänk

@gothxx: Tack!!

Den ser ut så här nu:

public void add_soda() // Lägger till dryck och skriv antal tomma platser //amount_bottles används för att byta ut dryck mot ny dryck { Console.WriteLine("Vilken dryck vill du lägga till i backen?: "); Console.WriteLine("1. Coca Cola"); Console.WriteLine("2. Fanta"); Console.WriteLine("3. Julmust"); Console.WriteLine("4. Lättöl"); Console.WriteLine("5. Ramlösa"); string flaska; switch (Console.ReadLine()) { case "1": flaska = "Coca Cola"; Console.WriteLine("Du valde att lägga till Coca Cola"); break; case "2": flaska = "Fanta"; Console.WriteLine("Du valde att lägga till Fanta"); break; case "3": flaska = "Julmust"; Console.WriteLine("Du valde att lägga till Julmust"); break; case "4": flaska = "Lättöl"; Console.WriteLine("Du valde att lägga till Lättöl"); break; case "5": flaska = "Ramlösa"; Console.WriteLine("Du valde att lägga till Ramlösa"); break; default: flaska = ""; Console.WriteLine("Felaktig inmatning"); break; } Console.Write("Hur många {0} vill du lägga till: ", flaska); int antal = int.Parse(Console.ReadLine()); for (int i = 0; i < antal; i++) { flaskor[antal_flaskor] = flaska; antal_flaskor++; } Console.WriteLine("Du valde att lägga till {0} styck {1}", antal, flaska); Console.WriteLine(flaskor.Length - antal_flaskor + " platser kvar i läskbacken");

Problemet är att om jag lägger till fler än 24 flaskor så kraschar programmet, och om jag väljer en siffra högre än fem (som inte finns med i switch case menyn) så skriver konsolen ut felaktig inmatning och sedan hoppar den till att fråga hur många drycker man vill lägga till och så lagras det så många tomrum som man knappat in..

Permalänk

@Burhan123: Tack så mycket!! Jag vet dock inte hur jag skulle gå till väga om jag skulle använda mig utav en klass för varje läsk, varje läsk kostar i alla fall 5 kronor styck. Jag skickade koden här nedan som du kanske kan ta en kik på och komma med fler kommentarer Jag vet inte varför men vi måste använda oss utav en klass, den var även med när man fick en kodmall inför programmet. Det är väldigt mycket att lära på kort tid så även då jag får i princip allt förklarat för mig så har jag lite svårt att hänga med.

Permalänk
Medlem

Att programmet krashar när du matar in maxvärde känns som ett indexeringsfel, att du någonstans försöker göra något med plats 24 i en container som har platser 0-23.

För den felaktiga inmatning skull du kunna e.g. sätta en flagga om felaktig inmatning görs ("felaktigt_val", initiera till false, sätt till true i default casen in din switch), och bara gå vidare om den fortfarande är false.

Visa signatur

Redbox: Asrock B650 Lightning ATX, 7800x3D -20CCO, XFX 6950XT, 2x32GB Corsair Vengence 6400 CL32, WD SN770 2TB, Corsair RMe 1000, Lian Li Lancool 216, Peerless Assassin 120 SE
Purpbox: Z87-Pro, I5 4670K@4.2, Sapphire 290 TRI-X, 2x8GB Crucial Tactical@stock, Deep Silence 1
Samsung Evo 250+500GB + QVO 1TB, 2x1TB 7200RPM backup/lagring
Det var bättre förr: E5300 2600MHz -> 3640MHz, Celeron 300A -> 450MHz

Permalänk
Skrivet av Bananeripyamas:

@gothxx: Tack!!

Den ser ut så här nu:

public void add_soda() // Lägger till dryck och skriv antal tomma platser //amount_bottles används för att byta ut dryck mot ny dryck { Console.WriteLine("Vilken dryck vill du lägga till i backen?: "); Console.WriteLine("1. Coca Cola"); Console.WriteLine("2. Fanta"); Console.WriteLine("3. Julmust"); Console.WriteLine("4. Lättöl"); Console.WriteLine("5. Ramlösa"); string flaska; switch (Console.ReadLine()) { case "1": flaska = "Coca Cola"; Console.WriteLine("Du valde att lägga till Coca Cola"); break; case "2": flaska = "Fanta"; Console.WriteLine("Du valde att lägga till Fanta"); break; case "3": flaska = "Julmust"; Console.WriteLine("Du valde att lägga till Julmust"); break; case "4": flaska = "Lättöl"; Console.WriteLine("Du valde att lägga till Lättöl"); break; case "5": flaska = "Ramlösa"; Console.WriteLine("Du valde att lägga till Ramlösa"); break; default: flaska = ""; Console.WriteLine("Felaktig inmatning"); break; } Console.Write("Hur många {0} vill du lägga till: ", flaska); int antal = int.Parse(Console.ReadLine()); for (int i = 0; i < antal; i++) { flaskor[antal_flaskor] = flaska; antal_flaskor++; } Console.WriteLine("Du valde att lägga till {0} styck {1}", antal, flaska); Console.WriteLine(flaskor.Length - antal_flaskor + " platser kvar i läskbacken");

Problemet är att om jag lägger till fler än 24 flaskor så kraschar programmet, och om jag väljer en siffra högre än fem (som inte finns med i switch case menyn) så skriver konsolen ut felaktig inmatning och sedan hoppar den till att fråga hur många drycker man vill lägga till och så lagras det så många tomrum som man knappat in..

Den vektor du har gjort har ett begränsat antal platser (24) precis som en läskback. När den är full går det inte att stoppa in fler objekt i den. Men i programmering blir det i stället en krasch om man försöker stoppa in något där det inte får plats, så det du behöver göra för att slippa kraschen är att kontrollera om flaskan du ska stoppa in verkligen får plats i din back.

Visa signatur

Corsair Vengeance LPX 4x8GB DDR4 2666MHz CL16 | Intel Core i7 6700 3,4 GHz 8MB | MSI Z170A KRAIT GAMING | Corsair Force Series 3 120 GB | Seagate SSHD Desktop 2 TB 7200 RPM 3,5" | Creative Sound Blaster Z PCIe | Western Digital 500 GB | Samsung Writemaster | Corsair TX750 V2 750 W | EVGA GeForce GTX 970 4GB SSC ACX 2.0+| Fractal Design Define R5 (Svart)

Permalänk
Medlem
Skrivet av Bananeripyamas:

Problemet är att om jag lägger till fler än 24 flaskor så kraschar programmet, och om jag väljer en siffra högre än fem (som inte finns med i switch case menyn) så skriver konsolen ut felaktig inmatning och sedan hoppar den till att fråga hur många drycker man vill lägga till och så lagras det så många tomrum som man knappat in..

Här beskriver du dina problem på ett bra sätt. Nu gäller det att hitta en metod för att lösa problemen också. Ett tillvägagångssätt kan vara:
1. Definiera problemet
2. Vad vill du ska hända?
3. Vad behövs göras för att lösa problemet
4. Översätt till kod

Så,
1. Om jag lägger till fler än 24 flaskor kraschar programmet.
2. Om det är fler än 24 flaskor ska vi inte lägga till fler flaskor.
3. Vi behöver nog kolla hur många flaskor det finns i backen innan vi lägger till flaskor.
4. ...

Det svåra här är att förstå sina problem och varför de inträffar. Vet man det så kommer resterande punkter inte bli lika svåra. I detta fall kanske vi lyckas stoppa problemet, utan att förstå varför problemet uppstår - vilket är stor skillnad. För att bli bra på programmering krävs det att man också vill förstå.

Så egentligen borde det nog vara en punkt 1,5 i detta inlägg också - att förstå problemet.

Varför det inte gick att lägga till fler än 24 flaskor har du redan fått svar på såg jag:)

Skickades från m.sweclockers.com

Permalänk
Skrivet av Bananeripyamas:

@Burhan123: Tack så mycket!! Jag vet dock inte hur jag skulle gå till väga om jag skulle använda mig utav en klass för varje läsk, varje läsk kostar i alla fall 5 kronor styck. Jag skickade koden här nedan som du kanske kan ta en kik på och komma med fler kommentarer Jag vet inte varför men vi måste använda oss utav en klass, den var även med när man fick en kodmall inför programmet. Det är väldigt mycket att lära på kort tid så även då jag får i princip allt förklarat för mig så har jag lite svårt att hänga med.

Du måste fortfarande lägga till en kontroll ifall backen är full eller inte. Annars ser det ganska bra ut.

Självklart, om du inte vet hur klasser fungerar ska du inte använda dem. Dock undrar jag varför ni fått en mall. Det blir bara förvirrande, än om man bestämde själv hur man skulle strukturera koden. Speciellt om ni inte gått igenom klasser eller metoder.
Ta ett snack med din programmeringslärare om du tycker att det går för fort.

Permalänk
Skrivet av e1m1:

Att programmet krashar när du matar in maxvärde känns som ett indexeringsfel, att du någonstans försöker göra något med plats 24 i en container som har platser 0-23.

För den felaktiga inmatning skull du kunna e.g. sätta en flagga om felaktig inmatning görs ("felaktigt_val", initiera till false, sätt till true i default casen in din switch), och bara gå vidare om den fortfarande är false.

Jag förstår vad du menar med att sätta till true i default men vad menar du med sätta en flagga om felaktig inmatning görs?

Permalänk
Skrivet av noyce:

Här beskriver du dina problem på ett bra sätt. Nu gäller det att hitta en metod för att lösa problemen också. Ett tillvägagångssätt kan vara:
1. Definiera problemet
2. Vad vill du ska hända?
3. Vad behövs göras för att lösa problemet
4. Översätt till kod

Så,
1. Om jag lägger till fler än 24 flaskor kraschar programmet.
2. Om det är fler än 24 flaskor ska vi inte lägga till fler flaskor.
3. Vi behöver nog kolla hur många flaskor det finns i backen innan vi lägger till flaskor.
4. ...

Det svåra här är att förstå sina problem och varför de inträffar. Vet man det så kommer resterande punkter inte bli lika svåra. I detta fall kanske vi lyckas stoppa problemet, utan att förstå varför problemet uppstår - vilket är stor skillnad. För att bli bra på programmering krävs det att man också vill förstå.

Så egentligen borde det nog vara en punkt 1,5 i detta inlägg också - att förstå problemet.

Varför det inte gick att lägga till fler än 24 flaskor har du redan fått svar på såg jag:)

Skickades från m.sweclockers.com

Jag vill förstå och jag försöker verkligen, jag har försökt en himla massa med if satser, vet ej om det är det jag bör använda men jag får inte till det i alla fall, jag förstår så långt att jag måste kontrollera så att backen inte är full innan man får lägga till fler flaskor men jag vet inte hur jag ska göra det. Jag har testat med if satser utanför for loopen, innan for loopen, innan case menyn, ja lite överallt helt enkelt.

Permalänk
Medlem
Skrivet av Bananeripyamas:

Jag förstår vad du menar med att sätta till true i default men vad menar du med sätta en flagga om felaktig inmatning görs?

Med flagga menar man oftast bara en variabel som har som syfte att "flagga" för att något hänt. Oftast behöver man bara två tillstånd, hänt eller inte hänt, så då är en bool lämplig som bara kan vara true eller false. I ditt fall behöver du bara en variabel som du kan sätta till något lämpligt värde om användaren matade in ogiltig data, och sedan kolla om variabeln har det värdet eller inte efter switch-satsen. Du råkar faktiskt redan ha det, nämligen flaska-variabeln som kommer vara tom efter switch-satsen om användaren valde fel.

Fast om du inte vill göra något annat än att gå ur funktionen om du får ogiltig data så kan du förstås bara lägga en return direkt i default-satsen:

switch (Console.ReadLine()) { ... default: Console.WriteLine("Felaktig inmatning"); return; // Återvänder till anroparen av funktionen. break; }

Permalänk
Medlem
Skrivet av Bananeripyamas:

Jag vill förstå och jag försöker verkligen, jag har försökt en himla massa med if satser, vet ej om det är det jag bör använda men jag får inte till det i alla fall, jag förstår så långt att jag måste kontrollera så att backen inte är full innan man får lägga till fler flaskor men jag vet inte hur jag ska göra det. Jag har testat med if satser utanför for loopen, innan for loopen, innan case menyn, ja lite överallt helt enkelt.

Det tvivlar jag inte på En if-sats låter som en bra idé, en annan sak att tänka på är vad som behövs för att lösningen man tänkt fram - alltså för att kontroller om backen är full, alternativt om det går att lägga till x antal flaskor. Nu lägger du till x antal flaskor som användaren skriver in. Med det x:er samt antalet redan sparade flaskor bör du kunna få fram en kontroll som säger om det går att lägga till så många flaskor exempelvis.

Ett annat alternativ är att du fyller på backen så mycket det går och nästa gång man klickar på att lägga till en flaska då kontrollerar du om den är full eller ej, om nej hoppa in i fin add_soda funktion.

Det mesta går att lösa på olika sätt, gäller att tänka, testa och se om det är den lösningen man var ute efter.

Edit: Ett tips här är att du måste se upp med vad det faktiska max-talet som du ska jämföra med är. Du anger att vektorn ska ha 24 platser. Vilket nummer kommer den sista platsen ha (vad är det första numret i vektorn)?

Lycka till!

Skickades från m.sweclockers.com

Permalänk
Skrivet av Bananeripyamas:

Jag vill förstå och jag försöker verkligen, jag har försökt en himla massa med if satser, vet ej om det är det jag bör använda men jag får inte till det i alla fall, jag förstår så långt att jag måste kontrollera så att backen inte är full innan man får lägga till fler flaskor men jag vet inte hur jag ska göra det. Jag har testat med if satser utanför for loopen, innan for loopen, innan case menyn, ja lite överallt helt enkelt.

Antingen får du kontrollera varje varv i for-loopen om antalet flaskor som redan finns i backen är större än eller lika med max-antalet, eller så får du räkna ut antalet platser som finns kvar i backen och jämföra det med antalet du vill stoppa i. Beroende på hur du vill att ditt program ska fungera.

Visa signatur

Corsair Vengeance LPX 4x8GB DDR4 2666MHz CL16 | Intel Core i7 6700 3,4 GHz 8MB | MSI Z170A KRAIT GAMING | Corsair Force Series 3 120 GB | Seagate SSHD Desktop 2 TB 7200 RPM 3,5" | Creative Sound Blaster Z PCIe | Western Digital 500 GB | Samsung Writemaster | Corsair TX750 V2 750 W | EVGA GeForce GTX 970 4GB SSC ACX 2.0+| Fractal Design Define R5 (Svart)

Permalänk
Skrivet av perost:

Med flagga menar man oftast bara en variabel som har som syfte att "flagga" för att något hänt. Oftast behöver man bara två tillstånd, hänt eller inte hänt, så då är en bool lämplig som bara kan vara true eller false. I ditt fall behöver du bara en variabel som du kan sätta till något lämpligt värde om användaren matade in ogiltig data, och sedan kolla om variabeln har det värdet eller inte efter switch-satsen. Du råkar faktiskt redan ha det, nämligen flaska-variabeln som kommer vara tom efter switch-satsen om användaren valde fel.

Fast om du inte vill göra något annat än att gå ur funktionen om du får ogiltig data så kan du förstås bara lägga en return direkt i default-satsen:

switch (Console.ReadLine()) { ... default: Console.WriteLine("Felaktig inmatning"); return; // Återvänder till anroparen av funktionen. break; }

Okej tack Jag provade att ta bort "flaska = "";" och istället lägga till "return;" under Console.WriteLine men får felmeddelandet "unreachable code detected".. :/ Om man matar in fel data så vill jag att programmet ska hoppa tillbaka till att fråga vad användaren vill lägga till för dryck. Som det ser ut just nu när man matar in en felaktig siffra då fortsätter programmet och man får frågan om hur många man vill lägga till. När jag sedan kommer tillbaka till huvudmenyn och vill kolla backens innehåll så blir det x antal "tomrum" i vektorn beroende på antal jag matade in.

Nu har jag i alla fall fått till det så att det skrivs ut till användaren när backen är full. Men lägger man i för många kraschar fortfarande programmet..

public void add_soda() // Lägger till dryck och skriv antal tomma platser //amount_bottles används för att byta ut dryck mot ny dryck { Console.WriteLine("Vilken dryck vill du lägga till i backen?: "); Console.WriteLine("1. Coca Cola"); Console.WriteLine("2. Fanta"); Console.WriteLine("3. Julmust"); Console.WriteLine("4. Lättöl"); Console.WriteLine("5. Ramlösa"); string flaska; switch (Console.ReadLine()) { case "1": flaska = "Coca Cola"; Console.WriteLine("Du valde att lägga till Coca Cola"); break; case "2": flaska = "Fanta"; Console.WriteLine("Du valde att lägga till Fanta"); break; case "3": flaska = "Julmust"; Console.WriteLine("Du valde att lägga till Julmust"); break; case "4": flaska = "Lättöl"; Console.WriteLine("Du valde att lägga till Lättöl"); break; case "5": flaska = "Ramlösa"; Console.WriteLine("Du valde att lägga till Ramlösa"); break; default: flaska = ""; Console.WriteLine("Felaktig inmatning"); break; } Console.Write("Hur många {0} vill du lägga till: ", flaska); int antal = int.Parse(Console.ReadLine()); for (int i = 0; i < antal; i++) { flaskor[antal_flaskor] = flaska; antal_flaskor++; } Console.WriteLine("Du valde att lägga till {0} styck {1}", antal, flaska); if (antal == 24) { Console.WriteLine("Back full"); } else { Console.WriteLine(flaskor.Length - antal_flaskor + " platser kvar i läskbacken"); }

Permalänk
Medlem

switch (Console.ReadLine())
{
...
default:
Console.WriteLine("Felaktig inmatning");
return; // Återvänder till anroparen av funktionen.
break;
}

Felet du får här är att raden "break;" ALDRIG kan nås eftersom raden ovanför alltid kommer bryta exekveringen av funktionen. Errors och warnings är en väldigt bra feature in kompilatorn som hindrar oss från att skriva kod med uppenbara fel, och ge oss anledningen i klartext snarare än att vi får ett program som inte alltid gör vad vi vill och vi inte vet varför.

Allt eftersom du får mer erfarenhet kommer du lära dig mer och mer om varför du får dylika fel och fixa dem snabbt. Jag tycker detta felet är helt uppenbart och känner att detta är något du borde kunna lösa själv, men jag vet också att alla kompileringsfel kändes konstiga och jobbiga när jag precis börjat med programmering

Förstår du inte felen eller hur man ska fixa dem rekommenderar jag vidare att du börjar träna på ett annat sätt att lösa problem. Nämligen Google. Det är mycket snabbare att leta upp lösningen på ens problem genom att leta upp någon annans fråga på ens problem, från något random forum eller på t.ex. stack overflow, än att själv ställa frågan och vänta på svar.

Sök "java unreachable code". Första träffen är:
https://stackoverflow.com/questions/9898549/why-is-this-code-...
vilket är precis samma fel som du har med kod under ett return-statement

Visa signatur

Redbox: Asrock B650 Lightning ATX, 7800x3D -20CCO, XFX 6950XT, 2x32GB Corsair Vengence 6400 CL32, WD SN770 2TB, Corsair RMe 1000, Lian Li Lancool 216, Peerless Assassin 120 SE
Purpbox: Z87-Pro, I5 4670K@4.2, Sapphire 290 TRI-X, 2x8GB Crucial Tactical@stock, Deep Silence 1
Samsung Evo 250+500GB + QVO 1TB, 2x1TB 7200RPM backup/lagring
Det var bättre förr: E5300 2600MHz -> 3640MHz, Celeron 300A -> 450MHz

Permalänk
Medlem
Skrivet av Bananeripyamas:

Okej tack Jag provade att ta bort "flaska = "";" och istället lägga till "return;" under Console.WriteLine men får felmeddelandet "unreachable code detected".. :/

Det beror troligtvis på att du lagt return före utskriften, vilket gör att utskriftskoden aldrig kommer nås eftersom return omedelbart returnerar från funktionen:

... if (something) { return; Console.WriteLine("Något gick fel"); // <= Onåbar kod, a.k.a. död kod, som aldrig någonsin kommer köras p.g.a. return ovan. } Console.WriteLine("Något gick inte fel"); // <= Nåbar kod.

Detta är väl egentligen inget fel utan bara kompilatorn som vill varna dig att du gjort något dumt, men det kan hända att det är inställt att ge kompileringsfel. Notera att även den nåbara koden ovan kan vara onåbar om something t.ex. är en konstant med värde true, så att if-satsen med all säkerhet alltid körs.

Skrivet av Bananeripyamas:

Om man matar in fel data så vill jag att programmet ska hoppa tillbaka till att fråga vad användaren vill lägga till för dryck.

Då har du i princip två val: antingen får du lägga switch-satsen i en loop som t.ex. loopar tills flaska inte längre är tom (d.v.s. användaren matade in ett giltigt val), eller så får du returnera t.ex. en bool från funktionen för att signalera om funktionen lyckades eller inte så att anroparen kan anropa funktionen igen om den vill.

Skrivet av Bananeripyamas:

Nu har jag i alla fall fått till det så att det skrivs ut till användaren när backen är full. Men lägger man i för många kraschar fortfarande programmet..

Du kontrollerar nu om backen är full efter att du redan lagt till flaskorna i den. Om användaren väljer att lägga till fler flaskor än det får plats så kommer programmet fortfarande försöka lägga till dem, och därmed krascha. Din uträkning för hur många platser det finns kvar är också fel, eftersom du tar totalt antal flaskor minus antalet flaskor som precis lagts till. Du vet hur många flaskor som redan finns i backen (flaskor.Length), hur många platser det finns totalt (24) samt hur många du vill lägga till (antal_flaskor). Så innan du försöker lägga till några flaskor i backen, kontrollera (med en if-sats) att antalet flaskor du vill lägga till inte är fler än antalet lediga platser.

Permalänk
Skrivet av e1m1:

switch (Console.ReadLine())
{
...
default:
Console.WriteLine("Felaktig inmatning");
return; // Återvänder till anroparen av funktionen.
break;
}

Felet du får här är att raden "break;" ALDRIG kan nås eftersom raden ovanför alltid kommer bryta exekveringen av funktionen. Errors och warnings är en väldigt bra feature in kompilatorn som hindrar oss från att skriva kod med uppenbara fel, och ge oss anledningen i klartext snarare än att vi får ett program som inte alltid gör vad vi vill och vi inte vet varför.

Allt eftersom du får mer erfarenhet kommer du lära dig mer och mer om varför du får dylika fel och fixa dem snabbt. Jag tycker detta felet är helt uppenbart och känner att detta är något du borde kunna lösa själv, men jag vet också att alla kompileringsfel kändes konstiga och jobbiga när jag precis börjat med programmering

Förstår du inte felen eller hur man ska fixa dem rekommenderar jag vidare att du börjar träna på ett annat sätt att lösa problem. Nämligen Google. Det är mycket snabbare att leta upp lösningen på ens problem genom att leta upp någon annans fråga på ens problem, från något random forum eller på t.ex. stack overflow, än att själv ställa frågan och vänta på svar.

Sök "java unreachable code". Första träffen är:
https://stackoverflow.com/questions/9898549/why-is-this-code-...
vilket är precis samma fel som du har med kod under ett return-statement

Jag har sökt massa på google och försökt allt vad jag kan, jag har suttit på den här sedan i förrigår, förstår inte hur man verkligen fastnar! Jag har i alla fall gjort om lite i koden nu och när det blir felaktig inmatning i switch menyn så skrivs det ut och sedan får man göra ett nytt val, men nu är problemet istället att den inte hoppar ur loopen efter det nya valet och man får lägga till oändligt med drycker.
Om man istället gör ett giltigt val så läggs dryckerna till i vektorn men lägger man i fler än 24 drycker så kraschar programmet. Jag fick tidigare till det så att programmet inte kraschade, om man tex la till 25 drycker när det bara finns plats för 24, så lagrade vektorn bara 24 tal och "slängde" det sista. Jag blev dock av med den koden då jag lyckades spara fel kod när jag gick fram och tillbaka i koden..

public void add_soda() // Lägger till dryck och skriv antal tomma platser //amount_bottles används för att byta ut dryck mot ny dryck { Console.WriteLine("Vilken dryck vill du lägga till i backen?: "); Console.WriteLine("1. Coca Cola"); Console.WriteLine("2. Fanta"); Console.WriteLine("3. Julmust"); Console.WriteLine("4. Lättöl"); Console.WriteLine("5. Ramlösa"); string flaska; bool meny = false; do { switch (Console.ReadLine()) { case "1": flaska = "Coca Cola"; Console.WriteLine("Du valde att lägga till Coca Cola"); break; case "2": flaska = "Fanta"; Console.WriteLine("Du valde att lägga till Fanta"); break; case "3": flaska = "Julmust"; Console.WriteLine("Du valde att lägga till Julmust"); break; case "4": flaska = "Lättöl"; Console.WriteLine("Du valde att lägga till Lättöl"); break; case "5": flaska = "Ramlösa"; Console.WriteLine("Du valde att lägga till Ramlösa"); break; default: flaska = ""; Console.WriteLine("Felaktig inmatning, mata in ett tal mellan 1-5"); meny = true; break; } } while (meny); Console.Write("Hur många {0} vill du lägga till: ", flaska); int antal = int.Parse(Console.ReadLine()); Console.WriteLine("Du valde att lägga till {0} styck {1}", antal, flaska); for (int i = 0; i < antal; i++) //Om i är mi { flaskor[antal_flaskor] = flaska; antal_flaskor++; } Console.WriteLine(flaskor.Length - antal_flaskor + " platser kvar i läskbacken"); while (flaskor.Length < 24) { if (flaskor.Length <= 24) { } else if (flaskor.Length > 24) { Console.WriteLine("Backen är full!"); } } }

Skrivet av perost:

Det beror troligtvis på att du lagt return före utskriften, vilket gör att utskriftskoden aldrig kommer nås eftersom return omedelbart returnerar från funktionen:

... if (something) { return; Console.WriteLine("Något gick fel"); // <= Onåbar kod, a.k.a. död kod, som aldrig någonsin kommer köras p.g.a. return ovan. } Console.WriteLine("Något gick inte fel"); // <= Nåbar kod.

Detta är väl egentligen inget fel utan bara kompilatorn som vill varna dig att du gjort något dumt, men det kan hända att det är inställt att ge kompileringsfel. Notera att även den nåbara koden ovan kan vara onåbar om something t.ex. är en konstant med värde true, så att if-satsen med all säkerhet alltid körs.
Då har du i princip två val: antingen får du lägga switch-satsen i en loop som t.ex. loopar tills flaska inte längre är tom (d.v.s. användaren matade in ett giltigt val), eller så får du returnera t.ex. en bool från funktionen för att signalera om funktionen lyckades eller inte så att anroparen kan anropa funktionen igen om den vill.

Du kontrollerar nu om backen är full efter att du redan lagt till flaskorna i den. Om användaren väljer att lägga till fler flaskor än det får plats så kommer programmet fortfarande försöka lägga till dem, och därmed krascha. Din uträkning för hur många platser det finns kvar är också fel, eftersom du tar totalt antal flaskor minus antalet flaskor som precis lagts till. Du vet hur många flaskor som redan finns i backen (flaskor.Length), hur många platser det finns totalt (24) samt hur många du vill lägga till (antal_flaskor). Så innan du försöker lägga till några flaskor i backen, kontrollera (med en if-sats) att antalet flaskor du vill lägga till inte är fler än antalet lediga platser.

Jag har försökt förstå men jag ska läsa din test några gånger till innan jag ställer fler frågor

Permalänk

@perost
@e1m1

Äntligen!!! Jag la till meny = false; i varje case så om man gör ett felaktigt val hoppar loopen tillbaks tills man gör ett giltigt. Dett andra problemet kvarstår dock..

Permalänk
Medlem
Skrivet av Bananeripyamas:

Äntligen!!! Jag la till meny = false; i varje case så om man gör ett felaktigt val hoppar loopen tillbaks tills man gör ett giltigt. Dett andra problemet kvarstår dock..

Istället för att lägga till det i varje case så kan du också bara sätta meny till false i början av loopen, innan du går in i switch-satsen. Eller så kan du göra som jag skrev tidigare och loopa så länge som flaska är tom. Du kan använda t.ex. String.isNullOrEmpty för att kolla om strängen är null eller "", och då kan du också strunta i flaska = "" eftersom flaska kommer vara null om du inte tilldelar den något värde.

Permalänk

Nu har jag i alla fall fått det att fungera! Tack för all hjälp
Det jag vill göra nu är att jag vill beräkna backens aktuella värde beroende på hur många flaskor som finns i backen. Det ska jag göra i calc_total() metoden men vet ej riktigt hur jag ska göra det. Någon som vill putta mig i rätt riktining?

namespace sodacrate { class Sodacrate { private string[] flaskor = new string[24]; //Vektor med 24 platser //Back private int antal_flaskor = 0; //Håller reda på alla flaskor //Antal fack public int sum = 0; //Håller koll på det totala värdet //Meny public void Run() { int meny = 0; //Gör detta do { Console.WriteLine(""); Console.WriteLine("Välj ett alternativ"); Console.WriteLine("1. Lägg till en dryck"); Console.WriteLine("2. Visa innehåll"); Console.WriteLine("3. Beräkna värde"); Console.WriteLine("4. Avsluta program"); meny = int.Parse(Console.ReadLine()); switch (meny) { case 1: add_soda(); //Lägg till läsk break; case 2: print_crate();//Visa innehåll break; case 3: calc_total(); //Beräkna värde break; case 4: Console.WriteLine("Programmet avslutas!"); // Avsluta program //meny = false; break;????? break; default: Console.WriteLine("Felaktig inmatning"); break; } //Medan detta stämmer } while (meny != 4); } public void add_soda() // Lägger till dryck och skriv antal tomma platser //amount_bottles används för att byta ut dryck mot ny dryck { if (antal_flaskor == 24) { Console.WriteLine("Backen är full, du kan inte lägga till flera flaskor!"); return; } Console.WriteLine("Vilken dryck vill du lägga till i backen?: "); Console.WriteLine("1. Coca Cola 5 kr"); Console.WriteLine("2. Fanta 5 kr"); Console.WriteLine("3. Julmust 5 kr"); Console.WriteLine("4. Lättöl 5 kr"); Console.WriteLine("5. Ramlösa 5 kr"); string flaska; bool meny = false; do { switch (Console.ReadLine()) { case "1": flaska = "Coca Cola"; Console.WriteLine("Du valde att lägga till Coca Cola"); meny = false; break; case "2": flaska = "Fanta"; Console.WriteLine("Du valde att lägga till Fanta"); meny = false; break; case "3": flaska = "Julmust"; Console.WriteLine("Du valde att lägga till Julmust"); meny = false; break; case "4": flaska = "Lättöl"; Console.WriteLine("Du valde att lägga till Lättöl"); meny = false; break; case "5": flaska = "Ramlösa"; Console.WriteLine("Du valde att lägga till Ramlösa"); meny = false; break; default: flaska = ""; Console.WriteLine("Felaktig inmatning, mata in ett tal mellan 1-5"); meny = true; break; } } while (meny); Console.Write("Hur många {0} vill du lägga till: ", flaska); int antal = int.Parse(Console.ReadLine()); //Antal flaskor lagras i variabeln antal if (antal_flaskor + antal < 24) { for (int i = 0; i < antal; i++) //Om i är mindre än antal index (antal flaskor man lägger till) öka med ett för varje varv { flaskor[antal_flaskor] = flaska; //vektor[antal drycker] = lägg till dryckens namn //Flaskans namn läggs till i index antal_flaskor++; //ökar med ett för varje varv } Console.WriteLine("Du valde att lägga till {0} styck {1}", antal, flaska); //Skriver ut vilken dryck sort och antal Console.WriteLine(flaskor.Length - antal_flaskor + " platser kvar i läskbacken"); //Skriver ut platser kvar i backen } else { Console.WriteLine("Det finns inte plats för att lägga till {0} styck {1}, det finns bara {2} platser kvar. Försök igen ", antal, flaska, 24 - antal_flaskor); //Skriver ut vilken dryck sort och antal } } /*Metod för att lägga till en läskflaska Om ni har information om både pris, läsktyp och namn kan det vara läge att presentera en meny här där man kan välja på förutbestämda läskflaskor. Då kan man också rätt enkelt göra ett val för att fylla läskbacken med slumpade flaskor /*Random slump = new Random(); for(int x = 0; x < flaskor.Lenght; x++) { int meny = slump.Next(0,24); flaskor[x] = meny }*/ public void print_crate() //Visa innehåll { foreach (var dryck in flaskor) { if (dryck != null) Console.WriteLine(dryck); else Console.WriteLine("Tom plats"); } } public int calc_total(int tal1, int tal2) //Beräkna backens värde { int summa = tal1 * tal2; return summa; //Tänk på att inte räkna med tomma positioner i vektorn } } class Program { public static void Main(string[] args) { Console.WriteLine("Välkommen till läskbacken!"); //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

@snajk
@gothxx
@PeCe
@Burhan123
@perost
@noyce
@gaminggirl
@e1m1

Skulle uppskattas jääätte jätte mycket ifall någon utav er kunde hjälpa mig! Är så nära nu men ändå inte..

Permalänk
Medlem

@Bananeripyamas: Du har ju redan en utskriftsfunktion som skriver ut flaskorna. Så du behöver bara göra samma sak, fast istället för att skriva ut varje flaska får du addera dess värde till en variabel som du sedan skriver ut i slutet av funktionen. Det som gör det lite klurigt är väl att du bara lagrar flaskorna som strängar utan någon information om deras värde, så du får skriva lite kod som översätter en flaskas namn till ett värde om du vill fortsätta lagra flaskor på det sättet.

Permalänk
Medlem

Vad du vill göra är väl något i stil med en for/foreach/while-loop som summerar alla upptagna platser.

Vet inte riktigt vad du tänker dig att tal1 och tal2 är i din funktion, med tanke på hur den anropas borde där väl inte vara några argument

Initiera summan till 0 istället, loopa igenom vektorn och addera priset för eventuell flaska på varje plats.

public int calc_total(int tal1, int tal2) //Beräkna backens värde
{
int summa = tal1 * tal2;
return summa;
//Tänk på att inte räkna med tomma positioner i vektorn
}

Visa signatur

Redbox: Asrock B650 Lightning ATX, 7800x3D -20CCO, XFX 6950XT, 2x32GB Corsair Vengence 6400 CL32, WD SN770 2TB, Corsair RMe 1000, Lian Li Lancool 216, Peerless Assassin 120 SE
Purpbox: Z87-Pro, I5 4670K@4.2, Sapphire 290 TRI-X, 2x8GB Crucial Tactical@stock, Deep Silence 1
Samsung Evo 250+500GB + QVO 1TB, 2x1TB 7200RPM backup/lagring
Det var bättre förr: E5300 2600MHz -> 3640MHz, Celeron 300A -> 450MHz

Permalänk
Skrivet av Bananeripyamas:

@snajk
@gothxx
@PeCe
@Burhan123
@perost
@noyce
@gaminggirl
@e1m1

Skulle uppskattas jääätte jätte mycket ifall någon utav er kunde hjälpa mig! Är så nära nu men ändå inte..

Om jag minns rätt så kostade samtliga sorters läsk lika mycket? I så fall har du bara ett anrop till din beräkningsfuktion kvar att göra. Hur många flaskor läsk har du och hur mycket kostar en läsk...:

public int calc_total(int tal1, int tal2) //Beräkna backens värde { int summa = tal1 * tal2; return summa; //Tänk på att inte räkna med tomma positioner i vektorn }

Visa signatur

Corsair Vengeance LPX 4x8GB DDR4 2666MHz CL16 | Intel Core i7 6700 3,4 GHz 8MB | MSI Z170A KRAIT GAMING | Corsair Force Series 3 120 GB | Seagate SSHD Desktop 2 TB 7200 RPM 3,5" | Creative Sound Blaster Z PCIe | Western Digital 500 GB | Samsung Writemaster | Corsair TX750 V2 750 W | EVGA GeForce GTX 970 4GB SSC ACX 2.0+| Fractal Design Define R5 (Svart)