Permalänk

Boleanska uttryck c++

Hej!

Jag behöver lite mer hjälp med mitt roulettespel, se: Hjälp med variabler om du är nyfiken.

Vad jag inte förstår är varför denna bit kod inte fungerar:

#include <string> main(){ string pick = number, red, black; int bettingNumber; cout << "Would you like to bet on a number or a color? Type, 'red', 'black' or ' number' to make your pick.\n"; cin >> pick; while (pick != number, red, black) { cout << "please type in number, red or black to make your choice"; cin >> pick; return 0; }

När jag kompilerar min kod står det:

  • Expression (syftar på 'pick') must have bool type (or be convertible to bool)

  • Identifier "number" is undefined

  • 'number': undeclared identifier

  1. Varför är bara 'number' undefined men inte 'red' eller 'black'?

  2. Kan någon förklara bool uttryck för mig och vad jag behöver veta för detta tillfälle?

Permalänk
Medlem
Skrivet av Bizzzzznes:

Hej!

Jag behöver lite mer hjälp med mitt roulettespel, se: om du är nyfiken.

Vad jag inte förstår är varför denna bit kod inte fungerar:

#include <string> main(){ string pick = number, red, black; int bettingNumber; cout << "Would you like to bet on a number or a color? Type, 'red', 'black' or ' number' to make your pick.\n"; cin >> pick; while (pick != number, red, black) { cout << "please type in number, red or black to make your choice"; cin >> pick; return 0; }

När jag kompilerar min kod står det:

  • Expression (syftar på 'pick') must have bool type (or be convertible to bool)

  • Identifier "number" is undefined

  • 'number': undeclared identifier

  1. Varför är bara 'number' undefined men inte 'red' eller 'black'?

  2. Kan någon förklara bool uttryck för mig och vad jag behöver veta för detta tillfälle?

1. Du deklarerar red och black på raden "string pick = number, red, black;", däremot deklareras aldrig number.
2. Vet inte hur mycket det hjälper men ett boolskt uttryck är ju helt enkelt ett uttryck som har ett boolskt värde, dvs sant eller falskt. Det kan ju vara t.ex. en variabel av lämplig typ eller en jämförelse.

Jag tror ju dock snarare att det är det här skrivandet av saker med kommatecken mellan som är någon missuppfattning av hur någonting fungerar.

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem

Om det är en skoluppgift så kommer du inte få så mycket specifik hjälp

Var ett tag sen jag pilla med c++ men ska försöka peka dig i en riktning...

Kör färgen som string och number som int, även om det fungerar med string på tal ocskå, men i kommande uppgifter så är det bra om du förstår skillnaden då det blir bökigt att utföra beräkningar med strängar =). Eftersom du matar in en siffra så är det bättre att ta emot den som int. Du nu angett dem som variablar dvs pick = number, red, black vilket inte funkar du skulle kunna skriva pick "number, red, black" så kommer pick innehålla texten: number, red, black. Men du vill ha dem separat.

Det du vill göra är att deklarera number som integer (hanterar heltal) red och black som strings.
Sedan jämföra dem en å en. jag gissar att din while-loop inte fungerar heller?

Du behöver tänka till igen Som det ser ut nu så har du inte riktigt koll på vad string är eller integer.

Edit: var lite för snabb.

Gör lite enkelt Pseudokod (typ flödesschema) kan hjälpa en att få till det ibland.

Ex och spark i en riktning. #include <string> main(){ string pick = ""; //dessa initierar /deklarerar pick som en sträng med "tomt" innehåll redo att användas string red = ""; string black = ""; int bettingNumber = 0; // bra att ge variabeln ett värde, inget måste. //vill du ha allt på en rad kan du ex skriva: string black="", string red="" etc cout << "Would you like to bet on a number or a color? Type, 'red', 'black' or ' number' to make your pick.\n"; cin >> pick; while (pick != number, red, black) { //här jämför du om strängen pick != red eller pick != black eller number > 0. På siffrar ska du inte citattecken. cout << "please type in number, red or black to make your choice"; cin >> pick; //sedan skickar du in en cout här för att se innehållet på pick return 0; }

Visa signatur

.

Permalänk
Skrivet av fragwolf:

Om det är en skoluppgift så kommer du inte få så mycket specifik hjälp

