Salut à tous!
Voilà, j´ai commencé récement à étudier le language C, et j´ai décidé de faire un petit programme console "test" pour vérifier si j´avais bien assimilé les boucles et les conditions. ce programme choisit un nombre au hasard, puis l´utilisateur dois le découvrir. Il doit essaier un nombre au hasard, et la console lui dis si c´est trop ou pas assez.
Mais voilà (attention
), Dev-C++ refuse de compiler mon code!
où est l´erreur?
le code:
int main ( int argc, char** argv )
{
{
printf (" *PLUS*OU*MOINS*\n");
printf ("BIENVENUE SUR *PLUS OU MOINS*, LE BUT DE CE JEU EST DE DECOUVRIR LE NOMBRE\nMYSTERE! \n\n");
int rejouer = 1;
while (rejouer)
{
printf (" \nchoisissez le niveau de difficulte en inserant le numero correspondant:\n");
printf (" 1. nombre entre 1 et 10\n 2. nombre entre 1 et 100\n 3. nombre entre 1 et 1000\n 4. nombre entre 1 et 10000");
long difficulte = 0;
long nombreMystere = 0;
do
{
scanf ("%ld", &difficulte);
if (difficulte == 1)
{
const long MAX = 10, MIN = 1;
srand(time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
}
else if (difficulte == 2)
{
const long MAX = 100, MIN = 1;
srand(time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
}
else if (difficulte == 3)
{
const long MAX = 1000, MIN = 1;
srand(time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
}
else if (difficulte == 4)
{
const long MAX = 10000, MIN = 1;
srand(time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
}
else
{
printf ("je sais pas si c´était volontaire ou non, mais ton nombre est invalide!");
} while ( difficulte != 1 || difficulte != 2 || difficulte != 3 || difficulte != 4);
long nombreHasard = 0;
do
{
printf ("inserez un nombre: ");
scanf ("%ld", nombreHasard);
if ( nombreHasard < nombreMystere )
{
printf ("Et non, le nombre est plus grand!^^");
}
else if ( nombreHasard > nombreMystere )
{
printf ("Tu es trop haut la, c´est moins!");
}
else
{
printf ("bravo! tu as trouvé le fameux nombre!");
}while ( nombreHasard != nombreMystere );
printf (" appuiez sur 0 pour arrêter et sur 1 ou plus pour recomencer: ");
scanf ("%ld", &rejouer);
}
system("PAUSE");
return 0;
}
cette histoire me rends
-------------------------------------------------
"L´horreur est humaine."
Roi Merodrem, lors des guerres milanaises
![]()
tu aurais du décrire ton probleme.
En l´occurence, il manque une accolade fermante au else printf ("bravo! tu as trouvé le fameux nombre!");
Pense à fournir l´erreur fournie par le compilateur la prochaine fois. Toutefois :
else
{
printf ("bravo! tu as trouvé le fameux nombre!");
}while ( nombreHasard != nombreMystere );
Manque une accolade pour fermer le else là. En plus il doit te le dire : "Missing } before nia nia nia".
Tu peux abréger ça :
"difficulte != 1 || difficulte != 2 || difficulte != 3 || difficulte != 4"
En " (difficulte > 0) && (difficulte < 5) ".
Pense aussi que si ton if (ou else if ou else) n´est suivi que d´une instruction, les accolades sont facultatives.
scanf ("%ld", nombreHasard);
scanf() attend une adresse ...
Ne met jamais srand() dans une boucle
ne déclare pas tes variables dans une boucle
Tu peut enlever les paramètres de main()
utilise un switch, comme ça tu peut plus facilement gerée les bavures, ( avec default: )
la prochaine fois poste ton code ici :
http://rafb.net/paste
"else
{
printf ("bravo! tu as trouvé le fameux nombre!");
}while ( nombreHasard != nombreMystere );
Manque une accolade pour fermer le else là. En plus il doit te le dire"
non, avec un do...while, le while se place derrière l´accolade du else. D´ailleurs, il ne me le signale pas! tout ce qu´on me dit quand j´essaie de complier, c´est "erreur de sintax avec system" (tout en bas de mon programme)
"Tu peux abréger ça :
"difficulte != 1 || difficulte != 2 || difficulte != 3 || difficulte != 4"
En " (difficulte > 0) && (difficulte < 5) ". "
non plus
car si je demande ça, ca veut dire que ma boucle devra se répeter tant que difficulte est compri entre 1 et 4! or c´est le contraire, le choix du niveau doix se répéter tant que l´utilisateur ne choisis pas un nombre correct.
"Pense aussi que si ton if (ou else if ou else) n´est suivi que d´une instruction, les accolades sont facultatives. "
c´est vrai, pourant je m´y retrouve mieux avec les accolades
"scanf ("%ld", nombreHasard);
scanf() attend une adresse ... "
pas compris là
scanf attends que l´utilisateur définisse la variable "nombreHasard", non?
"Ne met jamais srand() dans une boucle
ne déclare pas tes variables dans une boucle "
srand, je dois le mettre où alors? parce que tout le programme est une boucle (avec ma variable booléene). Pour mes variables, je les ai regroupées hors de ma boucle pas ça ne change rien
"Tu peut enlever les paramètres de main()
"
quels paramètres?
"utilise un switch, comme ça tu peut plus facilement gerée les bavures, ( avec default: ) "
d´accord, mais je ne crois pas que ce soit ça qui fasse bugger mon programme.
comme vous me le demandez, je vais être plus clair: le compilateur me dit que la cause est une erreur de syntax dans la partie:
system("PAUSE");
return 0;
}
une solution?
-------------------------------------------------
"L´horreur est humaine."
Roi Merodrem, lors des guerres milanaises
"Manque une accolade pour fermer le else là. En plus il doit te le dire"
non, avec un do...while, le while se place derrière l´accolade du else"
Non, et c´est pourtant évident.
do
{
...
}while(...);
"En " (difficulte > 0) && (difficulte < 5) ". "
non plus
"
Certes, simple erreur d´inattention, il suffit juste d´inverser les signes, l´intêret est de gagner du temps en passant de sept contrôles logiques à seulement trois.
"scanf attends que l´utilisateur définisse la variable "nombreHasard", non?"
Oui, mais scanf prend comme paramètre L´ADRESSE de la variable et non pas la variable elle-même.
"le compilateur me dit que la cause est une erreur de syntax dans la partie:"
Il ne faut pas toujours se fier strictement à ce que dit le compilateur. Par exemple, si tu fais :
if(...)
{
instruction_1;
intruction_2;
else
{
instruction_3;
instruction_4; }
Le compilateur peut signaler une erreur ligne 8 alors qu´elle se situe ligne 4 (exemple fictif donc je sais pas du tout si ça fait exactement ça). En gros les erreurs de syntaxe peuvent se reporter l´une sur l´autre jusqu´à arriver à un endroit de ton programme qui n´a rien à voir avec la partie erronée.
"il suffit juste d´inverser les signes"
enfaite, il faut aussi mettre || à la place de && je crois ![]()
en gros ça donne ça:
while (difficulte < 0 || difficulte > 5);
et donc, qu´est-ce que je dois changer avec;
scanf ("%ld", nombreHasard);
?
-------------------------------------------------
"L´horreur est humaine."
Roi Merodrem, lors des guerres milanaises
![]()
Regarde ça : scanf ("%ld", &difficulte);.
"enfaite, il faut aussi mettre || à la place de && je crois
"
Va réviser tes cours ![]()
mais si!
regarde, la boucle doit se répéter tant que le nombre inscrit n´est pas 1,2,3 ou 4. Et si je note : (difficulte < 0) && (difficulte > 5)
ça voudrait dire que la boucle doit se répéter tant que "difficulte" est plus petite que 0 et plus grande que 5. mais un nombre ne peu pas être + grand que 5 et plus petit que 0 en même temps, c´est logique!
donc je maintiens, il faut mettre || et pas &&
-------------------------------------------------
"L´horreur est humaine."
Roi Merodrem, lors des guerres milanaises
![]()
BON, en tout cas on s´emmèle de plus en plus ici.
Enfaite, mon code était surtout très INSTRUCTURÉ.
je l´ai retapé un plus clair, et il y a progrès!
http://rafb.net/p/ORyoVA34.html
De plus, il se compile
le problème, c´est que la console se ferme après que j´aie noté le niveau de difficulté
où est l´embrouille cette fois?
scanf ("%ld", difficulte);
Une ADRESSE !! ! Il faut que tu indiques L´ADRESSE de la variable, qui se note &variable (ce qui est bizarre c´est que quelques lignes plus bas tu l´as tapé correctement
).
On te l´a dit en plus
Tu as oublié un break au case 3 (par contre au niveau du default il est inutile).
si le joueur tappe 5 (ou 0) alors la boucle quitte ...
il faut mettre
if ((difficulte < 1) || (difficulte > 4))
ou alors tu peux garder 0 et 5 mais en mettant >= et <=
et le default est bien utile, si le joueur entre 12, il recoit un message d´erreur
Je parlais du break situé dans le default, pas du default lui-même ^^
arf désolé ![]()
aaaaaaaaaaaaaaaaaaah pas possible, je suis con ![]()
Chaos_Clad: lol ça me semblait tellement évident de mettre un "&" avec le scanf que j´avais même pas réalisé que je ne l´avait pas mis! du coup je ne voyais pas où tu voulais en venir. alors quand tu m´a noté "scanf ("%ld", &difficulte);" je croyais que c´est ce que j´avais écris.
pffff quel débutant...
pas possible de se planter avec un programme aussi simple
maintenant tout marche à la perfection, merci!
ps: merci aussi pour le break, simple oubli
-------------------------------------------------
"L´horreur est humaine."
Roi Merodrem, lors des guerres milanaises
![]()
pas possible de se planter avec un programme aussi simple
Oh si, j´ai le souvenir d´avoir cherché pendant de longs moments des erreurs alors qu´il s´agissait d´une parenthèses au lieu d´une accolade... Bref, erreur chiante, bien faire gaffe à ce qu´on écrit quoi ![]()