CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C]prog. simple, mais où est l'erreur?

Merodrem
Merodrem
Niveau 10
21 novembre 2007 à 17:05:32

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:

  1. include <stdio.h>
  2. include <stdlib.h>
  3. include <time.h>

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 :fou:

-------------------------------------------------

"L´horreur est humaine."
Roi Merodrem, lors des guerres milanaises
:sournois:

godrik
godrik
Niveau 30
21 novembre 2007 à 17:09:31

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!");

Chaos_Clad
Chaos_Clad
Niveau 10
21 novembre 2007 à 17:10:29

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.

sangohan55
sangohan55
Niveau 10
21 novembre 2007 à 17:42:49

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

Merodrem
Merodrem
Niveau 10
21 novembre 2007 à 20:58:01

"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"
:d) 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) ". "

:d) 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. "

:d) c´est vrai, pourant je m´y retrouve mieux avec les accolades :-)

"scanf ("%ld", nombreHasard);

scanf() attend une adresse ... "

:d) 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 "

:d) 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 :snif2:

"Tu peut enlever les paramètres de main()
"

:d) 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

Chaos_Clad
Chaos_Clad
Niveau 10
21 novembre 2007 à 21:08:30

"Manque une accolade pour fermer le else là. En plus il doit te le dire"
:d) non, avec un do...while, le while se place derrière l´accolade du else"

:d) Non, et c´est pourtant évident.
do
{
...
}while(...);

"En " (difficulte > 0) && (difficulte < 5) ". "

:d) non plus :)"

:d) 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?"

:d) 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:"

:d) 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.

Merodrem
Merodrem
Niveau 10
21 novembre 2007 à 21:24:43

"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
:sournois:

Chaos_Clad
Chaos_Clad
Niveau 10
21 novembre 2007 à 21:29:04

Regarde ça : scanf ("%ld", &difficulte);.

naruto_forever
naruto_forever
Niveau 10
22 novembre 2007 à 18:50:27

"enfaite, il faut aussi mettre || à la place de && je crois :( "
Va réviser tes cours :-)))

Merodrem
Merodrem
Niveau 10
22 novembre 2007 à 19:55:28

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 && :ok:

-------------------------------------------------

"L´horreur est humaine."
Roi Merodrem, lors des guerres milanaises
:sournois:

Merodrem
Merodrem
Niveau 10
22 novembre 2007 à 20:31:53

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 :fete:

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?

Chaos_Clad
Chaos_Clad
Niveau 10
22 novembre 2007 à 23:51:04

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 :o)) ).
On te l´a dit en plus :(

Tu as oublié un break au case 3 (par contre au niveau du default il est inutile).

guyver2
guyver2
Niveau 10
23 novembre 2007 à 01:52:10

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

Chaos_Clad
Chaos_Clad
Niveau 10
23 novembre 2007 à 02:28:23

Je parlais du break situé dans le default, pas du default lui-même ^^

guyver2
guyver2
Niveau 10
23 novembre 2007 à 12:02:40

arf désolé :(

Merodrem
Merodrem
Niveau 10
23 novembre 2007 à 17:19:40

aaaaaaaaaaaaaaaaaaah pas possible, je suis con :rire:
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... :honte: pas possible de se planter avec un programme aussi simple :rire2:

maintenant tout marche à la perfection, merci!

ps: merci aussi pour le break, simple oubli

-------------------------------------------------

"L´horreur est humaine."
Roi Merodrem, lors des guerres milanaises
:sournois:

Chaos_Clad
Chaos_Clad
Niveau 10
23 novembre 2007 à 19:28:56

pas possible de se planter avec un programme aussi simple

:d) 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 :o))

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment