Forumdelen sponsras av

Trädvy Permalänk
Medlem
Registrerad
Jun 2018

Sodacrate programmering 1 c#

Hej!

Jag håller (som säkert många andra) på med projektet Sodacrate/Läskbacken för kursen Programmering 1 med c#.

Jag har jobbat flera dagar med att komma till underfund med detta projekt, men jag har fastnat totalt...
Programmering är något helt nytt för mig och för mindre än 2 månader sedan hade jag aldrig ens hört talas om C# mm :-P...

Hoppas att någon kan hjälpa mig..

Projektet är som följande:
https://novo.hermods.se/pluginfile.php/292026/question/questi...

Jag har hunnit skrivit en del kod, och har även googlat en hel del hur jag skulle kunna lösa mina frågetecken...

Först och främst undrar jag :

* Hur kan jag lagra de valda dryckerna i metoden add_soda()?
* Varför körs valmenyn om igen istället för att metoden calc_total() körs när man valt "3" i menyn i metoden Run()?

Min kod ser ut så här än så länge:

namespace Sodacrate { class Program { public static void Main(string[] args) { Sodacrate backen = new Sodacrate();//Skapar ett objekt av klassen Sodacrate som heter backen backen.Run();//Anroper metoden Run backen.add_soda();//Anropar metoden add_soda backen.print_crate();//Anropar metoden print_crate Console.WriteLine("Det totala värdet av dryckerna i backen är {0} kronor", backen.calc_pris()); Console.Write("Tryck på valfri tangent för att avsluta. . . "); Console.ReadKey(true); } } class Sodacrate { Dryck[]drycker;//förbereder c# att vi ska skapa en vektor av typen Dryck private int antal_flaskor = 0; //Håller reda på alla flaskor //Antal fack public Sodacrate()//Konstruktor { drycker=new Dryck[24];//Här skapas vektorn med antal positioner drycker[0]= new Dryck("CocaCola", 15 , "läsk"); drycker[1]= new Dryck("Redbull", 25, "Energidryck"); drycker[2]= new Dryck("SevenUp", 15 , "läsk"); drycker[3]= new Dryck("Loka" , 14, "kolsyratvatten"); drycker[4]= new Dryck("Ramlösa", 14, "kolsyratvatten"); drycker[5]= new Dryck("Redbull", 25, "Energidryck"); drycker[6]= new Dryck("CocaCola", 15 , "läsk"); drycker[7]= new Dryck("SevenUp", 15 , "läsk"); drycker[8]= new Dryck("Loka" , 14, "kolsyratvatten"); drycker[9]= new Dryck("Ramlösa", 14, "kolsyratvatten"); } public void Run()//Metoden där menyn finns med olika möjligheter i programmet { int tal=0; do { Console.WriteLine("Hej och välkommen, här finns olika möjligheter för dryckesbacken!"); Console.WriteLine(" "); //Nedanför finns valmenyn som är kopplat till switch-satsen. Console.WriteLine("1 Placera drycker i dryckesbacken"); Console.WriteLine("2 Titta vad som finns i backen"); Console.WriteLine("3 Beräkna det totala värdet av innehållet i backen"); Console.WriteLine("4 Sök en viss dryck i backen"); Console.WriteLine("5 Sortera dryckerna "); Console.WriteLine("0 Avsluta programmet"); Console.WriteLine(" "); Console.WriteLine("Välj en möjlighet genom att trycka på motsvarande siffrans tangent:"); tal=int.Parse(Console.ReadLine()); switch (tal)//Efter att användaren matat in vart i menyn han vill gå så dirigerar switch-satsen till den valda metoden. { case 1: add_soda(); break; case 2: print_crate(); break; case 3: calc_pris(); break; case 4: find_soda(); break; case 5: sort_soda(); break; case 0: Console.WriteLine("Programmet avslutas..."); break; default: Console.WriteLine("Felaktig inmatning");//används för att fånga upp någon annan inmatning än 1, 2, 3, 4, 5, 0. break; } }while(tal!=0); } public void add_soda()//Metod för att lägga till drycker i dryckesbacken { if (antal_flaskor == 24) { Console.WriteLine("Backen är full, du kan inte lägga till flera flaskor!"); return; } int temp=0; do { Console.WriteLine("Vilken dryck vill du lägga till i backen?: "); Console.WriteLine(" 1. CocaCola"); Console.WriteLine(" 2. SevenUp"); Console.WriteLine(" 3. Loka"); Console.WriteLine(" 4. Ramlösa"); Console.WriteLine(" 5. Redbull"); Console.WriteLine(" 0. Ingen"); Console.WriteLine(" "); temp=int.Parse(Console.ReadLine()); switch (temp) { case 1: Console.WriteLine("Du har valt CocaCola"); break; case 2: Console.WriteLine("Du har valt SevenUp"); break; case 3: Console.WriteLine("Du har valt Loka"); break; case 4: Console.WriteLine("Du har valt Ramlösa"); break; case 5: Console.WriteLine("Du har valt Redbull"); break; case 0: Console.WriteLine("Du ville inte lägga till någon dryck i backen..."); Console.WriteLine(" "); break; default: Console.WriteLine("Felaktig inmatning, mata in en siffra mellan 1-5"); break; } }while(temp!=0); Console.WriteLine(" "); Console.WriteLine("Tryck på enter för att komma tillbaka till valmenyn..."); Console.WriteLine(" "); Console.WriteLine(" "); Console.ReadKey(); } public void print_crate() //Metod för att skriva ut vilket innehåll backen har { Console.WriteLine("Dessa drycker finns i backen:"); Console.WriteLine(" "); foreach(var temp in drycker)//Loop för att skriva ut varenda objekt i vektorn { if (temp != null) Console.WriteLine(temp); else Console.WriteLine("Tom plats"); } Console.WriteLine(" "); Console.WriteLine("Tryck på enter för att komma tillbaka till valmenyn..."); Console.WriteLine(" "); Console.WriteLine(" "); Console.ReadKey(); } public int calc_pris()//Metod som ska räkna ihop värdet av alla drycker i backen { int pris = 0; foreach(Dryck count in drycker) { if (count != null) //Fångar upp exception som uppstår vid tom index { pris += count.get_pris(); } } return pris; } public void find_soda() { } public void sort_soda() { } } class Dryck { string namn; int pris; string typ; public Dryck (string _namn, int _pris, string _typ) //Konstruktor för Dryck { namn = _namn; pris = _pris; typ = _typ; } public int get_pris()//Metod för att komma åt variabeln pris { return pris; } public override string ToString()//standard versionen för hur ett objekt skrivs ut ändras med denna metod { return string.Format("* {0}, den kostar {1} kronor och drycken är en {2}", namn, pris, typ); } } }

Trädvy Permalänk
Medlem
Plats
Mölndal
Registrerad
Okt 2013
Skrivet av edv:

Hej!

Jag håller (som säkert många andra) på med projektet Sodacrate/Läskbacken för kursen Programmering 1 med c#.

Jag har jobbat flera dagar med att komma till underfund med detta projekt, men jag har fastnat totalt...
Programmering är något helt nytt för mig och för mindre än 2 månader sedan hade jag aldrig ens hört talas om C# mm :-P...

Hoppas att någon kan hjälpa mig..

Projektet är som följande:
https://novo.hermods.se/pluginfile.php/292026/question/questi...

Jag har hunnit skrivit en del kod, och har även googlat en hel del hur jag skulle kunna lösa mina frågetecken...

Först och främst undrar jag :

* Hur kan jag lagra de valda dryckerna i metoden add_soda()?
* Varför körs valmenyn om igen istället för att metoden calc_total() körs när man valt "3" i menyn i metoden Run()?

Min kod ser ut så här än så länge:

namespace Sodacrate
{
class Program
{
public static void Main(string[] args)
{

Sodacrate backen = new Sodacrate();//Skapar ett objekt av klassen Sodacrate som heter backen
backen.Run();//Anroper metoden Run
backen.add_soda();//Anropar metoden add_soda
backen.print_crate();//Anropar metoden print_crate
Console.WriteLine("Det totala värdet av dryckerna i backen är {0} kronor", backen.calc_pris());

Console.Write("Tryck på valfri tangent för att avsluta. . . ");
Console.ReadKey(true);
}
}

class Sodacrate
{
Dryck[]drycker;//förbereder c# att vi ska skapa en vektor av typen Dryck

private int antal_flaskor = 0; //Håller reda på alla flaskor //Antal fack

public Sodacrate()//Konstruktor
{
drycker=new Dryck[24];//Här skapas vektorn med antal positioner
drycker[0]= new Dryck("CocaCola", 15 , "läsk");
drycker[1]= new Dryck("Redbull", 25, "Energidryck");
drycker[2]= new Dryck("SevenUp", 15 , "läsk");
drycker[3]= new Dryck("Loka" , 14, "kolsyratvatten");
drycker[4]= new Dryck("Ramlösa", 14, "kolsyratvatten");
drycker[5]= new Dryck("Redbull", 25, "Energidryck");
drycker[6]= new Dryck("CocaCola", 15 , "läsk");
drycker[7]= new Dryck("SevenUp", 15 , "läsk");
drycker[8]= new Dryck("Loka" , 14, "kolsyratvatten");
drycker[9]= new Dryck("Ramlösa", 14, "kolsyratvatten");
}

public void Run()//Metoden där menyn finns med olika möjligheter i programmet
{
int tal=0;

do
{
Console.WriteLine("Hej och välkommen, här finns olika möjligheter för dryckesbacken!");
Console.WriteLine(" ");

//Nedanför finns valmenyn som är kopplat till switch-satsen.
Console.WriteLine("1 Placera drycker i dryckesbacken");
Console.WriteLine("2 Titta vad som finns i backen");
Console.WriteLine("3 Beräkna det totala värdet av innehållet i backen");
Console.WriteLine("4 Sök en viss dryck i backen");
Console.WriteLine("5 Sortera dryckerna ");
Console.WriteLine("0 Avsluta programmet");
Console.WriteLine(" ");
Console.WriteLine("Välj en möjlighet genom att trycka på motsvarande siffrans tangent:");

tal=int.Parse(Console.ReadLine());
switch (tal)//Efter att användaren matat in vart i menyn han vill gå så dirigerar switch-satsen till den valda metoden.
{
case 1: add_soda();
break;
case 2: print_crate();
break;
case 3: calc_pris();
break;
case 4: find_soda();
break;
case 5: sort_soda();
break;
case 0: Console.WriteLine("Programmet avslutas...");
break;
default: Console.WriteLine("Felaktig inmatning");//används för att fånga upp någon annan inmatning än 1, 2, 3, 4, 5, 0.
break;
}

}while(tal!=0);

}

public void add_soda()//Metod för att lägga till drycker i dryckesbacken
{
if (antal_flaskor == 24)
{
Console.WriteLine("Backen är full, du kan inte lägga till flera flaskor!");
return;
}

int temp=0;

do
{
Console.WriteLine("Vilken dryck vill du lägga till i backen?: ");
Console.WriteLine(" 1. CocaCola");
Console.WriteLine(" 2. SevenUp");
Console.WriteLine(" 3. Loka");
Console.WriteLine(" 4. Ramlösa");
Console.WriteLine(" 5. Redbull");
Console.WriteLine(" 0. Ingen");
Console.WriteLine(" ");

temp=int.Parse(Console.ReadLine());
switch (temp)
{
case 1:
Console.WriteLine("Du har valt CocaCola");

break;

case 2:
Console.WriteLine("Du har valt SevenUp");

break;
case 3:
Console.WriteLine("Du har valt Loka");

break;
case 4:
Console.WriteLine("Du har valt Ramlösa");

break;
case 5:
Console.WriteLine("Du har valt Redbull");

break;
case 0:
Console.WriteLine("Du ville inte lägga till någon dryck i backen...");
Console.WriteLine(" ");
break;
default:
Console.WriteLine("Felaktig inmatning, mata in en siffra mellan 1-5");
break;
}
}while(temp!=0);
Console.WriteLine(" ");
Console.WriteLine("Tryck på enter för att komma tillbaka till valmenyn...");
Console.WriteLine(" ");
Console.WriteLine(" ");
Console.ReadKey();

}

public void print_crate() //Metod för att skriva ut vilket innehåll backen har
{
Console.WriteLine("Dessa drycker finns i backen:");
Console.WriteLine(" ");

foreach(var temp in drycker)//Loop för att skriva ut varenda objekt i vektorn
{
if (temp != null)
Console.WriteLine(temp);
else
Console.WriteLine("Tom plats");
}
Console.WriteLine(" ");
Console.WriteLine("Tryck på enter för att komma tillbaka till valmenyn...");
Console.WriteLine(" ");
Console.WriteLine(" ");
Console.ReadKey();
}

public int calc_pris()//Metod som ska räkna ihop värdet av alla drycker i backen
{
int pris = 0;

foreach(Dryck count in drycker)
{
if (count != null) //Fångar upp exception som uppstår vid tom index
{
pris += count.get_pris();
}
}
return pris;

}

public void find_soda()
{

}

public void sort_soda()
{

}
}

class Dryck
{
string namn;
int pris;
string typ;

public Dryck (string _namn, int _pris, string _typ) //Konstruktor för Dryck
{
namn = _namn;
pris = _pris;
typ = _typ;
}

public int get_pris()//Metod för att komma åt variabeln pris
{
return pris;
}

public override string ToString()//standard versionen för hur ett objekt skrivs ut ändras med denna metod
{
return string.Format("* {0}, den kostar {1} kronor och drycken är en {2}", namn, pris, typ);
}

}
}

Använd code taggarna när du ska lägga upp kod. Då behålls indenteringen och gör koden mycket mer lättläslig
[*Code] [*/Code]

Asterisken ska alltså inte vara med när du skriver taggarna.

Stationär Dator Intel Core i7 4790k 4.85 Ghz @1.3V, Kelvin S24, Gigabyte Windforce GTX 970, Kingston Hyper X 4x4 GB 1600 MHz, Samsung 840x3, Msi Z97 Gaming 7, Windows 10 Pro / Fedora 28, Beyerdynamic DT 990 PRO, Asus PG279Q. Bärbar Dator Lenovo Yoga 720 Nas FreeNas 4 Tb

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

Först och främst, lägg gärna till [code] [/code] runt din kod, den blir fruktansvärt jobbig att läsa annars eftersom forumet käkar upp all indentering.

Skrivet av edv:

* Hur kan jag lagra de valda dryckerna i metoden add_soda()?

Du lägger redan till drycker i konstruktorn för Sodacrate, så det är bara att göra på samma sätt i add_soda. Du måste bara hålla redan på vilken plats du ska lägga till drycken på, vilket jag antar att variabeln antal_flaskor är till för.

Skrivet av edv:

* Varför körs valmenyn om igen istället för att metoden calc_total() körs när man valt "3" i menyn i metoden Run()?

Du har ingen metod calc_total, men jag antar att du menar calc_pris? Den metoden kommer köras vad jag kan se, men det kommer inte märkas. Fundera på vad det faktiskt är metoden gör för något.

Trädvy Permalänk
Medlem
Registrerad
Jun 2018

@Android98Geek: Tack, jag har gjort detta nu

Trädvy Permalänk
Medlem
Registrerad
Jun 2018
Skrivet av perost:

Först och främst, lägg gärna till [code] [/code] runt din kod, den blir fruktansvärt jobbig att läsa annars eftersom forumet käkar upp all indentering.

Du lägger redan till drycker i konstruktorn för Sodacrate, så det är bara att göra på samma sätt i add_soda. Du måste bara hålla redan på vilken plats du ska lägga till drycken på, vilket jag antar att variabeln antal_flaskor är till för.
Du har ingen metod calc_total, men jag antar att du menar calc_pris? Den metoden kommer köras vad jag kan se, men det kommer inte märkas. Fundera på vad det faktiskt är metoden gör för något.

Tack, men jag menar att användaren nu kan få välja att lagra drycker i vektorn genom metoden add_soda(), så hur gör jag detta? Jag har testat många olika sätt nu, blir snart tokig... 0:-)

Ja, du har rätt, jag menar calc_pris(). Jag har ingen aning varför den inte körs längre, tidigare idag så visades den hela tiden, oavsett ifall man hade vald "3" i valmenyn eller inte.. Men nu har jag fimplat på så mkt med koderna att nånting har gjort att det nu inte visas alls....

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av edv:

Tack, men jag menar att användaren nu kan få välja att lagra drycker i vektorn genom metoden add_soda(), så hur gör jag detta? Jag har testat många olika sätt nu, blir snart tokig... 0:-)

Det jag menade var att du uppenbarligen redan vet hur man lägger till drycker i vektorn eftersom du gör det i konstruktorn, så det är bara att göra på samma sätt i add_soda. Det enda som skiljer är att du får använda en variabel som index istället, t.ex. drycker[antal_flaskor] = ....

Skrivet av edv:

Ja, du har rätt, jag menar calc_pris(). Jag har ingen aning varför den inte körs längre, tidigare idag så visades den hela tiden, oavsett ifall man hade vald "3" i valmenyn eller inte.. Men nu har jag fimplat på så mkt med koderna att nånting har gjort att det nu inte visas alls....

calc_pris körs, men kommer så klart inte visa något eftersom du inte skriver ut något. Den räknar bara ihop det totala priset, som du sen slänger bort utan att göra något med.

Trädvy Permalänk
Medlem
Registrerad
Jun 2018

hej igen!

Nu har jag gjort detta nedanför för att calc_pris() ska visas, och det funkar som tur är(Vet inte om det är ett korrekt sätt att göra det på)

public static void Main(string[] args) { Sodacrate backen = new Sodacrate();//Skapar ett objekt av klassen Sodacrate som heter backen backen.Run();//Anroper metoden Run backen.add_soda();//Anropar metoden add_soda backen.print_crate();//Anropar metoden print_crate Console.Write("Tryck på valfri tangent för att avsluta. . . "); Console.ReadKey(true); }

switch (tal)//Efter att användaren matat in vart i menyn han vill gå så dirigerar switch-satsen till den valda metoden. { case 1: add_soda(); break; case 2: print_crate(); break; case 3: calc_pris(); Console.WriteLine(""); Console.WriteLine("Det totala värdet av dryckerna i backen är {0} kronor.",calc_pris()); Console.WriteLine(" "); Console.WriteLine("Tryck på enter för att komma tillbaka till valmenyn..."); Console.WriteLine(" "); Console.WriteLine(" "); Console.ReadKey(); break; case 4: find_soda(); break; case 5: sort_soda(); break; case 0: Console.WriteLine("Programmet avslutas..."); break; default: Console.WriteLine("Felaktig inmatning");//används för att fånga upp någon annan inmatning än 1, 2, 3, 4, 5, 0. break;

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av edv:

Nu har jag gjort detta nedanför för att calc_pris() ska visas, och det funkar som tur är(Vet inte om det är ett korrekt sätt att göra det på)

Du anropar fortfarande calc_pris överst i case 3:, det anropet kommer inte ha någon effekt och kan tas bort.

Men i övrigt är det ett vettigt sätt att göra det på. Alternativet hade varit att ha utskriften direkt i calc_pris, men då kan man ju inte längre använda den metoden om man bara vill ha reda på det totala priset utan att skriva ut något. Om du vill undvika att menykoden blir för plottrig så kan du alltid stoppa utskriftskoden i en ny metod (t.ex. print_pris om du vill köra vidare på det svengelska temat ) och anropa den från menyn istället.

Trädvy Permalänk
Medlem
Registrerad
Jun 2018
Skrivet av perost:

Det jag menade var att du uppenbarligen redan vet hur man lägger till drycker i vektorn eftersom du gör det i konstruktorn, så det är bara att göra på samma sätt i add_soda. Det enda som skiljer är att du får använda en variabel som index istället, t.ex. drycker[antal_flaskor] = ....

Tack igen, men det har verkligen snurrat ihop sig i bollen på mig haha :-O...
Jag har försökt på nedanstående sett nu, men det fungerar ju uppenbarligen inte då man kan mata in hur många drycker som helst, och de lagras inte ändå tror jag....

temp=int.Parse(Console.ReadLine()); switch (temp) { case 1: Console.WriteLine("Du har valt CocaCola"); drycker[antal_flaskor]=new Dryck("CocaCola", 15 , "läsk"); antal_flaskor++; break; case 2: Console.WriteLine("Du har valt SevenUp"); drycker[antal_flaskor]=new Dryck("SevenUp", 15 , "läsk"); antal_flaskor++; break; case 3: Console.WriteLine("Du har valt Loka"); drycker[antal_flaskor]=new Dryck("Loka", 14 , "kolsyratvatten"); antal_flaskor++; break; case 4: Console.WriteLine("Du har valt Ramlösa"); drycker[antal_flaskor]=new Dryck("Ramlösa", 14 , "kolsyratvatten"); antal_flaskor++; break; case 5: Console.WriteLine("Du har valt Redbull"); drycker[antal_flaskor]=new Dryck("Redbull", 25 , "energidryck"); antal_flaskor++; break; case 0: Console.WriteLine("Du ville inte lägga till någon dryck i backen..."); Console.WriteLine(" "); break; default: Console.WriteLine("Felaktig inmatning, mata in en siffra mellan 1-5"); break; } }while(temp!=0);

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av edv:

Tack igen, men det har verkligen snurrat ihop sig i bollen på mig haha :-O...
Jag har försökt på nedanstående sett nu, men det fungerar ju uppenbarligen inte då man kan mata in hur många drycker som helst, och de lagras inte ändå tror jag....

Det borde fungera att lägga till så där, men notera att du som sagt redan lagt till en del drycker i konstruktorn. Dessa drycker kommer alltså skrivas över när användaren lägger till egna drycker, så du kanske inte får de utskrifter du förväntar dig.

Sen problemet att man kan lägga till hur många drycker som helst beror på att du kontrollerar om backen är full i början av add_soda, vilket i sig är bra. Men sen tillåter du användaren att lägga till så många drycker som den vill utan någon kontroll. Du måste med andra ord kontrollera om backen är full eller inte efter varje dryck som användaren lägger till, och i så fall förhindra att fler drycker läggs till.

Trädvy Permalänk
Medlem
Registrerad
Jun 2018
Skrivet av perost:

Det borde fungera att lägga till så där, men notera att du som sagt redan lagt till en del drycker i konstruktorn. Dessa drycker kommer alltså skrivas över när användaren lägger till egna drycker, så du kanske inte får de utskrifter du förväntar dig.

Sen problemet att man kan lägga till hur många drycker som helst beror på att du kontrollerar om backen är full i början av add_soda, vilket i sig är bra. Men sen tillåter du användaren att lägga till så många drycker som den vill utan någon kontroll. Du måste med andra ord kontrollera om backen är full eller inte efter varje dryck som användaren lägger till, och i så fall förhindra att fler drycker läggs till.

tack så mycket igen!
Koden ser ut som här nedanför nu, problemet är dock att programmet kraschar nu när man matar in fler än 24....

public void add_soda()//Metod för att lägga till drycker i dryckesbacken { int temp=0; do { Console.WriteLine(""); Console.WriteLine("Vilken dryck vill du lägga till i backen?: "); Console.WriteLine(" 1. CocaCola"); Console.WriteLine(" 2. SevenUp"); Console.WriteLine(" 3. Loka"); Console.WriteLine(" 4. Ramlösa"); Console.WriteLine(" 5. Redbull"); Console.WriteLine(" 0. Ingen"); Console.WriteLine(" "); temp=int.Parse(Console.ReadLine()); switch (temp) { case 1: Console.WriteLine("Du har valt en CocaCola"); drycker[antal_flaskor]=new Dryck("CocaCola", 15 , "läsk"); antal_flaskor++; if (antal_flaskor <= 25) { Console.WriteLine("Du kan lägga till en till dryck om du vill!"); Console.WriteLine(""); } else { Console.WriteLine("Backen är full, du kan inte lägga till flera flaskor!"); Console.WriteLine(""); }break; case 2: Console.WriteLine("Du har valt en SevenUp"); drycker[antal_flaskor]=new Dryck("SevenUp", 15 , "läsk"); antal_flaskor++; if (antal_flaskor <= 25) { Console.WriteLine("Du kan lägga till en till dryck om du vill!"); Console.WriteLine(""); } else { Console.WriteLine("Backen är full, du kan inte lägga till flera flaskor!"); Console.WriteLine(""); }break; case 3: Console.WriteLine("Du har valt en Loka"); drycker[antal_flaskor]=new Dryck("Loka", 14 , "kolsyratvatten"); antal_flaskor++; if (antal_flaskor <= 25) { Console.WriteLine("Du kan lägga till en till dryck om du vill!"); Console.WriteLine(""); } else { Console.WriteLine("Backen är full, du kan inte lägga till flera flaskor!"); Console.WriteLine(""); }break; case 4: Console.WriteLine("Du har valt en Ramlösa"); drycker[antal_flaskor]=new Dryck("Ramlösa", 14 , "kolsyratvatten"); antal_flaskor++; if (antal_flaskor <= 25) { Console.WriteLine("Du kan lägga till en till dryck om du vill!"); Console.WriteLine(""); } else { Console.WriteLine("Backen är full, du kan inte lägga till flera flaskor!"); Console.WriteLine(""); }break; case 5: Console.WriteLine("Du har en valt Redbull"); drycker[antal_flaskor]=new Dryck("Redbull", 25 , "energidryck"); antal_flaskor++; if (antal_flaskor <= 25) { Console.WriteLine("Du kan lägga till en till dryck om du vill!"); Console.WriteLine(""); } else { Console.WriteLine("Backen är full, du kan inte lägga till flera flaskor!"); Console.WriteLine(""); }break; case 0: Console.WriteLine("Du ville inte lägga till någon dryck i backen..."); Console.WriteLine(" "); break; default: Console.WriteLine("Felaktig inmatning, mata in en siffra mellan 1-5"); break; } }while(temp!=0); Console.WriteLine(" "); Console.WriteLine("Tryck på enter för att komma tillbaka till valmenyn..."); Console.WriteLine(" "); Console.WriteLine(" "); Console.ReadKey(); }

Trädvy Permalänk
Medlem
Plats
Tyresö
Registrerad
Apr 2008

Min input är att det blir lite konstigt att programmet först tillåter användaren att lägga till en dryck till backen, räknar sedan upp antalet flaskor och sedan kollar om backen är full. Om backen är full borde väl kontrolleras först innan man lägger till nya flaskor.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av edv:

tack så mycket igen!
Koden ser ut som här nedanför nu, problemet är dock att programmet kraschar nu när man matar in fler än 24....

Vektorn har bara plats för 24 drycker, men du låter användaren fortsätta så länge som det finns 25 drycker eller färre i vektorn. Koden kommer alltså säga stopp först när användaren lagt till 26 drycker, vilket är två för många. Och även när den gränsen uppnås så skriver du bara ut ett meddelande men avslutar inte loopen, så användaren kan fortsätta lägga till fler drycker oavsett.

Något att tänka på är också att försöka undvika repeterad kod, det gör koden onödigt lång och svårare att underhålla eftersom man måste ändra på flera ställen istället för bara på ett (som nu när du måste ändra samma kod på 5 olika ställen). Om du finner att du måste skriva samma kod på flera ställen så är det ett tecken på att du borde stoppa den koden i en egen metod som du kan anropa, eller strukturera om koden så att det inte behövs.

Båda strategierna fungerar i det här fallet, men det enklaste är troligtvis att bara göra kontrollen om backen är full i början av loopen, istället för innuti switch-satsen. Då täcker du både fallet att backen redan är full när du går in i metoden, och att användaren fyller backen.

Trädvy Permalänk
Medlem
Registrerad
Jun 2018

@perost: Tack

Koden ser ut så här i nuläget för add_soda()

public void add_soda()//Metod för att lägga till drycker i dryckesbacken { int temp=0; do { Console.WriteLine(""); Console.WriteLine("Vilken dryck vill du lägga till i backen?: "); Console.WriteLine(" 1. CocaCola"); Console.WriteLine(" 2. SevenUp"); Console.WriteLine(" 3. Loka"); Console.WriteLine(" 4. Ramlösa"); Console.WriteLine(" 5. Redbull"); Console.WriteLine(" 0. Ingen"); Console.WriteLine(" "); if(antal_flaskor<=23) { temp=int.Parse(Console.ReadLine()); switch (temp) { case 1: Console.WriteLine("Du har valt en CocaCola"); drycker[antal_flaskor]=new Dryck("CocaCola", 15 , "läsk"); antal_flaskor++; break; case 2: Console.WriteLine("Du har valt en SevenUp"); drycker[antal_flaskor]=new Dryck("SevenUp", 15 , "läsk"); antal_flaskor++; break; case 3: Console.WriteLine("Du har valt en Loka"); drycker[antal_flaskor]=new Dryck("Loka", 14 , "kolsyratvatten"); antal_flaskor++; break; case 4: Console.WriteLine("Du har valt en Ramlösa"); drycker[antal_flaskor]=new Dryck("Ramlösa", 14 , "kolsyratvatten"); antal_flaskor++; break; case 5: Console.WriteLine("Du har en valt Redbull"); drycker[antal_flaskor]=new Dryck("Redbull", 25 , "energidryck"); antal_flaskor++; break; case 0: Console.WriteLine("Du ville inte lägga till någon dryck i backen..."); Console.WriteLine(" "); break; default: Console.WriteLine("Felaktig inmatning, mata in en siffra mellan 1-5"); break; } } else { Console.WriteLine("Backen är full, du kan inte lägga till flera flaskor!"); Console.WriteLine(""); break; } }while(temp!=0); Console.WriteLine(" "); Console.WriteLine("Tryck på enter för att komma tillbaka till valmenyn..."); Console.WriteLine(" "); Console.WriteLine(" "); Console.ReadKey(); }

Trädvy Permalänk
Medlem
Registrerad
Jun 2018

Hej igen!

Nu har jag stött på följande dilemma....

Jag vill lägga till en funktion där man ska kunna kolla ifall en viss dryck finns i backen,
man ska kunna söka på namn..

Jag vet inte riktigt hur jag ska gå tillväga...
Är jag inne på rätt tänk eller?
Jag har skrivit detta i nuläget:

public void find_soda() { Console.WriteLine("Skriv namnet på en dricka för att kolla ifall det finns i backen:"); int konvertera; string key; key=Console.ReadLine(); konvertera=Convert.ToInt32(key); for( i = 0; i < drycker.Length; i++) if(drycker[i]=key) { Console.WriteLine("Drycken finns på plats" + 1); break; } }

Hela koden ser ut så här:

namespace Sodacrate { class Program { public static void Main(string[] args) { Sodacrate backen = new Sodacrate();//Skapar ett objekt av klassen Sodacrate som heter backen backen.Run();//Anroper metoden Run backen.add_soda();//Anropar metoden add_soda backen.print_crate();//Anropar metoden print_crate Console.Write("Tryck på valfri tangent för att avsluta. . . "); Console.ReadKey(true); } } class Sodacrate { Dryck[]drycker;//förbereder c# att vi ska skapa en vektor av typen Dryck private int antal_flaskor = 0; //Håller reda på alla flaskor //Antal fack public Sodacrate()//Konstruktor { drycker=new Dryck[24];//Här skapas vektorn med antal positioner } public void Run()//Metoden där menyn finns med olika möjligheter i programmet { int tal=0; do { Console.WriteLine("Hej och välkommen, här finns olika möjligheter för dryckesbacken!"); Console.WriteLine(" "); //Nedanför finns valmenyn som är kopplat till switch-satsen. Console.WriteLine("1 Placera drycker i dryckesbacken"); Console.WriteLine("2 Titta vad som finns i backen"); Console.WriteLine("3 Beräkna det totala värdet av innehållet i backen"); Console.WriteLine("4 Sök en viss dryck i backen"); Console.WriteLine("5 Sortera dryckerna "); Console.WriteLine("0 Avsluta programmet"); Console.WriteLine(" "); Console.WriteLine("Välj en möjlighet genom att trycka på motsvarande siffrans tangent:"); tal=int.Parse(Console.ReadLine()); switch (tal)//Efter att användaren matat in vart i menyn han vill gå så dirigerar switch-satsen till den valda metoden. { case 1: add_soda(); break; case 2: print_crate(); break; case 3: Console.WriteLine(""); Console.WriteLine("Det totala värdet av dryckerna i backen är {0} kronor.",calc_pris()); Console.WriteLine(" "); Console.WriteLine("Tryck på enter för att komma tillbaka till valmenyn..."); Console.WriteLine(" "); Console.WriteLine(" "); Console.ReadKey(); break; case 4: find_soda(); break; case 5: sort_soda(); break; case 0: Console.WriteLine("Programmet avslutas..."); break; default: Console.WriteLine("Felaktig inmatning");//används för att fånga upp någon annan inmatning än 1, 2, 3, 4, 5, 0. break; } }while(tal!=0); } public void add_soda()//Metod för att lägga till drycker i dryckesbacken { int temp=0;//Variabel för att ta lagra inmatningen från användaren do //Do-while loop för att iterera så länge användaren inte matar in 0. { Console.WriteLine(""); Console.WriteLine("Vilken dryck vill du lägga till i backen?: "); Console.WriteLine(" 1. CocaCola"); Console.WriteLine(" 2. SevenUp"); Console.WriteLine(" 3. Loka"); Console.WriteLine(" 4. Ramlösa"); Console.WriteLine(" 5. Redbull"); Console.WriteLine(" 0. Ingen"); Console.WriteLine(" "); if(antal_flaskor<=23)//If-else sats för att loopa igenom inmatningar, OM backen inte är full så: { temp=int.Parse(Console.ReadLine());//Läser in inmatningen från användaren switch (temp)//Switch case för de olika val i dryckesmenyn { case 1: Console.WriteLine("Du har valt en CocaCola"); drycker[antal_flaskor]=new Dryck("CocaCola", 15 , "läsk"); antal_flaskor++; break; case 2: Console.WriteLine("Du har valt en SevenUp"); drycker[antal_flaskor]=new Dryck("SevenUp", 15 , "läsk"); antal_flaskor++; break; case 3: Console.WriteLine("Du har valt en Loka"); drycker[antal_flaskor]=new Dryck("Loka", 14 , "kolsyratvatten"); antal_flaskor++; break; case 4: Console.WriteLine("Du har valt en Ramlösa"); drycker[antal_flaskor]=new Dryck("Ramlösa", 14 , "kolsyratvatten"); antal_flaskor++; break; case 5: Console.WriteLine("Du har en valt Redbull"); drycker[antal_flaskor]=new Dryck("Redbull", 25 , "energidryck"); antal_flaskor++; break; case 0: Console.WriteLine("Du ville inte lägga till någon dryck i backen..."); Console.WriteLine(" "); break; default://Fångar upp felaktig inmatning Console.WriteLine("Felaktig inmatning, mata in en siffra mellan 1-5"); break; } } else//ANNARS ifall backen är full händer detta: { Console.WriteLine("Backen är full, du kan inte lägga till flera flaskor!"); Console.WriteLine(""); break; } }while(temp!=0);// Så länge användaren inte matar in 0 händer det som finns i do-while loopen Console.WriteLine(" "); Console.WriteLine("Tryck på enter för att komma tillbaka till valmenyn..."); Console.WriteLine(" "); Console.WriteLine(" "); Console.ReadKey(); } public void print_crate() //Metod för att skriva ut vilket innehåll backen har { Console.WriteLine("Dessa drycker finns i backen:"); Console.WriteLine(" "); foreach(var temp in drycker)//Loop för att skriva ut varenda objekt i vektorn { if (temp != null) Console.WriteLine(temp); else Console.WriteLine("Tom plats"); } Console.WriteLine(" "); Console.WriteLine("Tryck på enter för att komma tillbaka till valmenyn..."); Console.WriteLine(" "); Console.WriteLine(" "); Console.ReadKey(); } public int calc_pris()//Metod som ska räkna ihop värdet av alla drycker i backen { int pris=0; foreach(Dryck count in drycker) { if (count != null) //Fångar upp exception som uppstår vid tom index { pris += count.get_pris(); } }return pris; } public void find_soda() { Console.WriteLine("Skriv namnet på en dricka för att kolla ifall det finns i backen:"); int konvertera; string key; key=Console.ReadLine(); konvertera=Convert.ToInt32(key); for( i = 0; i < drycker.Length; i++) if(drycker[i]=key) { Console.WriteLine("Drycken finns på plats" + 1); break; } } public void sort_soda() { } } class Dryck { string namn; int pris; string typ; public Dryck (string _namn, int _pris, string _typ) //Konstruktor för Dryck { namn = _namn; pris = _pris; typ = _typ; } public int get_pris()//Metod för att komma åt variabeln pris { return pris; } public override string ToString()//standard versionen för hur ett objekt skrivs ut ändras med denna metod { return string.Format("* {0}, den kostar {1} kronor och drycken är en {2}", namn, pris, typ); } } }

Trädvy Permalänk
Medlem
Plats
Falun
Registrerad
Dec 2003
Skrivet av edv:

Hej igen!

Nu har jag stött på följande dilemma....

Jag vill lägga till en funktion där man ska kunna kolla ifall en viss dryck finns i backen,
man ska kunna söka på namn..

Jag vet inte riktigt hur jag ska gå tillväga...
Är jag inne på rätt tänk eller?
Jag har skrivit detta i nuläget:

public void find_soda() { Console.WriteLine("Skriv namnet på en dricka för att kolla ifall det finns i backen:"); int konvertera; string key; key=Console.ReadLine(); konvertera=Convert.ToInt32(key); for( i = 0; i < drycker.Length; i++) if(drycker[i]=key) { Console.WriteLine("Drycken finns på plats" + 1); break; } }

Just nu försöker du jämföra hela Dryckes-objektet med en sträng.
Du vill ju jämföra en Drycks namn med en sträng.

Dessutom så är ett likamedtecken en tilldelningsoperator och två stycken en jämförelseoperator.

Alltså ska du kontrollera genom följande:

if (drycker[i].namn == key) { //Position i har en dryck med strängen key }

Sen kommer du säkert tänka att du vill göra en sökning på en del av namnet och att den inte ska bry sig om stora eller små bokstäver.

Kolla då upp:
https://msdn.microsoft.com/en-us/library/dy85x1sa(v=vs.110).a...
https://msdn.microsoft.com/en-us/library/system.string.tolowe...

ηλί, ηλί, λαμά σαβαχθανί!?

Trädvy Permalänk
Medlem
Registrerad
Jun 2018
Skrivet av Leedow:

Just nu försöker du jämföra hela Dryckes-objektet med en sträng.
Du vill ju jämföra en Drycks namn med en sträng.

Dessutom så är ett likamedtecken en tilldelningsoperator och två stycken en jämförelseoperator.

Alltså ska du kontrollera genom följande:

if (drycker[i].namn == key) { //Position i har en dryck med strängen key }

Sen kommer du säkert tänka att du vill göra en sökning på en del av namnet och att den inte ska bry sig om stora eller små bokstäver.

Kolla då upp:
https://msdn.microsoft.com/en-us/library/dy85x1sa(v=vs.110).a...
https://msdn.microsoft.com/en-us/library/system.string.tolowe...

Tack,

Jag får fortfarande inte till rätt tänket i min hjärna...
Det snurrar totalt kan man säga

Jag la till det du sa, men felmeddelandet: "Namnet i finns inte i den aktuella kontexten" visas,
detta visades även innan jag ändrade koden...

Det ser ut som följande nu:

public void find_soda() { Console.WriteLine("Skriv namnet på en dricka för att kolla ifall det finns i backen:"); int konvertera; string key; key=Console.ReadLine(); konvertera=Convert.ToInt32(key); for( i = 0; i < drycker.Length; i++) { if (drycker[i].namn == key) { //Position i har en dryck med strängen key } } }

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Okt 2004
Skrivet av edv:

Tack,

Jag får fortfarande inte till rätt tänket i min hjärna...
Det snurrar totalt kan man säga

Jag la till det du sa, men felmeddelandet: "Namnet i finns inte i den aktuella kontexten" visas,
detta visades även innan jag ändrade koden...

Det ser ut som följande nu:

public void find_soda() { Console.WriteLine("Skriv namnet på en dricka för att kolla ifall det finns i backen:"); int konvertera; string key; key=Console.ReadLine(); konvertera=Convert.ToInt32(key); for( i = 0; i < drycker.Length; i++) { if (drycker[i].namn == key) { //Position i har en dryck med strängen key } } }

Du behöver definiera variablen i i din for-loop med hjälp av ex. var innan du använder den:

for(var i = 0; i < drycker.Length; i++)

Trädvy Permalänk
Medlem
Registrerad
Jun 2018

Tack!

Jag har lagt till var så som jag blev tipsat om här ovan.
Felmeddelandet försvann därmed

Men nu är det nästa bekymmer:
Det går inte att komma åt Sodacrate.Dryck.namn på grund av dess skyddsnivå (CS0122) -

public void find_soda() { Console.WriteLine("Skriv namnet på en dricka för att kolla ifall det finns i backen:"); int konvertera; string key; key=Console.ReadLine(); konvertera=Convert.ToInt32(key); for( var i = 0; i < drycker.Length; i++) { if (drycker[i].namn == key) { //Position i har en dryck med strängen key } } }

Hur kan jag lösa detta isf?

Trädvy Permalänk
Medlem
Plats
Falun
Registrerad
Dec 2003
Skrivet av edv:

Tack!

Jag har lagt till var så som jag blev tipsat om här ovan.
Felmeddelandet försvann därmed

Men nu är det nästa bekymmer:
Det går inte att komma åt Sodacrate.Dryck.namn på grund av dess skyddsnivå (CS0122) -

public void find_soda() { Console.WriteLine("Skriv namnet på en dricka för att kolla ifall det finns i backen:"); int konvertera; string key; key=Console.ReadLine(); konvertera=Convert.ToInt32(key); for( var i = 0; i < drycker.Length; i++) { if (drycker[i].namn == key) { //Position i har en dryck med strängen key } } }

Hur kan jag lösa detta isf?

Din Dryckesklass har ett par instansvariabler men dessa är inte publika vilket betyder att du inte kan använda dem utanför Dryckes-objektet.

Använd nyckelordet public för att göra variablerna åtkomstbara.

Ex i Dryck-klassen:

public string namn;

ηλί, ηλί, λαμά σαβαχθανί!?

Trädvy Permalänk
Medlem
Registrerad
Jun 2018
Skrivet av Leedow:

Din Dryckesklass har ett par instansvariabler men dessa är inte publika vilket betyder att du inte kan använda dem utanför Dryckes-objektet.

Använd nyckelordet public för att göra variablerna åtkomstbara.

Ex i Dryck-klassen:

public string namn;

Tack igen!
Det fungerade även det 0:-)

Problemet är nu att när man har sökt en dricka i backen så måste man först ha lagt till dryckerna i backen i valmenyn...
Det måste jag lösa genom att meddela användaren att backen är tom än så länge och att man måste lägga till drycker först.

Ett annat problem som uppstår är att programmet kraschar efter att man först har lagt till drycker och sedan väljer man i valmenyn att
söka en dryck via find_soda(). Först visas att den valda drycken finns på vilken index, men när man trycker sedan på enter kraschar det...Felmeddandet:
System.NullReferenceException: Objektreferensen har inte angets till en instans av ett objekt
Jag har försökt att lösa detta med break, console.readkey() och nu försökte jag även med någon sorts try and catch()...

Hur kan jag lösa detta? 0:-)

Koden ser ut så här nu:

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; 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 < drycker.Length; i++) { if (drycker[i].namn == key) { Console.WriteLine(" "); Console.WriteLine("Drycken finns i fack " + i + " " + "i backen."); Console.WriteLine(""); Console.ReadKey(); //Position i har en dryck med strängen key } } }

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av edv:

Ett annat problem som uppstår är att programmet kraschar efter att man först har lagt till drycker och sedan väljer man i valmenyn att
söka en dryck via find_soda().

Det beror på att du just nu går igenom hela drycker-vektorn när du söker efter en dryck, och kollar även de element som inte har något värde (= null, därav NullReferenceException). Du måste begränsa sökningen så att du endast kollar de drycker som användaren lagt till.

Trädvy Permalänk
Medlem
Registrerad
Jun 2018
Skrivet av perost:

Det beror på att du just nu går igenom hela drycker-vektorn när du söker efter en dryck, och kollar även de element som inte har något värde (= null, därav NullReferenceException). Du måste begränsa sökningen så att du endast kollar de drycker som användaren lagt till.

Okej, och det gör jag alltså inte på följande sätt?:

string key; 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(""); } }

Trädvy Permalänk
Medlem
Plats
Helsingborg
Registrerad
Maj 2005

@edv:

Utan att ha någon direkt kunskap om C# (dock flera andra språk), ligger väl felet på:
if (drycker[i].namn == key)
Om inte alla element är initierade (dvs endast i<=9 har faktiska objekt i sig), så kommer du i princip anropa "null.namn". Du behöver först kolla om drycker[i] != NULL (eller hur man nu skriver det i C#).

Z87-Pro, I5 4670K@4.0 (4.2 single), Sapphire 290 TRI-X ~10% överklock, 16GB Crucial Tactical@stock, Deep Silent 1, Samsung Evo 250GB + 2x1TB 7200 + 500GB SSD (också Evo?)
Toshiba Satellite L855-10U
P5QL, E5300@3640Hz, GTX275, 4GB kingston 800MHz cl4, Threehundred, Zalman 500W

Trädvy Permalänk
Medlem
Plats
Fotbollsplanen
Registrerad
Sep 2002

Lättast i ditt fall är nog att skicka med antal_flaskor i metoden.

for (var i = 0; i < antal_flaskor; i++)

För smidighetens skull hade jag även tagit bort ReadKey i for loopen när man söker, så att alla träffar kommer direkt. Samt ha en räknare i loopen som kollar om du fick någon träff, blir den 0 så skriv ut att inget hittades, tryck på en tangent för att återgå, sedan en readkey.

Edit, det var samma klass, så du kan köra antal_flaskor direkt i loopen.

Trädvy Permalänk
Medlem
Registrerad
Jun 2018

Hej igen,

Jag får inte till det :-/...

Jag har försökt ändra till att använda variabeln antal_flaskor i loopen,
men den lagrar ju antal flaskor och inga string värden, och key är en string variabel...

koden ser ut så här nu,
men programmet fortsätter krasha....

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; while(true) { try { key=Console.ReadLine(); break; } catch(FormatException) { Console.WriteLine("Du får skriva in ett giltigt dryckesnamn istället"); } } for( var i = 0; i < drycker.Length; i++) { if (drycker[i].namn == key && drycker[i].namn != null) { Console.WriteLine(" "); Console.WriteLine("Drycken finns i fack " + i + " " + "i backen."); Console.WriteLine(""); } else if (drycker[i].namn == null) { Console.WriteLine(" "); Console.WriteLine("Det finns ingen" + key + "i backen"); Console.WriteLine(" "); } } Console.ReadKey(); }

Trädvy Permalänk
Medlem
Registrerad
Jun 2018

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..

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Okt 2001

Som jag sagt tidigare, skrämmande att se svenska blandas in i namn på t.ex. variablar, detta är något som oftast inte accepteras ute i arbetslivet då man oftast har många anställda ifrån olika länder.

Bara på det lilla företaget jag jobbar (med 50 anställda) så talas det 6 språk, även om alla kan svenska så används bara engelska.

Tänk dig själv att börja förvalta ett system som är skrivet på spanska, och därför bör man lära sig "rätt" ifrån början.

Framstår kanske som tjurig, men av erfarenhet så kan jag stärka att det finns få saker innom yrket som är så irriterande som att förvalta något skrivet i ett annat språk än Engelska.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Okt 2004
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..

break; innebär att loopen du är i avslutas. Ta bort detta om du vill fortsätta leta även efter första träffen.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av edv:

Jag har försökt ändra till att använda variabeln antal_flaskor i loopen,
men den lagrar ju antal flaskor och inga string värden, och key är en string variabel...

Poängen var att använda antal_flaskor istället för drycker.Length för att begränsa hur många element loopen söker igenom.

Skrivet av edv:

if (drycker[i].namn == key && drycker[i].namn != null)

Orsaken till varför det här inte fungerar är att du använder drycker[i].namn för att jämföra mot key, och först efter att du gjort det kontrollerar du om drycker[i].namn faktiskt existerar. Men kontrollen hade inte fungerar ändå eftersom det är själva elementet i vektorn som är null och inte namn i det elementet. D.v.s. drycker[i] kommer att vara null för i >= antal_flaskor.

Skrivet av edv:

Nu kraschar programmet inte, utan den återgår till huvudmenyn efter att ha visat en drycks plats i backen.

Programmet borde fortfarande krascha om användaren matar in en dryck som inte finns i backen och backen inte är full.