Permalänk
Medlem

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

Visa signatur

CPU: i5 4690k @ 4.2ghz | Kylare: Hyper 212 EVO | MB: MSI Z97-G45 | RAM: Corsair 16GB | GPU: Asus 760 2GB | OS SSD: Intel 530 120GB | HDD: Seagate 1TB | SSD: Samsung EVO 250GB | PSU: CX600M | Chassi: Define R4 window | Fläktar: 4x140mm

Permalänk
Medlem
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

Visa signatur

Corsair Air 540 | Asus strix x470-f gaming | AMD Ryzen 7 3700x| 2x8gb 3200mhz RAM | Asus GTX 2070 |2xSSD 512GB(boot) | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK, Benq 27" 144hz | Win 11 pro N 64-bit

Permalänk
Medlem

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; }

Visa signatur

[IT-Dept]
Ryzen 1700 OC - 32 - 1070

Permalänk
Medlem

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; }

Permalänk

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

Permalänk
Medlem

@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"

Visa signatur

CPU: i5 4690k @ 4.2ghz | Kylare: Hyper 212 EVO | MB: MSI Z97-G45 | RAM: Corsair 16GB | GPU: Asus 760 2GB | OS SSD: Intel 530 120GB | HDD: Seagate 1TB | SSD: Samsung EVO 250GB | PSU: CX600M | Chassi: Define R4 window | Fläktar: 4x140mm

Permalänk
Medlem

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

Visa signatur

CPU: i5 4690k @ 4.2ghz | Kylare: Hyper 212 EVO | MB: MSI Z97-G45 | RAM: Corsair 16GB | GPU: Asus 760 2GB | OS SSD: Intel 530 120GB | HDD: Seagate 1TB | SSD: Samsung EVO 250GB | PSU: CX600M | Chassi: Define R4 window | Fläktar: 4x140mm

Permalänk
Medlem

@Nollan: 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.

Visa signatur

CPU: i5 4690k @ 4.2ghz | Kylare: Hyper 212 EVO | MB: MSI Z97-G45 | RAM: Corsair 16GB | GPU: Asus 760 2GB | OS SSD: Intel 530 120GB | HDD: Seagate 1TB | SSD: Samsung EVO 250GB | PSU: CX600M | Chassi: Define R4 window | Fläktar: 4x140mm

Permalänk
Medlem

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

Visa signatur

CPU: i5 4690k @ 4.2ghz | Kylare: Hyper 212 EVO | MB: MSI Z97-G45 | RAM: Corsair 16GB | GPU: Asus 760 2GB | OS SSD: Intel 530 120GB | HDD: Seagate 1TB | SSD: Samsung EVO 250GB | PSU: CX600M | Chassi: Define R4 window | Fläktar: 4x140mm

Permalänk
Medlem
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.

Visa signatur

Corsair Air 540 | Asus strix x470-f gaming | AMD Ryzen 7 3700x| 2x8gb 3200mhz RAM | Asus GTX 2070 |2xSSD 512GB(boot) | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK, Benq 27" 144hz | Win 11 pro N 64-bit

Permalänk
Medlem

@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

Permalänk
Medlem

@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?

Visa signatur

CPU: i5 4690k @ 4.2ghz | Kylare: Hyper 212 EVO | MB: MSI Z97-G45 | RAM: Corsair 16GB | GPU: Asus 760 2GB | OS SSD: Intel 530 120GB | HDD: Seagate 1TB | SSD: Samsung EVO 250GB | PSU: CX600M | Chassi: Define R4 window | Fläktar: 4x140mm

Permalänk
Medlem

@DooD:

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

Visa signatur

[IT-Dept]
Ryzen 1700 OC - 32 - 1070

Permalänk
Medlem

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

Permalänk
Medlem
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

Visa signatur

Corsair Air 540 | Asus strix x470-f gaming | AMD Ryzen 7 3700x| 2x8gb 3200mhz RAM | Asus GTX 2070 |2xSSD 512GB(boot) | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK, Benq 27" 144hz | Win 11 pro N 64-bit

Permalänk
Medlem
Skrivet av suzieq:

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

Skrivet av Nollan:

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?

Visa signatur

CPU: i5 4690k @ 4.2ghz | Kylare: Hyper 212 EVO | MB: MSI Z97-G45 | RAM: Corsair 16GB | GPU: Asus 760 2GB | OS SSD: Intel 530 120GB | HDD: Seagate 1TB | SSD: Samsung EVO 250GB | PSU: CX600M | Chassi: Define R4 window | Fläktar: 4x140mm

Permalänk
Medlem
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

Visa signatur

Corsair Air 540 | Asus strix x470-f gaming | AMD Ryzen 7 3700x| 2x8gb 3200mhz RAM | Asus GTX 2070 |2xSSD 512GB(boot) | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK, Benq 27" 144hz | Win 11 pro N 64-bit

Permalänk
Medlem

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

Visa signatur

CPU: i5 4690k @ 4.2ghz | Kylare: Hyper 212 EVO | MB: MSI Z97-G45 | RAM: Corsair 16GB | GPU: Asus 760 2GB | OS SSD: Intel 530 120GB | HDD: Seagate 1TB | SSD: Samsung EVO 250GB | PSU: CX600M | Chassi: Define R4 window | Fläktar: 4x140mm

Permalänk
Keeper of Traditions
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/

Visa signatur

|| Intel 8700K || Asus RTX 4070 TI Super TUF || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || Corsair RM 850x || 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.

Permalänk
Medlem
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.