En noob i nød

Tags:    c++

<< < 12 > >>
Hey allesammen.
Jeg startede for ikke så lang tid siden med C++, og jeg valgte det hurtigt som favorit, så jeg ville lave et program, hvor man skulle gætte et random tal.

Jeg har "fremtryllet" det her program delvis ved at kigge efter ex. Jackpot i Dev-Cpp, og ved at læse nybegynder artiklerne.

#include <iostream>
using namespace std;

int max1, max2, max3, svar, tal;

void Spm1();
void Spm2();
void Spm3();

void Spm1() {
max1 = 10;
tal = rand() % max1;
cout << "Første spørgsmål. Tal fra 0-10: ";
cin >> svar;
if ((svar>max1) || (svar<0)) {
cout << "I mellem 0 og 10\\n\\n";
Spm1();
}
if (svar==tal) {
cout << "Bravo. Nu til level 2.\\n\\n";
Spm2();
}
else if (svar>tal) {
cout << "For stort\\n\\n";
Spm1();
}
else if (svar<tal) {
cout << "For lille\\n\\n";
Spm1();
}
}

void Spm2() {
max2 = 20;
tal = rand() % max2;
cout << "Andet spørgsmål. Tal fra 0-20: ";
cin >> svar;
if ((svar>max2) || (svar<0)) {
cout << "I mellem 0 og 20\\n\\n";
Spm2();
}
if (svar==tal) {
cout << "Bravo. Nu til level 3.\\n\\n";
Spm3();
}
else if (svar>tal) {
cout << "For stort\\n\\n";
Spm2();
}
else if (svar<tal) {
cout << "For lille\\n\\n";
Spm2();
}
}

void Spm3() {
max3 = 30;
tal = rand() % max3;
cout << "Tredje spørgsmål. Tal fra 0-30: ";
cin >> svar;
if ((svar>max3) || (svar<0)) {
cout << "I mellem 0 og 30\\n\\n";
Spm3();
}
if (svar==tal) {
cout << "Bravo. Nu er du færdig.\\n";
system("PAUSE");
}
else if (svar>tal) {
cout << "For stort\\n\\n";
Spm3();
}
else if (svar<tal) {
cout << "For lille\\n\\n";
Spm3();
}
}

int main() {
cout << "V. 1.0" << endl;
cout << "Du skal gætte hvilket tal computeren tænker på." << endl;
cout << "Først vil det være fra 0-10, så 0-20 og til sidst 0-30." << endl;
cout << "Programmet vil fortælle om tallet er for højt eller lavt" << endl;
cout << "Good luck. SpliT\\n\\n";
Spm1();
return 0;
}

Som sagt. Ved at kigge efter og ved at læse artkikler.

Problemet er at hvis man gætter forkert skal man have den samme sværhedsgrad, men tallet skal være det samme!
Det må da være muligt!

Og fandt ud af at man ikke kan have æøå med, så er der ikke ligesom i HTML noget man kan skrive i stedet?

Please lad vær at grin, og please skriv noget JEG kan forstå :P

SpliT

PS: Første nye emne på udvikleren.dk så bær over med mig!



Hey allesammen.
Jeg startede for ikke så lang tid siden med C++, og jeg valgte det hurtigt som favorit, så jeg ville lave et program, hvor man skulle gætte et random tal.

Jeg har "fremtryllet" det her program delvis ved at kigge efter ex. Jackpot i Dev-Cpp, og ved at læse nybegynder artiklerne.

#include <iostream>
using namespace std;

int max1, max2, max3, svar, tal;

void Spm1();
void Spm2();
void Spm3();

void Spm1() {
max1 = 10;
tal = rand() % max1;
cout << "Første spørgsmål. Tal fra 0-10: ";
cin >> svar;
if ((svar>max1) || (svar<0)) {
cout << "I mellem 0 og 10\\n\\n";
Spm1();
}
if (svar==tal) {
cout << "Bravo. Nu til level 2.\\n\\n";
Spm2();
}
else if (svar>tal) {
cout << "For stort\\n\\n";
Spm1();
}
else if (svar<tal) {
cout << "For lille\\n\\n";
Spm1();
}
}

void Spm2() {
max2 = 20;
tal = rand() % max2;
cout << "Andet spørgsmål. Tal fra 0-20: ";
cin >> svar;
if ((svar>max2) || (svar<0)) {
cout << "I mellem 0 og 20\\n\\n";
Spm2();
}
if (svar==tal) {
cout << "Bravo. Nu til level 3.\\n\\n";
Spm3();
}
else if (svar>tal) {
cout << "For stort\\n\\n";
Spm2();
}
else if (svar<tal) {
cout << "For lille\\n\\n";
Spm2();
}
}

