Trädvy Permalänk
Medlem
Registrerad
Mar 2015

C++ Loop hjälp

Tjenare,
Sitter och håller på med en skoluppgift i C++ och har skapat följande loop i min kod där en produkt ska beställas.
Undrar hur man kan loopa detta på något snyggare och effektivare sätt då jag kommer fylla på med fler produkter och denna if provning jag använder nu kommer bli väldigt klumpig och jobbig att jobba med.

Förstår om vad jag vill ha ut av koden kan se förvirrande ut utan resten av koden och sammanhang, så fråga om nått är oklart.

Tackar på förväg!

int beställningsloop = 0; while (beställningsloop == 0) { cout << "Vilken produkt vill du beställa?"<< endl; string beställning; cin >> beställning; if (beställning == produkt[0]) { cout << "Du beställde en " << beställning; _getch(); beställningsloop = 1; system("CLS"); } else if (beställning == produkt[1]) { cout << "Du beställde en " << beställning; _getch(); beställningsloop = 1; system("CLS"); } else if (beställning == produkt[2]) { cout << beställning; _getch(); beställningsloop = 1; system("CLS"); } else if (beställning == produkt[4]) { cout << "Du beställde en " << beställning; _getch(); beställningsloop = 1; system("CLS"); } else if (beställning == produkt[5]) { cout << "Du beställde en " << beställning; _getch(); beställningsloop = 1; system("CLS"); } else { cout << "Produkten finns inte" << endl; _getch(); } }

CPU: i5 4690k @ 4.2ghz | Kylare: Hyper 212 EVO | MB: MSI Z97-G45 | RAM: Corsair 8gb | GPU: Asus 760 2gb | SSD: Intel 530 120gb | HDD: Seagate 1tb | PSU: CX600M | Chassi: Define R4 window | Fans: 4x140mm

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Maj 2011
Skrivet av DooD:

Tjenare,
Sitter och håller på med en skoluppgift i C++ och har skapat följande loop i min kod där en produkt ska beställas.
Undrar hur man kan loopa detta på något snyggare och effektivare sätt då jag kommer fylla på med fler produkter och denna if provning jag använder nu kommer bli väldigt klumpig och jobbig att jobba med.

Förstår om vad jag vill ha ut av koden kan se förvirrande ut utan resten av koden och sammanhang, så fråga om nått är oklart.

Tackar på förväg!
int beställningsloop = 0;
while (beställningsloop == 0)
{
cout << "Vilken produkt vill du beställa?"<< endl;
string beställning;
cin >> beställning;
if (beställning == produkt[0])
{
cout << "Du beställde en " << beställning;
_getch();
beställningsloop = 1;
system("CLS");
}
else if (beställning == produkt[1])
{
cout << "Du beställde en " << beställning;
_getch();
beställningsloop = 1;
system("CLS");
}
else if (beställning == produkt[2])
{
cout << beställning;
_getch();
beställningsloop = 1;
system("CLS");
}
else if (beställning == produkt[4])
{
cout << "Du beställde en " << beställning;
_getch();
beställningsloop = 1;
system("CLS");
}
else if (beställning == produkt[5])
{
cout << "Du beställde en " << beställning;
_getch();
beställningsloop = 1;
system("CLS");
}
else
{
cout << "Produkten finns inte" << endl;
_getch();

}
}

Använd code taggen för att få det mer lättläst

int beställningsloop = 0; while (beställningsloop == 0) { cout << "Vilken produkt vill du beställa?"<< endl; string beställning; cin >> beställning; if (beställning == produkt[0]) { cout << "Du beställde en " << beställning; _getch(); beställningsloop = 1; system("CLS"); } else if (beställning == produkt[1]) { cout << "Du beställde en " << beställning; _getch(); beställningsloop = 1; system("CLS"); } else if (beställning == produkt[2]) { cout << beställning; _getch(); beställningsloop = 1; system("CLS"); } else if (beställning == produkt[4]) { cout << "Du beställde en " << beställning; _getch(); beställningsloop = 1; system("CLS"); } else if (beställning == produkt[5]) { cout << "Du beställde en " << beställning; _getch(); beställningsloop = 1; system("CLS"); } else { cout << "Produkten finns inte" << endl; _getch(); } }

För det första kan du använda en bool istället för en int i din while loop.
Du kan använda en switch/case sats istället för if-satser.
Du kan i din sats endast sätta beställning = produkt och sen i slutet på whileloopen skriva ut allt det andra för att undvika dublicering av kod

EDIT: Jag hoppas du förstår vad jag menar. Annars får du säga till

Corsair Air 540 | Asus Z87-PRO | INTEL i7-4770K @ 4,2 ghz| 4x4gb 1600mhz RAM | Zotac 980 AMP! XTREME 4GB | SSD 512GB | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK | OSx + Win 10 pro N 64-bit
---------------------------------------------------------------------------------
Server: Supermicro X7DBP-8 | 2x Intel Xeon E5420 | 16gb ECC | 700w PSU | TS3 | CS:GO | mer i framtiden

Trädvy Permalänk
Medlem
Plats
åkersberga, Täby
Registrerad
Jun 2004

Jobbigt när du inte använder code taggar

kanske kan göra såhär:

string produkter [3] = { "produkt1 ", "produkt2", "produkt3", "produkt4" }; while running{ cout << "tillgängliga produkter: " << endl; for(int i = 0; i < 4; i++){ cout << "Produkt: " << i << produkter[i]; << endl; } cout<<"Välj produkt" << endl; cin >> beställning; osv..... sedan kanske... cout <<"vill du beställa fler produkter?"<<endl; }

Dator 1.
FX 8350 4.7Ghz | 24GB ram | MSI Radeon RX 480 | Kingston SSD | Fractal design R2.0 | PSU : Fractal 650W
Dator 2 (Bärbar). HP Folio 9470m

Trädvy Permalänk
Medlem
Registrerad
Sep 2010

Dina if-satser saknar relevans då du bara skriver ut samma sak som du jämför med. Du kunde lika skriva:

int i = 0; ... while (i < 6) { if (beställning == produkt[i]) { cout << "Du beställde en " << beställning; _getch(); beställningsloop = 1; system("CLS"); break; } i++; } if (i == 6) { cout << "Produkten finns inte" << endl; _getch(); }

EDIT:
Som LinusNeuman skriver nedan så är switch-satser annars bättre istället för flera if-satser, men mitt första exempel är smidigare och lättare att anpassa om du utökar antalet produkter.

switch (beställning) { case produkt[0]: case produkt[1]: case produkt[2]: case produkt[3]: case produkt[4]: case produkt[5]: cout << "Du beställde en " << beställning; _getch(); beställningsloop = 1; system("CLS"); break; default: cout << "Produkten finns inte" << endl; _getch(); break; }

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2011

Använd switch-case när det blir många if-satser?

Trädvy Permalänk
Medlem
Registrerad
Mar 2015

@suzieq: Hej, ditt första exempel ser inte ut att fungera fullt ut så som jag tänkt och jag är lite förvirrad över vad du har gjort. Just nu så har jag skrivit in:

string produkt[10]; produkt[0] = "bult"; produkt[1] = "skruv"; produkt[5] = "spik";

Din kod funkar för alla tre, men om jag skriver in något som inte är "bult", "skruv" eller "spik" så återgår den till "Vilken produkt vill du beställa?" och inte till "Produkten finns inte"

CPU: i5 4690k @ 4.2ghz | Kylare: Hyper 212 EVO | MB: MSI Z97-G45 | RAM: Corsair 8gb | GPU: Asus 760 2gb | SSD: Intel 530 120gb | HDD: Seagate 1tb | PSU: CX600M | Chassi: Define R4 window | Fans: 4x140mm

Trädvy Permalänk
Medlem
Registrerad
Mar 2015

@LinusNeuman: Är lite osäker på hur dem fungerar och vad som skiljer dem mot if satser.

CPU: i5 4690k @ 4.2ghz | Kylare: Hyper 212 EVO | MB: MSI Z97-G45 | RAM: Corsair 8gb | GPU: Asus 760 2gb | SSD: Intel 530 120gb | HDD: Seagate 1tb | PSU: CX600M | Chassi: Define R4 window | Fans: 4x140mm

Trädvy Permalänk
Medlem
Registrerad
Mar 2015

@Krullieboy: Hej! Vad är en bool och vad skiljer den från en int? Förstår inte riktigt hur du menar med att sätta beställning = produkt.

CPU: i5 4690k @ 4.2ghz | Kylare: Hyper 212 EVO | MB: MSI Z97-G45 | RAM: Corsair 8gb | GPU: Asus 760 2gb | SSD: Intel 530 120gb | HDD: Seagate 1tb | PSU: CX600M | Chassi: Define R4 window | Fans: 4x140mm

Trädvy Permalänk
Medlem
Registrerad
Mar 2015

@martin_cs: Får rött streck under running.

