SweClockers drop!
Permalänk
Medlem

trubbel med if-sats

jag håller på med ett mycket enkelt spel där man ska gissa ett tal som datorn har slumpat fram.

och på slutet när man gissat klart har jag en if-sats där man får se hur duktig man varit. jag tycker det borde fungera.. men hur många gånger man än gissar så säger den "det var halvbra" när den borde säga "det var asdåligt".

"rakna" är en int som säger hur många gånger man gissat.
Det är C++.

if (rakna <= 4 ) { cout << ", det var duktigt!" << endl; } else if ( 4 < rakna < 8 ) { cout << ", det var halvbra!" << endl; } else if (rakna >= 8 ) { cout << ", det var asd\x86ligt!" << endl; }

Vad är det jag gjort fel?

Permalänk
Medlem

så här skulle jag ha gjort det.

if (rakna >= 8 ) cout << ", det var asd\x86ligt!" << endl; else if ( 4 < rakna) cout << ", det var halvbra!" << endl; else cout << ", det var duktigt!" << endl;

Visa signatur

Speldator: Ryzen 7800X3D, 64GB DDR5, RTX 5090
Server: i7-8700k, 32GB DDR4, RTX2080
Steam deck, Rog Ally + de fiesta konsoler.

Permalänk
Medlem

Nu håller inte jag på med C++ däremot lingo som är liknande, kan det vara cout som ska va count istället eller är det en egen variabel du har skapat?

Visa signatur

i7 920 | 12GB DDR3 | GTX 480 | GA-X58A-UD7 | 160GB SSD X25-M G2 | 1TB F3 HD103SJ | W7 64-bit | Mac Mini
Webb: bluekitestudios.com

Permalänk
Medlem

Gör som MugiMugi säger. Problemet är att

4 < rakna < 8

inte är giltig C/C++.

Permalänk
Medlem

Behöver du inte en extra else? Iaf, som m0rris säger, så kan du inte skriva sådär. Skriv 4 < rakna && rakna < 8 istället. I C++ evalueras första delen till 0 eller 1 först, sedan fortsätter det, vilket gör att t ex -1<0<1 är falskt i C++ (eftersom -1<0 blir 1 och 1<1 är falskt).

Visa signatur

:€

Permalänk
Medlem

Tackar!
Nu funkar det.

Permalänk
Medlem

const char* msg[] = {"duktigt","halvbra","asd\x86ligt"}; printf(", det var %s!", rakna < 8 ? (rakna <= 4 ? msg[0] : msg[1]): msg[2]);

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av save
Nu håller inte jag på med C++ däremot lingo som är liknande, kan det vara cout som ska va count istället eller är det en egen variabel du har skapat?

Att jämföra lingo med c++ är helt befängt. Visst man kan göra någelunda avancerade saker med lingo men det är endå en scriptstråk till director och inget mer. C++ är många gånger mer kraftfullt. cout är ett komando för att skriva ut något på skrämen tex. en variabels värde och ahr inget med med count att göra.

Visa signatur

"Obay your leader"

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av isch
Att jämföra lingo med c++ är helt befängt. Visst man kan göra någelunda avancerade saker med lingo men det är endå en scriptstråk till director och inget mer. C++ är många gånger mer kraftfullt. cout är ett komando för att skriva ut något på skrämen tex. en variabels värde och ahr inget med med count att göra.

cout är snarare en stream.

Står för Console OUT f ö.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk

Re: trubbel med if-sats

Citat:

Ursprungligen inskrivet av Mechatronic
jag håller på med ett mycket enkelt spel där man ska gissa ett tal som datorn har slumpat fram.

och på slutet när man gissat klart har jag en if-sats där man får se hur duktig man varit. jag tycker det borde fungera.. men hur många gånger man än gissar så säger den "det var halvbra" när den borde säga "det var asdåligt".

"rakna" är en int som säger hur många gånger man gissat.
Det är C++.

if (rakna <= 4 ) { cout << ", det var duktigt!" << endl; } else if ( 4 < rakna < 8 ) { cout << ", det var halvbra!" << endl; } else if (rakna >= 8 ) { cout << ", det var asd\x86ligt!" << endl; }

Vad är det jag gjort fel?

Annars kan det vara så att ditt spel vill vara lite snällt, genom att inte säga "det var asdåligt" utan istället vara lite mildare och säga "det var halvbra".

Visa signatur

Permalänk
Medlem

Nej, han hade ju kodat fel!!1

Permalänk
Medlem

Re: trubbel med if-sats

Citat:

Ursprungligen inskrivet av Mechatronic
jag håller på med ett mycket enkelt spel där man ska gissa ett tal som datorn har slumpat fram.

och på slutet när man gissat klart har jag en if-sats där man får se hur duktig man varit. jag tycker det borde fungera.. men hur många gånger man än gissar så säger den "det var halvbra" när den borde säga "det var asdåligt".