void Spm3() {
max3 = 30;
tal = rand() % max3;
cout << "Tredje spørgsmål. Tal fra 0-30: ";
cin >> svar;
if ((svar>max3) || (svar<0)) {
cout << "I mellem 0 og 30\\n\\n";
Spm3();
}
if (svar==tal) {
cout << "Bravo. Nu er du færdig.\\n";
system("PAUSE");
}
else if (svar>tal) {
cout << "For stort\\n\\n";
Spm3();
}
else if (svar<tal) {
cout << "For lille\\n\\n";
Spm3();
}
}

int main() {
cout << "V. 1.0" << endl;
cout << "Du skal gætte hvilket tal computeren tænker på." << endl;
cout << "Først vil det være fra 0-10, så 0-20 og til sidst 0-30." << endl;
cout << "Programmet vil fortælle om tallet er for højt eller lavt" << endl;
cout << "Good luck. SpliT\\n\\n";
Spm1();
return 0;
}

Som sagt. Ved at kigge efter og ved at læse artkikler.

Problemet er at hvis man gætter forkert skal man have den samme sværhedsgrad, men tallet skal være det samme!
Det må da være muligt!

Og fandt ud af at man ikke kan have æøå med, så er der ikke ligesom i HTML noget man kan skrive i stedet?

Please lad vær at grin, og please skriv noget JEG kan forstå :P

SpliT

PS: Første nye emne på udvikleren.dk så bær over med mig!

Det bedste ville nok være at bruge et loop hvis du ved hvad det er, men hvis det skal være noget lignende dette eksempel kan du lave en variabel til hver spørgsmål altså erstatte tal med tal1,tal2,tal3 og erstatte:
Fold kodeboks ind/udKode 

med
Fold kodeboks ind/udKode 

Så skal tal1 så være deklæret, du skal så gøre det samme i de andre funktioner. "if(!tal1)" tester om tal1 IKKE er sat til noget og det er det jo ikke før du har været en gang i if statementet.

Spm1 med while loop:
Fold kodeboks ind/udKode 

Bare sig hvis du skal have forklaring

[Redigeret d. 20/08-04 14:01:58 af Rasmus(KOEN)]



Eksempel:
Fold kodeboks ind/udKode 

Hvis du ikke hved det bliver alt til højre for // ignoreret
æ ø og å kan du indsætte ved at skrive deres ascii værdi og lave til char eksempel:
cout <<(char)145<<"=ae";



Ascii værdier kan ses her:
http://www.cdrummond.qc.ca/cegep/informat/Professeurs/Alain/files/ascii.htm
Hvis den går ned eller noget så bare søg efter ascii table på google.



Eksempel:
Fold kodeboks ind/udKode 

Hvis du ikke hved det bliver alt til højre for // ignoreret
æ ø og å kan du indsætte ved at skrive deres ascii værdi og lave til char eksempel:
cout <<(char)145<<"=ae";


I level 2 og 3 skal
Fold kodeboks ind/udKode 


erstattes med = 20 og = 30? (I max2/3)

Og de der special tegn. Forklar lidt nærmere. Har fundet
dem, men hvordan skal de skrives?
Skær ud i pap :]



Man starter med at inkludere ligesom du selv gjorde
#include <iostream>
using namespace std;

Så sætter vi variablerne
har ændret fra eksempelet så vi
igen kun har tal og ikke tal1,tal2 og tal3
grunden til vi kan det er ændringen vi har lavet
i det første if statement i starten af alle
Spm? funktionerne

int max1, max2, max3, svar,tal;

Her er så prototyperne
void Spm1();
void Spm2();
void Spm3();

level1
void Spm1() {

if(!max1) betyder at den skal gå ind i if strukture
hvis max1 ikke er sat til noget endnu altså hvis max1
er 0 i det andet eksempel skrev jeg "if(!tal1)", men
0 kan jeg godt blive tilfædigt trukket af rand funktionen.
if(!max1)
er det samme som at skrive
if(max1==0)

if(!max1)
{

her sætter vi variablerne som du også satte
max1 = 10;
tal = rand() % max1;
}

Skriver til brugeren og får et tal

cout << "Første spørgsmål. Tal fra 0-10: ";
cin >> svar;

hvis svaret er for stort eller lille skriver vi en fejlmeddelse

if ((svar>max1) || (svar<0)) {
cout << "I mellem 0 og 10\\n\\n";
Spm1();
}

Hvis svaret er rigtigt går vi til spørgsmål 2

if (svar==tal) {
cout << "Bravo. Nu til level 2.\\n\\n";
Spm2();
}

tester om talet er for lille eller stort

else if (svar>tal) {
cout << "For stort\\n\\n";
Spm1();
}
else if (svar<tal) {
cout << "For lille\\n\\n";
Spm1();
}
}

Spm2 er det samme som Spm1, men bare med en max på 20
det samme med Spm3 bare med max på 30