CPU: i5 4690k @ 4.2ghz | Kylare: Hyper 212 EVO | MB: MSI Z97-G45 | RAM: Corsair 8gb | GPU: Asus 760 2gb | SSD: Intel 530 120gb | HDD: Seagate 1tb | PSU: CX600M | Chassi: Define R4 window | Fans: 4x140mm

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Maj 2011
Skrivet av DooD:

@Krullieboy: Hej! Vad är en bool och vad skiljer den från en int? Förstår inte riktigt hur du menar med att sätta beställning = produkt.

En bool (boolean) är ett objekt som är sant eller falskt. Det vill säga att du kan ha

bool again = true; while (again){ switch(INMATNING){ case produkt[1]: again=false; } }

Det jag menar med att sätta beställning = produkt är att du ska slippa ha rekursiv kod. Det vill säga kod som är den samma på flera ställen. Istället för att ha

if (bla bla) cout << beställning; mer kod else if (bla bla) cout << beställning; mer kod

.... osv

så kan du ha

if (Villkor) beställning = det man beställt

osv

och efter alla satser ha

cout << beställning. mer kod

EDIT: OBS att detta är pseudokod.

Corsair Air 540 | Asus Z87-PRO | INTEL i7-4770K @ 4,2 ghz| 4x4gb 1600mhz RAM | Zotac 980 AMP! XTREME 4GB | SSD 512GB | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK | OSx + Win 10 pro N 64-bit
---------------------------------------------------------------------------------
Server: Supermicro X7DBP-8 | 2x Intel Xeon E5420 | 16gb ECC | 700w PSU | TS3 | CS:GO | mer i framtiden

Trädvy Permalänk
Medlem
Registrerad
Sep 2010

@DooD: Såhär:

#include <iostream> #include <string> using namespace std; inte main() { string produkt[10]; produkt[0] = "bult"; produkt[1] = "skruv"; produkt[5] = "spik"; int i; int beställningsloop = 0; while (beställningsloop == 0) { cout << "Vilken produkt vill du beställa?"<< endl; string beställning; cin >> beställning; while (i < 10) { if (beställning == produkt[i]) { cout << "Du beställde en " << beställning; _getch(); beställningsloop = 1; system("CLS"); break; } i++; } if (i == 10) { cout << "Produkten finns inte" << endl; _getch(); } } }

Nu har jag druckit öl och har ingen kompilator i närheten, så jag lämnar inga garantier

Trädvy Permalänk
Medlem
Registrerad
Mar 2015

@suzieq: Verkar funka fin fint. Ska ta en närmare titt på hur allt fungerar och möjliga framtida problem. Tack så mycket!
Edit: En liten fråga, vad exakt gör break i denna kod?

CPU: i5 4690k @ 4.2ghz | Kylare: Hyper 212 EVO | MB: MSI Z97-G45 | RAM: Corsair 8gb | GPU: Asus 760 2gb | SSD: Intel 530 120gb | HDD: Seagate 1tb | PSU: CX600M | Chassi: Define R4 window | Fans: 4x140mm

Trädvy Permalänk
Medlem
Plats
åkersberga, Täby
Registrerad
Jun 2004

@DooD:

Jag postade inte en fungerande kod :). Utan ett exempel på hur du kan tänka.

Dator 1.
FX 8350 4.7Ghz | 24GB ram | MSI Radeon RX 480 | Kingston SSD | Fractal design R2.0 | PSU : Fractal 650W
Dator 2 (Bärbar). HP Folio 9470m

Trädvy Permalänk
Medlem
Registrerad
Sep 2010

@DooD: break bryter dig ut ur while-loopen, så att den inte loopar längre än nödvändigt.

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Maj 2011
Skrivet av DooD:

@suzieq: Verkar funka fin fint. Ska ta en närmare titt på hur allt fungerar och möjliga framtida problem. Tack så mycket!
Edit: En liten fråga, vad exakt gör break i denna kod?

Med break bryter du en loop. Som i detta fall när du hittat det matchade objektet så behöver du inte loopa klart hela loopen. Till exempel om du hittar den när i är 1 och du har while(i<10) så kommer den inte loopa tills i är 10 då du brytit loopen med break;

EDIT: Tvåa på bollen

Corsair Air 540 | Asus Z87-PRO | INTEL i7-4770K @ 4,2 ghz| 4x4gb 1600mhz RAM | Zotac 980 AMP! XTREME 4GB | SSD 512GB | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK | OSx + Win 10 pro N 64-bit
---------------------------------------------------------------------------------
Server: Supermicro X7DBP-8 | 2x Intel Xeon E5420 | 16gb ECC | 700w PSU | TS3 | CS:GO | mer i framtiden

