Permalänk
Medlem
Skrivet av edv:

Nu ändrade jag koden lite till:

for( var i = 0; i < drycker.Length; i++) { if (drycker[i].namn == null) { Console.WriteLine(" "); Console.WriteLine("Det finns ingen" + key + "i backen"); Console.WriteLine(" "); } else if (drycker[i].namn == key) { Console.WriteLine(" "); Console.WriteLine("Drycken finns i fack " + i + " " + "i backen."); Console.WriteLine(""); break; } }

Nu kraschar programmet inte, utan den återgår till huvudmenyn efter att ha visat en drycks plats i backen.
Problemet är dock att den endast visar den första platsen som t.ex. Loka har i backen fastän den finns på flera platser i backen..

Som sagt, antal_flaskor är det du ska kolla, typ såhär.

public void find_soda() { Console.WriteLine(""); Console.WriteLine("Skriv namnet på en dricka för att kolla ifall det finns i backen:"); Console.WriteLine(""); string key; int searchHits = 0; while (true) { try { key = Console.ReadLine(); break; } catch (FormatException) { Console.WriteLine("Du får skriva in ett giltigt dryckesnamn istället1"); } catch (NullReferenceException) { Console.WriteLine(""); } } for (var i = 0; i < antal_flaskor; i++) { if (drycker[i].namn == key) { searchHits++; Console.WriteLine(" "); Console.WriteLine("Drycken finns i fack " + i + " " + "i backen."); Console.WriteLine(""); //Position i har en dryck med strängen key } } if(searchHits == 0) { Console.WriteLine("Ingan dryck med det namnet kunde hittas. Tryck på valfri tangent för att återgå till menyn."); } else { Console.WriteLine(searchHits + " drycker hittades. Tryck på valfri tangent för att återgå till menyn."); } Console.ReadKey(); }

Permalänk
Medlem

Tack för all hjälp igen :-D!

Nu har jag ännu fler funderingar...:

Jag håller på med nästa metod, nämligen sort_soda(),
där ska man sortera mha av bubblesort.

Koden ser ut så här nu:

public void sort_soda() { int max= drycker.Length -1; for (int i = 0; i < max; i++) { int nrLeft = max - i; for (int j = 0; j < nrLeft; j++) { if (drycker[j] > drycker[j+1]) { Dryck temp = drycker[j]; drycker[j] = drycker[j+1]; drycker[j+1] = temp; } } } for(int i = 0; i < drycker.Length; i++) Console.WriteLine(drycker[i]); }

Men följande felmeddelande dyker upp:
Det går inte att använda operatorn > i operander av typen Sodacrate.Sodacrate.Dryck och Sodacrate.Sodacrate.Dryck (CS0019) -
Hur kan jag få en fungerande sortering i metoden?

Permalänk
Medlem

Klassen Dryck implementerar inte < och >. Vad vill du sortera efter? Namn?

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av WreXlaM:

Klassen Dryck implementerar inte < och >. Vad vill du sortera efter? Namn?

Skickades från m.sweclockers.com

Jajamän först namn och möjligtvis en annan sortering för pris, men först och främst namn sorterat på antal bokstäver...

Permalänk
Medlem
Skrivet av edv:

Jajamän först namn och möjligtvis en annan sortering för pris, men först och främst namn sorterat på antal bokstäver...

Antal bokstäver? Det är väl inget problem egentligen, men vanligtvis brukar man sortera namn lexikografiskt (d.v.s. strängar som börjar på a är före de som börjar på b, o.s.v.). För lexikografisk sortering kan du används String.Compare. Compare returnerar ett tal som är mindre än 0 om sträng 1 är "mindre" än sträng 2, 0 om de är lika, och ett tal som är större än 0 om sträng 1 är "större" än sträng 2.

Men vill du verkligen sortera dem efter längd så är det bara att använda String.Length istället, d.v.s. använd t.ex. drycker[j].namn.Length i jämförelsen.

Permalänk
Medlem
Skrivet av perost:

Antal bokstäver? Det är väl inget problem egentligen, men vanligtvis brukar man sortera namn lexikografiskt (d.v.s. strängar som börjar på a är före de som börjar på b, o.s.v.). För lexikografisk sortering kan du används String.Compare. Compare returnerar ett tal som är mindre än 0 om sträng 1 är "mindre" än sträng 2, 0 om de är lika, och ett tal som är större än 0 om sträng 1 är "större" än sträng 2.

Men vill du verkligen sortera dem efter längd så är det bara att använda String.Length istället, d.v.s. använd t.ex. drycker[j].namn.Length i jämförelsen.

okej tack men hur kan jag jämföra dom om operatorn Dryck inte acceptera < ?

Permalänk
Medlem
Skrivet av edv:

okej tack men hur kan jag jämföra dom om operatorn Dryck inte acceptera < ?

Eftersom du inte deklarerat någon egen <-operator för Dryck så kan inte kompilatorn veta vad det är du faktiskt vill jämföra. Det går att överlagra operatorer som < för sina klasser, men jag utgår ifrån att ni inte gått igenom det än.

Men i det här fallet är det ju inte dryckerna i sig du faktiskt vill jämföra, utan deras namn och eventuellt pris. D.v.s. det är inte drycker[j] du vill jämföra mot, utan drycker[j].namn (vilket du kan göra med t.ex. Compare-operator jag länkade till).

Permalänk
Medlem

@edv: Nu ska jag inte vara sån men du kanske ska gå tillbaka lite i din kurslitteratur och repetera och försöka förstå vad som du har gjort där och varför? För du verkar inte ha speciellt bra förståelse för vad du håller på med nu. Förstår att det inte är lätt men känns som att du har skyndat på och inte riktigt försökt sätta dig in i hur, var och varför du ska göra olika saker utan ditt mål har bara varit att bli klar/komma så fort fram som möjligt. Så mitt råd är att du tar och går tillbaka lite och repeterar så kommer du troligen inte råka ut för sådana här "relativt" simpla "problem".

Permalänk
Medlem
Skrivet av perost:

Eftersom du inte deklarerat någon egen <-operator för Dryck så kan inte kompilatorn veta vad det är du faktiskt vill jämföra. Det går att överlagra operatorer som < för sina klasser, men jag utgår ifrån att ni inte gått igenom det än.

Men i det här fallet är det ju inte dryckerna i sig du faktiskt vill jämföra, utan deras namn och eventuellt pris. D.v.s. det är inte drycker[j] du vill jämföra mot, utan drycker[j].namn (vilket du kan göra med t.ex. Compare-operator jag länkade till).

Var det typ något sådant du menade? För jag får felmeddelandet : Objektreferensen har inte angetts till en instans av ett objekt.:
if (drycker[j].namn.Length > drycker[j+1].namn.Length)

public void sort_soda() { int max= drycker.Length -1; for (int i = 0; i < max; i++) { int nrLeft = max - i; for (int j = 0; j < nrLeft; j++) { if (drycker[j].namn.Length > drycker[j+1].namn.Length) { Dryck temp = drycker[j]; drycker[j] = drycker[j+1]; drycker[j+1] = temp; } } } for(int i = 0; i < drycker.Length; i++) Console.WriteLine(drycker[i]); }

Jag har försökt att lägga till i Class Dryck, men det hjälper tydligen ingenting:

public string get_namn()//metod för att komma åt variabeln namn { return namn; }

Permalänk
Medlem
Skrivet av edv:

Var det typ något sådant du menade? För jag får felmeddelandet : Objektreferensen har inte angetts till en instans av ett objekt.:

Ah, du gör samma fel som du gjorde i find_soda, d.v.s. du försöker sortera hela vektorn och inte bara den del som faktiskt innehåller drycker. De element i vektorn som inte tilldelats något värde ännu kommer innehålla null istället för en Dryck-instans, därav felmeddelandet. Lösningen är samma som tidigare, använd antal_flaskor istället för drycker.Length.

Permalänk
Medlem

Problemet med hela upplägget här är att du har en fast storlek på arrayen, men fyller den inte, utan ibland är det 2 element, ibland 10, ibland 15 osv. Så du kan inte köra loopar mot storleken på arrayen(om man inte vill krångla till det). Det är just därför du har en antal_flaskor som håller reda på storleken, och är vad man kör i looparna för att få ut det som inte är tomt.

for(int i = 0; i < drycker.Length; i++) Console.WriteLine(drycker[i]);

Detta, som kommer krasha ditt program, eftersom du inte kollar efter null, kan du ersätta med print_crate(); som gör du redan har för att printa ut backen.

Permalänk
Medlem
Skrivet av perost:

Ah, du gör samma fel som du gjorde i find_soda, d.v.s. du försöker sortera hela vektorn och inte bara den del som faktiskt innehåller drycker. De element i vektorn som inte tilldelats något värde ännu kommer innehålla null istället för en Dryck-instans, därav felmeddelandet. Lösningen är samma som tidigare, använd antal_flaskor istället för drycker.Length.

Hej,

Tack nu funkar det, ska bara utveckla koden lite ytterligare nu!

Permalänk
Medlem

Har försökt att få ordning på detta projektet i någon dag nu men jag förstår mig inte riktigt på det hela och när jag försöker lägga till en dryck så sparas den inte i vektorn.
Är även något fel med min calc.

using System; using System.Dynamic; using System.Security.Cryptography.X509Certificates; namespace sodacrate { class Sodacrate { public string[] crate = new string[24]; public int numberOfBootles = 0; public string soda; public int summa = 0; public void Run() { Console.WriteLine("Welcome to the awesome Sodacrate - Simulator"); int temp = 0; do { Console.WriteLine("Chose an option:"); Console.WriteLine("1 Add a soda to the crate"); Console.WriteLine("2 show the content of the crate"); Console.WriteLine("3 calculate the price of the soda's"); Console.WriteLine("0 quit the program"); temp = int.Parse(Console.ReadLine()); switch (temp) { case 1: add_soda(); break; case 2: print_crate(); break; case 3: calc_total(); break; case 0: Console.WriteLine("Closing program"); break; default: Console.WriteLine("only use number 0-3"); break; } } while (temp != 0); } public void add_soda() { Console.WriteLine("Choose drink to add"); Console.WriteLine("1 - Pepsi, 2 - Cola, 3 - Hallonsoda, 4 - Päronsoda, 5 Ramlösa"); var selected = Console.ReadLine(); if(numberOfBootles == 24) { Console.WriteLine("The crate is full"); return; } switch (selected) { case "1": crate[numberOfBootles] ="Pepsi"; numberOfBootles++; Console.WriteLine("You have added a Pepsi"); break; case "2": crate[numberOfBootles] = "Cola"; numberOfBootles++; Console.WriteLine("You have added a Cola"); break; case "3": crate[numberOfBootles] = "Hallonsoda"; numberOfBootles++; Console.WriteLine("You have added a Hallonsoda"); break; case "4": crate[numberOfBootles] = "Päronsoda"; numberOfBootles++; Console.WriteLine("You have added a Päronsoda"); break; case "5": crate[numberOfBootles] = "Ramlösa"; numberOfBootles++; Console.WriteLine("You have added a Ramlösa"); break; default: Console.WriteLine("You have made a wrong choise"); break; } return; { } { } } public void calc_total() { for (int i = 0; i < crate.Length; i++) summa = summa + 5; { Console.WriteLine("The price of the crate is" + summa + "Swedish crowns"); Console.ReadKey(); } } public void print_crate() { foreach (string soda in crate) { Console.WriteLine("You have {0} soda in your crate"); } } } public class Program { public static void Main(string[] args) { var sodacrate = new Sodacrate(); sodacrate.Run(); Console.WriteLine("Press any key to continue...."); Console.ReadKey(true); }

Permalänk
Medlem

@wilund91

Drycker sparas i vektorn, problemet är att du inte skriver ut dem korrekt.

I print_crate() har du missat att lägga till variablen som skall skrivas ut, till WriteLine.

Problemet med calc_total() är samma som i print_crate, bara att du använder olika sätt att loopa igenom dem.
Eftersom det är en array, så är alltid längden 24. Så både foreach och en vanligt for-loop med en kontroll mot längden av arrayed är densamma. Det är här du vill använda numberOfBootles(bottles*). Detta medför att i din nuvarande implementation att det alltid räknas som att det är 24st drycker tillagda, vilket gör att kostnaden blir konstant och du alltid printar ut "You have {0} soda in your crate" 24 gånger.

Permalänk
Medlem
Skrivet av wilund91:

Har försökt att få ordning på detta projektet i någon dag nu men jag förstår mig inte riktigt på det hela och när jag försöker lägga till en dryck så sparas den inte i vektorn.
Är även något fel med min calc.

using System; using System.Dynamic; using System.Security.Cryptography.X509Certificates; namespace sodacrate { class Sodacrate { public string[] crate = new string[24]; public int numberOfBootles = 0; public string soda; public int summa = 0; public void Run() { Console.WriteLine("Welcome to the awesome Sodacrate - Simulator"); int temp = 0; do { Console.WriteLine("Chose an option:"); Console.WriteLine("1 Add a soda to the crate"); Console.WriteLine("2 show the content of the crate"); Console.WriteLine("3 calculate the price of the soda's"); Console.WriteLine("0 quit the program"); temp = int.Parse(Console.ReadLine()); switch (temp) { case 1: add_soda(); break; case 2: print_crate(); break; case 3: calc_total(); break; case 0: Console.WriteLine("Closing program"); break; default: Console.WriteLine("only use number 0-3"); break; } } while (temp != 0); } public void add_soda() { Console.WriteLine("Choose drink to add"); Console.WriteLine("1 - Pepsi, 2 - Cola, 3 - Hallonsoda, 4 - Päronsoda, 5 Ramlösa"); var selected = Console.ReadLine(); if(numberOfBootles == 24) { Console.WriteLine("The crate is full"); return; } switch (selected) { case "1": crate[numberOfBootles] ="Pepsi"; numberOfBootles++; Console.WriteLine("You have added a Pepsi"); break; case "2": crate[numberOfBootles] = "Cola"; numberOfBootles++; Console.WriteLine("You have added a Cola"); break; case "3": crate[numberOfBootles] = "Hallonsoda"; numberOfBootles++; Console.WriteLine("You have added a Hallonsoda"); break; case "4": crate[numberOfBootles] = "Päronsoda"; numberOfBootles++; Console.WriteLine("You have added a Päronsoda"); break; case "5": crate[numberOfBootles] = "Ramlösa"; numberOfBootles++; Console.WriteLine("You have added a Ramlösa"); break; default: Console.WriteLine("You have made a wrong choise"); break; } return; { } { } } public void calc_total() { for (int i = 0; i < crate.Length; i++) summa = summa + 5; { Console.WriteLine("The price of the crate is" + summa + "Swedish crowns"); Console.ReadKey(); } } public void print_crate() { foreach (string soda in crate) { Console.WriteLine("You have {0} soda in your crate"); } } } public class Program { public static void Main(string[] args) { var sodacrate = new Sodacrate(); sodacrate.Run(); Console.WriteLine("Press any key to continue...."); Console.ReadKey(true); }

Varför bumpa en 2 år gammal tråd istället för att starta en ny? Även om det i grunden är samma uppgift så har ni inte samma problem.

Du skulle få bättre hjälp om du beskriver vart du fastnar och vilket krav du försöker lösa. Att skriva att du försökt några dagar och "att något är fel" sen bara pasta in en hög med kod känns inte så genomtänkt. Är lite som finn fem fel för den som hjälpa dig, speciellt om man inte orkar leta runt i tråden vart själva kraven finns.