void Spm2() {
if(!max2)
{
max2 = 20;
tal = rand() % max2;
}
cout << "Andet spørgsmål. Tal fra 0-20: ";
cin >> svar;
if ((svar>max2) || (svar<0)) {
cout << "I mellem 0 og 20\\n\\n";
Spm2();
}
if (svar==tal) {
cout << "Bravo. Nu til level 3.\\n\\n";
Spm3();
}
else if (svar>tal) {
cout << "For stort\\n\\n";
Spm2();
}
else if (svar<tal) {
cout << "For lille\\n\\n";
Spm2();
}
}

void Spm3() {
if(!max3)
{
max3 = 10;
tal = rand() % max3;
}
cout << "Tredje spørgsmål. Tal fra 0-30: ";
cin >> svar;
if ((svar>max3) || (svar<0)) {
cout << "I mellem 0 og 30\\n\\n";
Spm3();
}
if (svar==tal) {
cout << "Bravo. Nu er du færdig.\\n";
system("PAUSE");
}
else if (svar>tal) {
cout << "For stort\\n\\n";
Spm3();
}
else if (svar<tal) {
cout << "For lille\\n\\n";
Spm3();
}
}

int main() {
cout << "V. 1.0" << endl;
cout << "Du skal gætte hvilket tal computeren tænker på." << endl;
cout << "Først vil det være fra 0-10, så 0-20 og til sidst 0-30." << endl;
cout << "Programmet vil fortælle om tallet er for højt eller lavt" << endl;
cout << "Good luck. SpliT\\n\\n";
Spm1();
return 0;
}

Der er nu rimelig meget forklaring (syntes jeg) på hvis det er en bestemt ting du skal have forklaret så skriv lige, det med at max2 og max3 var 10 var en fejl fra min side fordi jeg lavede lidt copy-paste og glemte at ændre det.




Og det med æ,ø og å hvis man skal skrive en af dem skal man skrive deres "værdi" æ=145, Æ=146, å=134, Å=143,ø=155,Ø=157. Det man så gør er at man skriver værdien efter (char) fx:
cout << (char)155;
det vil give et ø, det man gør er at lave 155 om til bogstav, prøv fx at skrive:
cout << (int)a;
så vil du få a's værdi. Husk at store og små bogstaver har forskellig værdi, værdierne kan man se på en masse hjemmesider prøv fx
http://www.asciitable.com, men der mangler 1 tegn(ø/155).



Man starter med at inkludere ligesom du selv gjorde...
Der er nu rimelig meget forklaring (syntes jeg) på hvis det er en bestemt ting du skal have forklaret så skriv lige, det med at max2 og max3 var 10 var en fejl fra min side fordi jeg lavede lidt copy-paste og glemte at ændre det.


Ja tusind tak for forklaringen, nu forstår jeg 100%, men det var ikke lige det jeg mente. Det var det med æøå.
Men tak alligevel, det var det værd!

- Lol, havde ikke lige set det andet indlæg!

- Har kun lige lavet første linje om, men nu melder den fejl.. (Dumme windows)

- Hmm. Der kommer ikke nogen fejl hvis jeg fjerner det der
Fold kodeboks ind/udKode 


Originalt:

Fold kodeboks ind/udKode 


[Redigeret d. 20/08-04 15:41:09 af Daniel Cramer]




- Hmm. Der kommer ikke nogen fejl hvis jeg fjerner det der
Fold kodeboks ind/udKode 


Nej, men både max1,max2,max3 og tal vil altid være 0 husk også lige at bruge srand() istarten af programmet(main), kig i FAQ->Hvordan bruger jeg rand() eller sådan noget ellers vil du få de samme tal hver gang.



Du skal sætte 'max2' inden du kalder Spm1().
Det der sker her (i starten af Spm1()):
tal = rand() % max2;

...er at du dividerer med 'max2' som ikke er blevet initialiseret og derfor 0. Altså en division med 0 og den går ikke.
Det du ville gøre var sikkert:
tal = rand() % max1;

Så virker det i hvert fald.

Et andet problem er tilfældighed. Tilfældighedsgeneratoren er en tilstandsmaskine som ud fra sin tilstand genererer en ny tilstand og et tilfældigt tal. Men hver gang du starter programmet er tilstanden den samme og det vil derfor være den samme sekvens af tilfældige tal, som bliver genereret. Tilføj følgende i starten af filen:
#include <ctime>
#include <cstdlib>

...og følgende i starten af main():
srand(time(NULL));

Så bliver tallene tilfældige.
Og så er der selvfølgelig din brug af rekursion (funktioner som kalder sig selv) i stedet for at bruge loops, men det lærer du nok når du når så langt.
Held og lykke.




if(!max1)
er det samme som at skrive
if(max1==0)


Nej.
if(!max1)
er det samme som at skrive
if(max1 != 0)



<< < 12 > >>
t