Trädvy Permalänk
Medlem
Registrerad
Mar 2015
Skrivet av suzieq:

@DooD: break bryter dig ut ur while-loopen, så att den inte loopar längre än nödvändigt.

Skrivet av Krullieboy:

Med break bryter du en loop. Som i detta fall när du hittat det matchade objektet så behöver du inte loopa klart hela loopen. Till exempel om du hittar den när i är 1 och du har while(i<10) så kommer den inte loopa tills i är 10 då du brytit loopen med break;

EDIT: Tvåa på bollen

Seems fair enough. Så den loopar tills den hittat en produkt som matchar min beställning och då bryter den ur loopen?
En till grej, hur exakt funkar system("CLS");? varför rensar den inte hela skärmen när while loopen kommit fram till den? rensar den bara inom loopen på nått sätt?

CPU: i5 4690k @ 4.2ghz | Kylare: Hyper 212 EVO | MB: MSI Z97-G45 | RAM: Corsair 8gb | GPU: Asus 760 2gb | SSD: Intel 530 120gb | HDD: Seagate 1tb | PSU: CX600M | Chassi: Define R4 window | Fans: 4x140mm

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Maj 2011
Skrivet av DooD:

Seems fair enough. Så den loopar tills den hittat en produkt som matchar min beställning och då bryter den ur loopen?
En till grej, hur exakt funkar system("CLS");? varför rensar den inte hela skärmen när while loopen kommit fram till den? rensar den bara inom loopen på nått sätt?

system("CLS") har jag för min använder windows funktion för CLS. Jag har också för mig att man ska undvika att använda denna då ditt program kommer att:

1. Bli beroende av plattform då system("CLS") inte fungerar på UNIX/LINUX eller osX (rätta mig om jag har fel).
2. Sårbar mot hackning då CLS ska gå att förändra på enheten man kör det på (tror jag mig jag läst någonstans).

OT på din fråga så vet jag faktiskt inte. Jag skulle rekommendera att köra någon "fullösning" som skriver ut flera radbrytningar istället för CLS

Corsair Air 540 | Asus Z87-PRO | INTEL i7-4770K @ 4,2 ghz| 4x4gb 1600mhz RAM | Zotac 980 AMP! XTREME 4GB | SSD 512GB | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK | OSx + Win 10 pro N 64-bit
---------------------------------------------------------------------------------
Server: Supermicro X7DBP-8 | 2x Intel Xeon E5420 | 16gb ECC | 700w PSU | TS3 | CS:GO | mer i framtiden

Trädvy Permalänk
Medlem
Registrerad
Mar 2015

@Krullieboy: Okej tack! Ska ta en titt på det!

CPU: i5 4690k @ 4.2ghz | Kylare: Hyper 212 EVO | MB: MSI Z97-G45 | RAM: Corsair 8gb | GPU: Asus 760 2gb | SSD: Intel 530 120gb | HDD: Seagate 1tb | PSU: CX600M | Chassi: Define R4 window | Fans: 4x140mm

Trädvy Permalänk
Medlem
Plats
Bästkusten
Registrerad
Jun 2009
Skrivet av DooD:

Seems fair enough. Så den loopar tills den hittat en produkt som matchar min beställning och då bryter den ur loopen?
En till grej, hur exakt funkar system("CLS");? varför rensar den inte hela skärmen när while loopen kommit fram till den? rensar den bara inom loopen på nått sätt?

Ett bra tips är att undvika "system"-anrop. Här är några alternativ: http://www.cplusplus.com/forum/articles/10515/

|| 2700K @ 4.7GHz || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & OCZ Agility 3 120GB & Crucial C300 64GB & Crucial V4 256GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Trädvy Permalänk
Medlem
Registrerad
Maj 2014
Skrivet av DooD:

Sitter och håller på med en skoluppgift i C++ och har skapat följande loop
...då jag kommer fylla på med fler produkter och denna if provning jag använder nu kommer bli väldigt klumpig och jobbig att jobba med.

Eftersom det är en skoluppgift så är mitt råd att hålla dig till det du har lärt dig, även om det verkar klumpigt och jobbigt. Själva poängen med övningen är nog att nöta en while loop med if och if else statements, den enda riktiga vägen är hårt arbete och nöta loss för att lära dig, tar du genvägar så hjälper det dig inte i längden.

Sedan är det såklart bra att vara nyfiken, lära sig mer och på andra vis, men jag skulle göra sådant efter en specifik övning är klar, typ egna extra övningar för att lösa samma sak.