C# Slutuppgift Läskbacken public int calc_Total() Hjälp!

Permalänk

C# Slutuppgift Läskbacken public int calc_Total() Hjälp!

Hej! Jag är en nybörjare inom programmering och har nu fastnat och kommer inte vidare med min kod. "Public int calc_Total()" säger "not all code paths return a value" och har sökt på google och förstår varför det kommer upp men inte hur jag ska åtgärda det. Har försökt att lokalisera vart felet ligger men icke. Är det någon som ser vad det är tokigt någonstans?? Det kanske är tokigt på fler ställen?
(Jag har inte kunnat köra mitt program och vet inte hur programmet ser ut eller om något funkar/inte funkar som det ska.)

Här är min kod:

namespace sodacrate { class Sodacrate { private string[] bottles = new string[24]; //Min vektor private int amount_bottles = 0; //Håller reda på antal flaskor private string soda; private int cost = 0; private bool main_Menu = true; public void Run() { Console.WriteLine("Välkommen till min läskbacks-simulator!"); int temp = 0; //int amountOfBottles = 0; eller 24? do { Console.WriteLine("******Var vänligen och välj ett alternativ.*******"); Console.WriteLine(" "); Console.WriteLine(" 1, lägg till dryck: "); Console.WriteLine(" 2, visa innehåll: "); Console.WriteLine(" 3, beräkna den totala summan: "); Console.WriteLine(" 4, eller avsluta programmet: "); Console.WriteLine(" "); Console.WriteLine("**************************************************"); //amountOfBottles = int.Parse(Console.Readline()); switch (temp) //meny { case 1: add_Soda(); break; case 2: print_Crate(); break; case 3: calc_Total(); break; case 4: main_Menu = false; break; default: Console.WriteLine("Fel inmatning! Du måste skriva in en siffra! "); //ska det vara med add_Soda? Kanske inte behövs här?? break; } }while(temp !=0); } public void add_Soda() { int menu = 0; do { Console.WriteLine("******Sortiment:******"); Console.WriteLine(" 1, Loka "); Console.WriteLine(" 2, Julmust "); Console.WriteLine(" 3, Carlsberg "); Console.WriteLine(" 4, Somersby "); Console.WriteLine(" 5, Pepsi "); Console.WriteLine("*********************"); for (int i = 0; i < bottles.Length; i++) { bottles[i] = soda; } switch (menu) { case 1: Console.WriteLine("Loka"); break; case 2: Console.WriteLine("Julmust"); break; case 3: Console.WriteLine("Carlsberg"); break; case 4: Console.WriteLine("Somersby"); break; case 5: Console.WriteLine("Pepsi"); break; default: Console.WriteLine("Fel inmatning! Vänligen välj ett nummer mellan 1 och 5."); break; } for (int i = 0; i < 24; i++) { if (amount_bottles == 24) { Console.WriteLine("Din back är nu full!"); } else { amount_bottles++; break; } } }while(menu !=0); } public void print_Crate() { int count = 0; foreach (string soda in bottles) if (soda != null) count += 1;//rätt ordning?? { Console.WriteLine("Du har {0} flaskor i din back.", bottles.Length); //eller , soda } //Där beskrivs hur man löser det med tomma positioner i vektorn } public int calc_Total()//varför säger den "not all code paths return a value"?? Kan inte hitta varför { for (int i = 0; i < 24; i++) cost = cost + 5; { Console.WriteLine("Den totala kostnaden för din back är {0} kronor.", cost); } //Tänk på att inte räkna med tomma positioner i vektorn } /*public void find_soda() { //Betyg C //Beskrivs i läroboken på sidan 147 och framåt (kodexempel på sidan 149) //Man ska kunna söka efter ett namn //Man kan använda string-metoderna ToLower() eller ToUpper() } public void sort_sodas() { //Betyg A-C //Beskrivs i läroboken på sidan 147 och framåt (kodexempel på sidan 159) //Man ska kunna sortera vektorn med flaskor och med bubble sort //Det är mycket svårt att sortera efter bokstavsordning - är inte flaskorna egna objekt utan bara strängar... //... går det bra att sortera efter längden på namnet istället. }*/ } 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); } } }

Uppskattar all hjälp jag kan få!

Permalänk
Medlem

public int calc_Total()
Deklarationen av funktionen säger den ska returnera ett int-värde men det gör inte din kod.

Visa signatur

Intel Core i7 6700K | Gigabyte Z170X-UD3 | Corsair Vengeance LPX 16GB DDR4 2400Mhz | EVGA GTX 980Ti Hybrid | Samsung 950 PRO 256GB | Noctua NH-D15 | EVGA G2 750 | Fractal Design Define R5

Permalänk
99:e percentilen
Skrivet av BlackCookie:

public int calc_Total()//varför säger den "not all code paths return a value"?? Kan inte hitta varför { for (int i = 0; i < 24; i++) cost = cost + 5; { Console.WriteLine("Den totala kostnaden för din back är {0} kronor.", cost); } //Tänk på att inte räkna med tomma positioner i vektorn }

Det verkar som att calc_Total ska returnera en int, men din implementation gör inte det.

Sedan är koden inuti funktionen konstigt skriven också. Är det verkligen din avsikt att placera Console.WriteLine(...) i ett block, men inte cost = cost + 5;?

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem
Skrivet av Alling:

Det verkar som att calc_Total ska returnera en int, men din implementation gör inte det.

Sedan är koden inuti funktionen konstigt skriven också. Är det verkligen din avsikt att placera Console.WriteLine(...) i ett block, men inte cost = cost + 5;?

Japp den är ju riktigt pajj.
Även add_Soda() verkar helt horribelt trasig

Hmm.
Hajar inte hur det i närheten kan funka?
"temp" i mainloopen i Run() sätts ju aldrig.
Bortkommenterat finns en:
//amountOfBottles = int.Parse(Console.Readline());

Längre ner har vi en default i switch-satsen som säger att det måste vara en siffra. Problemet är ju att int.parsen (om vi utgår från att den är tänkt att sätta "temp" och inte "amountOfBottles") kommer smälla i en exception redan där uppe så den defaulten i switchen är ju meningslös.

Det är så trasig kod att det bästa är att börja om från början.

Permalänk

Ok, så jag måste omvandla svaret till en int? Men man svarar ju bara i siffror, varför funkar det inte då? Omvandlas den till string på vägen?

Min avsikt angående WriteLine och cost = cost + 5 är bara att den ska fungera (tyvärr har jag ju inte kunskapen att avgöra om det ser konstigt ut ) men blir det snyggare om jag byter plats på dom?

Permalänk
Medlem

public int calc_Total()//varför säger den "not all code paths return a value"?? Kan inte hitta varför { for (int i = 0; i < 24; i++) cost = cost + 5; { Console.WriteLine("Den totala kostnaden för din back är {0} kronor.", cost); } //Tänk på att inte räkna med tomma positioner i vektorn }

Den här funktionen returnerar inget värde alls.
Ändra till public void calc_Total, eller returnera ett int-värde

Visa signatur

Intel Core i7 6700K | Gigabyte Z170X-UD3 | Corsair Vengeance LPX 16GB DDR4 2400Mhz | EVGA GTX 980Ti Hybrid | Samsung 950 PRO 256GB | Noctua NH-D15 | EVGA G2 750 | Fractal Design Define R5

Permalänk

Nu visar den inget felmeddelande men när jag ska skriva in vilka drickor jag vill ha i min back blir det fel. Jag har satt dit en "menu = int.Parse(Console.ReadLine());" men den säger att det jag skriver in är för mycket och att den inte klarar det?

Jag håller på att skriva en ny kod, men jag vill inte göra samma fel på min nya som jag har gjort på denna

Permalänk

C# Menyer HJÄLP!

Hej! Jag är en nybörjare inom programmering men jag har nu fastnat rejält med min slutuppgift. Vi ska göra en läskbacks-simulator med hjälp av flera olika menyer. I min andra meny (man ska kunna välja vilka flaskor man vill ha i sin back) går det inte att skriva in vad man vill ha, utan den säger att "indatasträngen har ett felaktigt format" och jag har provat flera olika koder men inga funkar. Sedan om jag skriver ut mer än 24 flaskor skriver den "Din back är full" ca.24 gånger i rad?

Uppgiften:
Under metoden Run() ska alltså kod skrivas som skriver ut text som välkomnar användaren och därefter får en lista över vilka saker man kan göra. Detta val bör ju läggas i en loop så inte programmet stänger ner efter att man valt något. Man ska inte kunna stoppa in fler än 25 drycker i backen, eventuellt kan man få välja att ersätta en flaska i en full back med en annan. Här används då med fördel variabeln amount_bottles (se figuren) som kan hålla reda på antal flaskor. Är backen full ska man få meddelande om detta och då får man välja en position och den gamla läsken försvinner. För uträkning av det totala värdet så utgår vi ifrån att varje flaska kostar 5 kronor.

Min kod:

namespace sodacrate { class Sodacrate { private string[] bottles = new string[24]; //vektor private int amountOfBottles = 0; //antal flaskor private int cost = 0; //kostnad public void Run() { int temp = 0; do { Console.WriteLine("Välkommen till min läskbacks-simulator!"); Console.WriteLine(""); Console.WriteLine("******Var vänligen och välj ett alternativ******"); Console.WriteLine(""); Console.WriteLine(" 1, lägg till dryck:"); //problem Console.WriteLine(" 2, visa ditt innehåll:"); Console.WriteLine(" 3, beräkna den totala summan:"); Console.WriteLine(" 4, eller avsluta programmet:"); //funkar! Console.WriteLine(""); Console.WriteLine("************************************************"); temp = int.Parse(Console.ReadLine()); switch (temp) { case 1: add_Soda(); break; case 2: print_Crate(); break; case 3: calc_Total(); break; case 4: temp = 0; Console.WriteLine("Avslutar programmet!"); break; } } while (temp != 0); } public void add_Soda() { //string soda; funkar inte //int number; funkar inte //string input = Console.ReadLine(); funkar inte //int input; funkar inte int menu = 0; do //(int.TryParse(input, out number)) funkar inte { Console.WriteLine("******Vårt sortiment******"); Console.WriteLine(""); Console.WriteLine(" 1, Loka"); Console.WriteLine(" 2, Julmust"); Console.WriteLine(" 3, Carlsberg"); Console.WriteLine(" 4, Somersby"); Console.WriteLine(" 5, Pepsi"); Console.WriteLine(""); Console.WriteLine("**************************"); //input = Convert.ToInt32(Console.ReadLine()); funkar inte /*soda = Console.ReadLine(); menu = int.Parse(soda);*/ //Indatasträngen hade ett felaktigt format. //menu = int.Parse(Console.ReadLine()); //Indatasträngen hade ett felaktigt format. switch (menu) { case 1: Console.WriteLine("Loka"); break; case 2: Console.WriteLine("Julmust"); break; case 3: Console.WriteLine("Carlsberg"); break; case 4: Console.WriteLine("Somersby"); break; case 5: Console.WriteLine("Pepsi"); break; default: Console.WriteLine("Fel inmatning! Du måste skriva in en siffra mellan 1 och 5!"); //funkar! break; } for (int i = 0; i < 24; i++) { if (amountOfBottles == 24) { Console.WriteLine("Din back är full!"); //skrivs ut 24 gånger, varför?? } else { amountOfBottles++; break; } } } while (menu != 0); } public void print_Crate() // har skrivit kod { } public void calc_Total() // har skrivit kod { } /*public void find_soda() { //Betyg C //Beskrivs i läroboken på sidan 147 och framåt (kodexempel på sidan 149) //Man ska kunna söka efter ett namn //Man kan använda string-metoderna ToLower() eller ToUpper() } public void sort_sodas() { //Betyg A-C //Beskrivs i läroboken på sidan 147 och framåt (kodexempel på sidan 159) //Man ska kunna sortera vektorn med flaskor och med bubble sort //Det är mycket svårt att sortera efter bokstavsordning - är inte flaskorna egna objekt utan bara strängar... //... går det bra att sortera efter längden på namnet istället. }*/ } 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); } } }

Uppskattar alla svar och all hjälp!

Permalänk
Medlem

Oavsett vilket val du väljer i din add_soda funktion så kommer du att köra en loop som plussar på amount of bottles 24 gånger. Så nästa gång du kör add_soda (Eller i nästa iteration av do-while loopen) så kommer din amount of bottles vara 24 och således kommer du köra loopen och skriva ut att backen är full 24 gånger.

Ang din andra fråga ser jag inga direkta konstigheter, kan såklart missa något. Men i övrigt ser jag ingen anledning för dig att parsa indatan till en int. Du skulle lika gärna kunna köra din switch på en sträng. case "5":

Edit: Glöm det jag skrev i början, missade din "break" i for-loopen, däremot kommer du efter att ha lagt till 24 flaskor aldrig att köra din break och därför skriv det ut 24 gånger att backen är full.

Skickades från m.sweclockers.com

Permalänk
Avstängd

Det är inte så mycket rätt i din kod tyvärr. Du måste tänka på vad du frågar efter från användaren, hur du tar in svaret och vart du sparar det, sen hur du använder det förstås.

Din kod i Run-metoden borde funka även om den inte är så värst logisk, problemen ligger i metoderna den anropar. I add_Soda tar du exempelvis aldrig användarens svar på vilken läsk den vill lägga till och även om du hade tagit in svaret så lägger du ju aldrig till någon läsk utan skriver bara ut vad användaren har valt. Din for-loop ser ut som ett försök att räkna upp antalet flaskor men du kan inte använda en for-loop på det sättet (som du har märkt) och det räcker förstås inte att bara öka räknaren för att lägga till en läsk utan du måste ju också lägga till den i arrayen.

Permalänk

Hur tar jag upp användarens input? Jag har provat flera olika lösningar men icke.

Ok, så jag måste flytta på for-loopen inuti do-loopen för att den ska fungera?

Permalänk
Avstängd
Skrivet av BlackCookie:

Hur tar jag upp användarens input? Jag har provat flera olika lösningar men icke.

Ok, så jag måste flytta på for-loopen inuti do-loopen för att den ska fungera?

Typ:

private static void addSoda() { Console.WriteLine("Välj läsk att lägga till:"); Console.WriteLine("1 - Cola, 2 - Pepsi, 3 - Sprite"); var selected = Console.ReadLine(); if(bottleAmount == 24) { Console.WriteLine("Backen är full..."); return; } switch(selected) { case "1": bottles[bottleAmount] = "Cola"; bottleAmount++; Console.WriteLine("Du har lagt till en Cola, du har nu {0} flaskor i backen", bottleAmount); break; case "2": bottles[bottleAmount] = "Pepsi"; bottleAmount++; Console.WriteLine("Du har lagt till en Pepsi, du har nu {0} flaskor i backen", bottleAmount); break; case "3": bottles[bottleAmount] = "Sprite"; bottleAmount++; Console.WriteLine("Du har lagt till en Sprite, du har nu {0} flaskor i backen", bottleAmount); break; default: Console.WriteLine("Felaktigt val"); break; } return; }

Permalänk

@snajk: Tack! Ser hur du menar. Har försökt att göra en en liknande men när jag skriver in att jag vill ha tex. Pepsi i min back, tar den bara in den första flaskan och går sedan direkt till huvudmenyn?

Permalänk
Avstängd
Skrivet av BlackCookie:

@snajk: Tack! Ser hur du menar. Har försökt att göra en en liknande men när jag skriver in att jag vill ha tex. Pepsi i min back, tar den bara in den första flaskan och går sedan direkt till huvudmenyn?

Jo. Det beror ju på hur man vill ha det, du kan ju återgå till menyn i add-metoden istället för till huvudmenyn om du vill, eller fråga hur många man vill lägga till när man har valt typ. Vill du gå tillbaka till undermenyn får du lägga metoden i en loop av något slag. Det beror ju på hur uppgiften är formulerad.

Permalänk
Medlem

Några saker:

Testade ditt program och om jag lägger tillbaka soda och menu som du kommenterat ut så fungerar det och jag får inga fel ang indatastränge har felaktigt format.
Så den biten tycker jag ser rätt ut.

När du lägger till en flaska till backen så vill du direkt plussa på bottleAmount liknande hur Snajk har skrivit och även innan du lägger till något kolla om backen är full eller inte.

Anledningen till att den skrev Din back är full 24 gånger är för att du räknar upp amountOfBottle i en loop och använder en global variabel som du aldrig nollställer.
Och när du når upp till 24 så skriver du ut att backen är full och breakar inte ut från loopen som du gör när du lägger till en ny flaska.

Se över dina loopar, du vill i princip köra din loop såhär
loop{
hämta input
hantera input
Om användare vill lägga till något kör nästa loop med liknande struktur
Vill Användaren avsluta/eller backa till föregående steg? break;
}
Så i add soda vill du nog ha ett alternativ 6 "Gå tillbaka" eller liknande.

En väldigt bra sak att göra när du får fel är att debugga och följa med koden för att se vad och var det blir fel

Visa signatur

Fractal Design Node 304 -> ASUS ROG STRIX Z370-I GAMING ->i5 8600K -> be quiet! Pure Rock -> MSI GeForce RTX 4070 VENTUS 2X E 12G OC -> Corsair Vengeance LPX 3200 32GB -> Seasonic FOCUS Plus 650W Gold -> Samsung 960 EVO 500GB -> 2 * Western Digital Black 2 TB -> Samsung 850 EVO Basic SSD 500GB

Permalänk
Medlem

om du i metoden sagt att svaret ska vara en int vilket du gjort när du skriver typ
public int DoSomething()
så måste du ha en
return din int.
Ska du inte returnera något från metoden så ska int vara void.

I det här fallet bör ju dock metoden returnera antalet flaskor i backen.

Visa signatur

Fractal Design Node 304 -> ASUS ROG STRIX Z370-I GAMING ->i5 8600K -> be quiet! Pure Rock -> MSI GeForce RTX 4070 VENTUS 2X E 12G OC -> Corsair Vengeance LPX 3200 32GB -> Seasonic FOCUS Plus 650W Gold -> Samsung 960 EVO 500GB -> 2 * Western Digital Black 2 TB -> Samsung 850 EVO Basic SSD 500GB

Permalänk

@snajk: Uppgiften är lite luddigt (tycker jag) men jag antar att man ska kunna välja 24 drickor och sedan kommer man till huvudmenyn så man kan välja ett annat alternativ, ex. kolla kostnaden för allt. Jag tyder uppgiften att man alltid ska komma tillbaka till huvudmenyn tills man väljer att avsluta programmet.

Permalänk
Hedersmedlem

@BlackCookie *Trådar sammanfogade i enlighet med §3.3 i forumreglerna*

Observera att vi inte tillåter korspostning (flera trådar om samma ämne). Detta då vi tycker det är viktigt att alla får samma chans att få sina trådar uppmärksammade.

Visa signatur

Danskjävel så krattar som en skrivare...

Permalänk

Lånar tråden lite...

Hejsan alla.

Nu sitter även jag med projekt Läskbacken i C# programmering och jag tycker mig ha lyckats ganska bra.
Jag har variablerna i klassen soda och sodacrate satta som privata och verkar ha lyckats skapa mig en konstruktor som lagrar sju olika sorters dryckesflaskor i en array klallad my_crate.

Dock har jag problem med metoder för att sortera objekten utifrån variabler i min array då dessa är satta som private.
Kan inte ens köra en bubblesort som är ett av kraven i uppgiften.
Dock har jag metoder för att returnera namn, pris och typ som verkar funka iom att jag kan söka på just namn.
Dessa returneras med return name; osv – dock inte value.

Jag har också lite problem med case sensitivity vad gäller namnsök i min array.
Söker jag Fanta så får jag mycket riktigt upp positionerna där drycken Fanta finns lagrad osv, men söker jag fanta så hittas inga objekt.
Kan man på något vis söka efter bara en del av en string bland objekten i min array?
Dvs om jag söker fan, f, Fant, Fa, fa, fanta, FANTA så returneras rätt objekt på samma vis som om jag söker med korrekt namn (Fanta, Coca~Cola, osv?)

Jag vet inte om jag borde redogöra någon kod här, för jag själv gillar inte att hitta kod online som jag kan klippa och klistra från.

Men kan någon av er vänliga själar ge mig en liten knuff i rätt riktning för att kunna veta vad jag ska läsa på mer om vad gäller:
- Sortering av objekt utifrån olika variabler (namn, pris, typ) i array:en.
- Sökning i array. (söka på namn, pris, typ) utan case sensitivity.
-
Jag vet och förstår att allt skulle vara så mycket, mycket enklare och bättre med <list>, men vi får inte använda oss utav dessa i uppgiften utan måste använda oss av arrays.

Jag har också försökt med Array.Sort() enligt MSDN, förstod dock inte mycket av vad jag gjorde utan jag testade att skriva av direkt från exemplet på deras sida för metoden Array.Sort() för att se om detta kunde få mig på rätt väg. Men inte detta funkade heller.
Är det Array.Sort() jag måste använda? Eller finns det någon annan metod för att åstadkomma det jag är ute efter, lämpat för en nybörjare?

Tack på förhand

Mvh Jonny

Permalänk
Medlem
Skrivet av jonnywestin:

- Sortering av objekt utifrån olika variabler (namn, pris, typ) i array:en.

Jag förstår inte riktigt problemet här, ett kodexempel vore nog bra.

Skrivet av jonnywestin:

- Sökning i array. (söka på namn, pris, typ) utan case sensitivity.

Detta finns det däremot många lösningar på. Det enklaste är nog att bara använda String.Compare-varianten som tar två strängar och en bool, där bool:en bestämmer om case ska ignoreras eller inte i jämförelsen. Notera att Compare returnerar 0 om strängarna är ekvivalenta, annars ett nummer som är större eller mindre än 0 beroende på vilken av strängarna som är "störst".

Permalänk

@perost:
Som jag har min metod för sökning nu:

public void find_soda() { Console.WriteLine("Vilken dryck söker du?"); string search = Console.ReadLine(); for (int i = 0; i < numberOfBottles; i++) { if (search == my_crate[i].getName()) { Console.WriteLine("Din dryck finns på plats " + i); } } }

men här söker jag ju bara efter exakta namn.
Ska kolla upp String.Compare() tack för det

Edit: Jag kom ifrån case-sesitivity med att använda .ToLower() så nu kan jag iaf söka efter Fanta, FANTA eller fanta för att hitta just 'Fanta'

Permalänk

@perost:
För sorteringen har jag försökt:

public void bubbleSort() { int max = my_crate.Length; for (int i = 0; i < max; i++) { int nrLeft = max - i; for (int j = 0; j < nrLeft; j++) { var soda1 = my_crate[j].sodaName; var soda2 = my_crate[j + 1].sodaName; if ((soda1 == null) || (soda2 == null)) { continue; } if (soda1.CompareTo(soda2) == 1) { var temp = soda1; soda1 = soda2; soda2 = temp; } } } for (int i = 0; i < my_crate.Length; i++) Console.Write(my_crate[i] + " "); Console.ReadKey(); }

men då drabbas jag av Stack overflow in unmanaged: IP: 0xa76a1f53, fault addr: 0xbf7d56cc

och jag försökte i en annan metod med

public void sortName() { Array.Sort(my_crate); return; }

men då får jag Failed to compare two elements in the array.
Antar att jag inte implementerat IComparable på rätt sätt.

Permalänk
Medlem

@jonnywestin: Du försöker komma åt ett element utanför arrayen, se mina kommentarer i koden:

public void bubbleSort() { int max = my_crate.Length; for (int i = 0; i < max; i++) { // När i == 0 så blir nrLeft == max - 0, d.v.s. my_crate.Length. int nrLeft = max - i; // j kan här som mest bli nrLeft - 1, d.v.s. my_create.Length - 1 när i == 0. for (int j = 0; j < nrLeft; j++) { var soda1 = my_crate[j].sodaName; // Här försöker du komma åt elementet j + 1, som i sista // iterationen av den inre loopen blir my_create.Length. // Sista elementet i arrayen har dock indexet my_create.Length - 1, // eftersom C# börjar indexera från 0. var soda2 = my_crate[j + 1].sodaName; ...

När i == 0 och j == nrLeft - 1 så kommer din kod alltså försöka komma åt elementet efter sista elementet i my_create, vilket troligtvis är orsaken till felet du får.

Permalänk

@perost: Kanon.
Ska genast sätta mig och skriva om mitt försök till bubblesort.
Tusen tack.