Kör färgen som string och number som int, även om det fungerar med string på tal ocskå, men i kommande uppgifter så är det bra om du förstår skillnaden då det blir bökigt att utföra beräkningar med strängar =). Eftersom du matar in en siffra så är det bättre att ta emot den som int. Du nu angett dem som variablar dvs pick = number, red, black vilket inte funkar du skulle kunna skriva pick "number, red, black" så kommer pick innehålla texten: number, red, black. Men du vill ha dem separat.

Det du vill göra är att deklarera number som integer (hanterar heltal) red och black som strings.
Sedan jämföra dem en å en. jag gissar att din while-loop inte fungerar heller?

Du behöver tänka till igen Som det ser ut nu så har du inte riktigt koll på vad string är eller integer.

Edit: var lite för snabb.

Gör lite enkelt Pseudokod (typ flödesschema) kan hjälpa en att få till det ibland.

Jag håller på att lära mig c++ med hjälp av internet, så ingen skoluppgift. Vad jag skapar är ett roulettespel vilket ska vara en "relativt" enkel uppgift för nybörjare.

Jag vet vad int är men har väl förvirrat något i mitt huvud. String får jag nog kolla upp lite bättre. Nej, min while loop fungerar tyvärr inte.

Permalänk
Medlem

@Bizzzzznes:
om du ska använda integer så behöver du göra om en del. Det går att använda strängar för att jämföra siffor. Men blir svårt att jämföra varje siffra för sig i din loop. Du måste jämföra siffra 1,2,3...etc. Om du istället inmatningen som en integer så kan du bara kolla om en siffra är inmatat med number > 0. > = större än samt < mindre än. Dvs om en siffra större än 0 är inmatad så fortsätt.
Är inte säker på om man kan skriva number > 0 < 30 eller om man behöver skriva number > 0 && number <= 30 (för att se om siffra mellan 1 och 30 är inmatad.

Gör varje steg för sig och använt cout för att se vad variablarna innehåller. Om du inte använder ex visual studio då du kan använda debugläge för att se innehållet i variablarna i realtid.

Visa signatur

.

Permalänk
Medlem
Skrivet av fragwolf:

string pick = ""; //dessa initierar /deklarerar pick som en sträng med "tomt" innehåll redo att användas

std::string initieras till tom sträng i defaultkonstruktorn, att skriva = "" är alltså onödigt.

Visa signatur

h170i-plus i5 6600 2x8gb ddr3l 850 pro 256gb
Don't argue with an idiot. He will drag you down to his level, and beat you with experience.

Permalänk
Medlem
Skrivet av deppan:

std::string initieras till tom sträng i defaultkonstruktorn, att skriva = "" är alltså onödigt.

Misstänkte det, men ville vara tydlig mot TS ifall. Så han förstår vad jag menade.

Visa signatur

.

Permalänk

@Bizzzzznes:

Vad har du programmerat för språk förut? Och vad vill du egentligen göra i ditt villkor?

Detta kommer bli lite rörigt, men i C++ finns operator "," (komma). Den säger att först skall man göra det som står till vänster om kommat och sedan det som står till höger om kommat. Resultatet av komma-uttrycket blir det som står till höger om kommat. Precis som när du skriver "v = uttryck1 + uttryck2" kan du skriva "v = uttryck1 , uttryck2". Kompilatorn kommer då räkna ut uttryck1 och sedan uttryck2 och tilldela resultatet av uttryck2 till v. Operator "," är mest användbar om man vill trixa och göra flera saker i exempelvis ett ?:-uttryck.

När du skriver

while (pick != number, red, black)

har du skrivit just ett komma-uttryck i villkoret. I ditt fall betyder det att kompilatorn kommer räkna ut pick != number, strunta i resultatet, jämföra om strängen red != 0, strunta i det och sedan testa black != 0 och låta resultatet av det styra while-loopen.

Du ville sannolikt göra ett test med flera deluttryck:

while (pick != number && pick != "red" && pick != "black")

Detta löser dock inte den problematik som @fragwolf tog upp. Den första delen av testet borde kolla om pick är ett godkänt nummer, men nu kollar den bara om pick skiljer sig från number (vad det nu är).

Du kanske vill göra något i stil med:

while (true) { cout << "Would you like to bet on a number or a color? Type, 'red', 'black' or ' number' to make your pick.\n"; cin >> pick if (pick == "red") break; if (pick == "black") break; int number = std::stoi(pick); if (number >= 0 && number <= 36) break; }

Felhanteringen är inte den bästa och du kommer nog vilja komma ihåg vad användaren gjorde för val, men exemplet visar på ett annat sätt att angripa det krångliga loop-villkoret. En enklare lösning vore att säga att -1 betyder rött och -2 betyder svart. Då kan du jobba bara med heltal och då blir problemet mycket enklare.

Permalänk

Ok.... Det kanske blir lite enklare om jag förklarar vad jag vill göra med ord.

  1. Spelet börjar med lite text till spelaren

  2. Jag vill sedan be spelaren att välja om hen vill spela genom att betta på ett nummer, eller en färg (röd eller svart).

  3. När spelaren har gjort sitt val tas hen antingen direkt till valet av betsumma (om de valde en färg), eller till det faktiska valet av sitt nummer om de valde att betta på nummer.

  4. ....

Det är nu jag får problem. Jag vill att dem ska skriva in orden nummer, röd eller svart för att välja. Ordet nummer ska alltså inte vara = ett nummer ännu. Därför kan jag inte använda en int här.

int number = 1 || 2 || 3 || ....

Detta skulle väl inte riktigt funka liksom?
Om jag inte vet om de vill betta på ett nummer eller en färg så vet jag inte vart jag ska säga åt programmen att ta spelaren vidare i processen.

Just nu, utan att ha ändrat något sedan jag skapade denna tråden ser processen ut så här:

string pick = number, red, black; int bettingNumber; cout << "Would you like to bet on a number or a color? Type, 'red', 'black' or ' number' to make your pick.\n"; cin >> pick; while (pick != number, red, black) { //Som jag har förstått det ska jag ändra denna raden till = while (pick !=number && !=red && !=black). cout << "please type in number, red or black to make your choice"; cin >> pick; } if (cin >> number) { cout << "Pick a number between 1 and 36: "; cin >> bettingNumber; cout << "\n"; while (bettingNumber > 36 || bettingNumber < 1) { cout << "That number is not allowed, please pick a number between 1 and 36: "; cin >> bettingNumber; cout << "\n"; } } else if (cin >> red) { cout << "You've chosen to play on the color red. Good luck!\n"; } else (cin >> black); { cout << "You've chose to play on the color black. Good luck!\n"; }

edit: Jag kanske borde skriva pick == number, pick == red, pick == black i "if" selektionen istället för cin >> ...

Permalänk
Skrivet av Ingetledigtnamn:

@Bizzzzznes:

Vad har du programmerat för språk förut?

Absolut ingenting innan detta. Detta är "officiellt" den första gången jag någonsin programmerar. Lite frustrerande men väldigt kul

Permalänk
Skrivet av Bizzzzznes:

Ok.... Det kanske blir lite enklare om jag förklarar vad jag vill göra med ord.

  1. Spelet börjar med lite text till spelaren

  2. Jag vill sedan be spelaren att välja om hen vill spela genom att betta på ett nummer, eller en färg (röd eller svart).

  3. När spelaren har gjort sitt val tas hen antingen direkt till valet av betsumma (om de valde en färg), eller till det faktiska valet av sitt nummer om de valde att betta på nummer.

  4. ....

Det är nu jag får problem. Jag vill att dem ska skriva in orden nummer, röd eller svart för att välja. Ordet nummer ska alltså inte vara = ett nummer ännu. Därför kan jag inte använda en int här.

int number = 1 || 2 || 3 || ....

Detta skulle väl inte riktigt funka liksom?
Om jag inte vet om de vill betta på ett nummer eller en färg så vet jag inte vart jag ska säga åt programmen att ta spelaren vidare i processen.

Just nu, utan att ha ändrat något sedan jag skapade denna tråden ser processen ut så här:

string pick = number, red, black; int bettingNumber; cout << "Would you like to bet on a number or a color? Type, 'red', 'black' or ' number' to make your pick.\n"; cin >> pick; while (pick != number, red, black) { //Som jag har förstått det ska jag ändra denna raden till = while (pick !=number && !=red && !=black). cout << "please type in number, red or black to make your choice"; cin >> pick; } if (cin >> number) { cout << "Pick a number between 1 and 36: "; cin >> bettingNumber; cout << "\n"; while (bettingNumber > 36 || bettingNumber < 1) { cout << "That number is not allowed, please pick a number between 1 and 36: "; cin >> bettingNumber; cout << "\n"; } } else if (cin >> red) { cout << "You've chosen to play on the color red. Good luck!\n"; } else (cin >> black); { cout << "You've chose to play on the color black. Good luck!\n"; }

edit: Jag kanske borde skriva pick == number, pick == red, pick == black i "if" selektionen istället för cin >> ...

Hmm, var skall vi börja. Du tänker rätt men när det skall översättas till C++ kommer du lite snett.

Punkt 1 går fint

När vi kommer till punkt två blir det lite mer spännande. Om du skriver exempelvis

string pick, number, red, black;

kommer du deklarera fyra variabler: pick, number, red och black av typen string som alla innehåller den tomma strängen "". När du sedan läser in ett värde och testar pick mot red

cin >> pick; if (pick != red) ...

kommer du jämföra innehållet i variablerna pick och red. Pick innehåller då det som användaren matade in och red innehåller det senaste värde som du tilldelade red, dvs den tomma strängen. Du har två alternativ: antingen initierar du dina variabler så red innehåller strängen "red"

string pick, number("number"), red("red"), black("black");

eller så jämför du pick med strängen "red" istället för variabeln red:

if (pick != "red") ...

Lite kommentarer angående resten av koden: För att while-loopen skall kompilera måste du fylla i pick på alla ställena:

while (pick !=number && pick !=red && pick != black).

Precis som du påpekar måste du testa på pick i if-statserna efter loopen. Att skriva

if (cin >> number) ...

är visserligen korrekt C++ (man kommer ta if-satsen om man lyckades läsa in ett heltal från cin) men då kommer det krävas att man matar in något som inte är ett heltal för att komma till villkoret för red och där kommer det man matade in hamna i red. Det kommer inte bete sig som du vill att det skall funka.

Permalänk

Min while loop har fastnat och jag fattar verkligen inte varför. Jag kommer översätta c++ till text så får ni gärna påpeka vart jag gick fel.

string pick, number("number"), red("red"), black("black"); cout << "Would you like to bet on a number or a color? Type, 'red', 'black' or 'number' to make your pick.\n"; cin >> pick; while (pick != number || pick != red || pick != black) { cout << "please type in number, red or black to make your choice: "; cin >> pick;

  1. Jag deklarerar variabeln "pick", samt initierar variablerna "number", "red" och "black".

  2. Jag ber användaren att välja ett utav alternativen.

  3. Jag låter användaren mata in ett värde i variabeln "pick".

  4. Jag kollar om det nya värdet i pick = antingen värdet i number eller red eller black.

  5. Om så är fallet, då fortsätter programmet (till min if-selektion),

  6. Annars får användaren mata in ett nytt värde i variabeln "pick".

Jag förstår inte varför detta inte fungerar. Som det ser ut nu spelar det ingen roll vad jag matar in för värde, while loopen bara loopar oavsett vad jag skriver. purple, blue, green, red, black, number, heaven... Det spelar ingen roll vad jag matar in.

Permalänk
Medlem

@Bizzzzznes:

Mitt förslag är att du läser på lite om sanningstabeller och logiska jämförelseoperatorer ( ==, !=, ||, &&). Gör några små enkla tester för att se hur de fungerar så du får förståelsen för det.

Just nu kommer (pick != number || pick != red || pick != black) alltid bli sant för minst två av de tre deluttrycken kommer alltid vara sanna vilket gör hela uttrycket sant.

Permalänk
Skrivet av Boombaaz:

@Bizzzzznes:

Mitt förslag är att du läser på lite om sanningstabeller och logiska jämförelseoperatorer ( ==, !=, ||, &&). Gör några små enkla tester för att se hur de fungerar så du får förståelsen för det.

Just nu kommer (pick != number || pick != red || pick != black) alltid bli sant för minst två av de tre deluttrycken kommer alltid vara sanna vilket gör hela uttrycket sant.

Yes... Jag kollade på en youtube video och tror att jag fixade åtminstone större delen av problemet.

Jag vet inte om mitt nuvarande problem är helt nytt eller en del av det tidigare problemet.

int bettingNumber; string pick, number("number"), red("red"), black("black"); cout << "Would you like to bet on a number or a color? Type, 'red', 'black' or 'number' to make your pick.\n"; cin >> pick; while (pick != number && pick != red && pick != black) { //Jag fixade uttrycket så att det är och (&&) iställer för eller (||). Därför kommer uttrycket antingen alltid vara sant eller alltid falskt. cout << "please type in number, red or black to make your choice: "; cin >> pick; } if (pick == number) { //Jag ändrade dessa från cin >> number till pick == number. cout << "Pick a number between 1 and 36: "; cin >> bettingNumber; cout << "\n"; while (bettingNumber > 36 || bettingNumber < 1) { cout << "That number is not allowed, please pick a number between 1 and 36: "; cin >> bettingNumber; cout << "\n"; } } else if (pick == red) { cout << "You've chosen to play on the color red. Good luck!\n"; } else (pick == black); { cout << "You've chose to play on the color black. Good luck!\n"; }

I princip allt fungerar. Det enda problemet jag har just nu är att när jag skriver in red för att betta på red så står det att jag har valt att betta på både red och black. När jag skriver in black för att betta på black så kommer det vanliga meddelandet om att jag har valt att betta på black.

Om någon undrar... Ja, jag är medveten om att jag inte har gett varken black eller red ett faktiskt värde för att räkna ut om de vann... Jag har tänkt att använda mig av modulus. Alla jämna tal kommer jag göra = red och alla ojämna kommer vara = black. Bra idé?

Permalänk

else if (pick == red) { cout << "You've chosen to play on the color red. Good luck!\n"; } else (pick == black); { cout << "You've chose to play on the color black. Good luck!\n"; }

Du har glömt if på sista else if-satsen och satt ett semikolon efter villkoret. Det betyder att efter sista else står det ett komplett uttryck. Efter det står det { cout << "You've chose to play on the color black. Good luck!\n"; }. Detta statement kommer alltid att exekveras, oavsett vilket val du gjorde.

Permalänk
Skrivet av Ingetledigtnamn:

else if (pick == red) { cout << "You've chosen to play on the color red. Good luck!\n"; } else (pick == black); { cout << "You've chose to play on the color black. Good luck!\n"; }

Du har glömt if på sista else if-satsen och satt ett semikolon efter villkoret. Det betyder att efter sista else står det ett komplett uttryck. Efter det står det { cout << "You've chose to play on the color black. Good luck!\n"; }. Detta statement kommer alltid att exekveras, oavsett vilket val du gjorde.

Ahh... well jag skyller den på Visual Studio... Får massa syntax errors hela tiden av "ingen" anledning och den ber mig typ att göra massa grejer som jag tycker är konstigt men om jag inte gör det så funkar programmet inte över huvud taget :@

Seriöst det är svinstörande. Jag har precis fått typ två miljoner syntax errors som säger att jag inte har deklarerat vissa variabler, men det har jag. Vissa variabler deklarerade jag tidigt i programmet. Vad är grejen! Jag får fan flipp! Sorry för mitt lilla rage...

Permalänk
Medlem

@Bizzzzznes - du är välkommen på laborationstillfället imorgon klockan 13.15 så ser vi över detta. Uppgiften är till för att lösas individuellt, där du kan få hjälp med saker som dessa under de handledningstillfällen som erbjuds. Alternativt är du välkommen att ställa din fråga i kursforumet på SCIO.

Vänliga hälsningar,
Din handledare och examinator

Visa signatur

Vill du att jag besvarar något så kom ihåg att citera mitt inlägg! :)

Permalänk
Medlem
Skrivet av Subtractive:

@Bizzzzznes - du är välkommen på laborationstillfället imorgon klockan 13.15 så ser vi över detta. Uppgiften är till för att lösas individuellt, där du kan få hjälp med saker som dessa under de handledningstillfällen som erbjuds. Alternativt är du välkommen att ställa din fråga i kursforumet på SCIO.

Vänliga hälsningar,
Din handledare och examinator

Men, men... Lärare och handledare får väl inte använda internet för att läsa i allmänna forum på nätet ?

Permalänk
Skrivet av Subtractive:

@Bizzzzznes - du är välkommen på laborationstillfället imorgon klockan 13.15 så ser vi över detta. Uppgiften är till för att lösas individuellt, där du kan få hjälp med saker som dessa under de handledningstillfällen som erbjuds. Alternativt är du välkommen att ställa din fråga i kursforumet på SCIO.

Vänliga hälsningar,
Din handledare och examinator

Haha har du läst min tråd alltså

Jag frågade Christian om det var okej att posta på externa forum och han sade att det är inte att rekommendera på grund av möjliga plagiatproblem, men han sade aldrig att det stred mot några regler. Detta är ju mitt konto så det verkar ganska självklart att jag kan bevisa att det är min kod. Därav existerar inga plagiatproblem.

Jag kommer dock gärna på handledningspassen. Online på detta sätt är bara för de tillfällen då handledningspassen inte är tillgängliga.

Skrivet av fragwolf:

Om det är en skoluppgift så kommer du inte få så mycket specifik hjälp

Därav skulle de kännas ganska dumt av mig om jag sade att det är en skoluppgift.

Permalänk

@Bizzzzznes: Hoppas du inte behöver mer hjälp...