"rakna" är en int som säger hur många gånger man gissat.
Det är C++.

if (rakna <= 4 ) { cout << ", det var duktigt!" << endl; } else if ( 4 < rakna < 8 ) { cout << ", det var halvbra!" << endl; } else if (rakna >= 8 ) { cout << ", det var asd\x86ligt!" << endl; }

Vad är det jag gjort fel?

if (rakna <= 4 ) { cout << ", det var duktigt!" << endl; } else if (rakna < 8 ) { cout << ", det var halvbra!" << endl; } else if (rakna >= 8 ) { cout << ", det var asd\x86ligt!" << endl; }

Så här kanske ( jag har tagit bort "4 <" innan "rakna" på rad 5.

Visa signatur

5.times {print "Lär dig ruby!"} http://poignantguide.net/ruby/

Permalänk

-Vad exact gör man med C/C++
-Vet någon en bra sida man kan lära sig C/C++?

kanske borde hålla mig till lingonen :S

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av Addictedsky
-Vad exact gör man med C/C++
-Vet någon en bra sida man kan lära sig C/C++?

kanske borde hålla mig till lingonen :S

1. C är ett programmeringsspråk, C++ är en vidareutveckling av C.
2. Kolla länkarna i FAQ:en.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av m0REc
cout är snarare en stream.

Står för Console OUT f ö.

jaja Petig petig m0Rec

Visa signatur

"Obay your leader"

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av isch
Att jämföra lingo med c++ är helt befängt. Visst man kan göra någelunda avancerade saker med lingo men det är endå en scriptstråk till director och inget mer. C++ är många gånger mer kraftfullt. cout är ett komando för att skriva ut något på skrämen tex. en variabels värde och ahr inget med med count att göra.

Jo det är sant som du säger, men många kodrader byggs upp på liknande vis, allt jag försökte göra va att hjälpa.

Visa signatur

i7 920 | 12GB DDR3 | GTX 480 | GA-X58A-UD7 | 160GB SSD X25-M G2 | 1TB F3 HD103SJ | W7 64-bit | Mac Mini
Webb: bluekitestudios.com

Permalänk
Medlem

hallå!
nu har jag lite if-trubbel igen...

när jag ska gissa på ett tal så räknar datorn med att jag ska mata in en siffra som ska hamna i en int som heter "gissa".
men om jag matar in en bokstav så blir den tokig och hamnar i en loop.
jag skulle vilja lägga till en

if (gissa inte är en siffra) { cout << "vänligen skriv en siffra"; }

hur kan man skriva det?

Permalänk
Medlem

if(!isdigit(gissa)) printf("Välj en siffra.");

isdigit() är ett makro som finns definierat i ctype.h

Permalänk
Medlem

det funkar inte riktigt... den kompilerar och så. men den beter sig underligt.

if(!isdigit(gissa)) { cout << "V\x84nligen välj en siffra! " << endl; } else if (gissa > tal) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED); cout << "f\x94r h\x94gt!" << endl; rakna=rakna+1; } else if (gissa < tal) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE); cout << "f\x94r l\x86gt!" << endl; rakna=rakna+1; } else { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN); cout << "Gratts!!!! Du gissade r\x84tt!" << endl; goto end; }

den säger att jag ska skriva in en siffra ibland, fast jag gjort det, och hamnar ändå i en loop om jag skriver en bokstav...
jag kör med Dev-C++.

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av RAMPKORV

if(!isdigit(gissa)) printf("Välj en siffra.");

isdigit() är ett makro som finns definierat i ctype.h

Hmm, det är definerat i type.h eller i ctype.

type.h i C, ctype i C++.

Mechatronic: Vad menar du? Fungerar den ibland eller aldrig?

EDIT: Eller så kanske det var ctype.h i C?

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem

jag kan skriva siffror mellan 47 och 55 utan att den säger "vänligen skriv en siffra".
och den hamnar alltid i en loop om jag skriver en bokstav. utom om jag skriver den det första jag gör. då avslutas programmet på en gång.

den vill bara kompilera om jag skriver
#include "ctype.h"

Permalänk
Medlem

isdigit() tar en char om inte jag minns fel! Och vad är gissa för en typ? pekare till char, kanske? Eftersom du vill att man ska kunna mata in ett siffervärde > 9 så måste kollen göras på annat sätt! Exempelvis genom att stega igenom din gissa array och för varje char kolla om det är en digit!

Men eftersom du inte visar koden där du deklarerar gissa så är det svårt att ge mer hjälp eftersom jag bara gissar hur din deklaration ser ut!

Visa signatur

5D MkII

Permalänk
Medlem

ok.
"gissa" är en int.

funkar bara isdigit() på siffror som är 9 eller lägre?

här kommer hela koden... jag ville inte posta hela för att det är pinsamt med goto och grejjer
men jag är nybörjare.

// Hej! // Jag har följt en tutorial på http://blinkenlights.se/ // och av det jag fick lära mig där gjorde jag ett enkelt spel. // Ha det bra och ta det lugnt! // /Wilhelm #include <stdio.h> #include <iostream> #include <string> #include <windows.h> #include "time.h" #include "ctype.h" using std::cout; using std::cin; using std::srand; using std::rand; int main () { cout <<" ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» " << endl; cout <<" º Gissa Talet! ºÛ " << endl; cout <<" º "; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN); cout << "Created by Wilhelm"; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); cout << " ºÛ² " << endl; cout <<" ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ۲ " << endl; cout <<" ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ² " << endl; cout <<" ²²²²²²²²²²²²²²²²²²²²² " << endl; cout << ""<< endl; srand(time(0)); int iSlumptal; int tal; int gissa; int rakna = 1; iSlumptal = rand() / (RAND_MAX / 100 + 1) + 1; cout << "Nu t\x84nker jag p\x86 ett tal mellan 1 och 100, kan du gissa vilket? " << endl; //cout << iSlumptal << endl; tal = iSlumptal; start: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); cout << "gissa talet: "; cin >> gissa; if(!isdigit(gissa)) { cout << "V\x84nligen välj en siffra! " << endl; } else if (gissa > tal) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED); cout << "f\x94r h\x94gt!" << endl; rakna=rakna+1; } else if (gissa < tal) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE); cout << "f\x94r l\x86gt!" << endl; rakna=rakna+1; } else { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN); cout << "Gratts!!!! Du gissade r\x84tt!" << endl; goto end; } goto start; end: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); cout << "Du gissade " << rakna << " g\x86nger"; if (rakna >= 8 ) { cout << ", det var asd\x86ligt!" << endl; } else if (rakna <= 4 ) { cout << ", det var duktigt!" << endl; } else { cout << ", det var halvbra!" << endl; } system("pause"); return 0; }

Permalänk
Medlem

löser nog inte problemet, men varför skifta mellan islumptal och tal, verkar onödigt.
sen skulle jag ha använt en while loop istället för goto och en switchcase istället för if för att göra det hela enklare. Dock är jag också nybörjare så det kanske inte är världens bästa tips.

Visa signatur

In murphy we trust, his law never fails.

Permalänk
Medlem

Jag vet inte exakt hur det här med slumptal funkar.. men jag tyckte det kändes säkrast att skifta till tal ifall islumptal skulle ändras medans man höll på...
kanske var tokigt tänkt.. men det kändes logiskt när jag skrev det

Permalänk
Medlem

ycker att det är galet mycket kod. Räcker med att du använder srand(time(0)) en gång och sen sätt variablen till att få slumptal av rand. Sen borde det hela väll gå att lösa med en whileloop och tre if satser. En för att kontrollera om det är en sifra elelr text, en för om det är högre och en för lägre. Eller är jag för trött nu?

Visa signatur

"Obay your leader"

Permalänk
Medlem

En sak bara.. Du nämnde att du använder "goto" då och då.. När jag pluggade programmering i skolan så sa de att man skulle undvika goto-kommandot,
då det blir väldigt svårt att felsöka om något blir fel..
Är lätt att tappa bort sig i koden då, alltså var man befinner sig när
felet uppstår..
Som Aendy sa, använd en whilesats istället..

Visa signatur

WS: Mac Studio M1 Max | 32 GB | 1TB | Mac OS
WS: Intel i5 12600K | 64 GB DDR4 @3600 Mhz | 2x1TB nvme 2x1TB SSD SATA | Windows 11 & Manjaro Linux
Bärbar: Macbook Pro 14" | M1 Pro | 16GB RAM | 512GB SSD | Mac OS
Servrar: Intel i7 10700K | 64 GB DDR4 @3600Mhz | 3 TB SSD + 22TB HDD | Unraid |
4x Raspberry pi 4b 8Gb | Dietpi |

Permalänk
Medlem

goto i C/C++ är något man definitivt vill undvika. I få fall är det motiverat och tom nödvändigt men i övriga fall har man tänkt fel om man måste använda dem.

Vill du använda goto finns gamla Basic för ändamålet Eller assembler

Måste du använda C++? Annars finns andra språk som du kan få jobbet gjort på med mindre huvudbry

Permalänk
Medlem

jag måste inte använda C++, men jag vill
Programmet får vara som det är nu. jag går vidare till nästa projekt.
men jag tycker det är lite synd att det ska bugga ur om man skriver en bokstav.

Permalänk
Hedersmedlem

Istället för goto hade jag nog valt funktioner.

Men men, vi har alla varit nybörjare en gång, men goto har jag aldrig använt.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.