En C: l'instruction if

shryke2a Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -  
Char Snipeur Messages postés 10112 Statut Contributeur -
Bonjour,
Je commence à programmer en C et j'ai déjà un programme en tête, je le connais bien l'ayant déja réalisé en TI basic (calculettes de lycée).
Ce programme est un petit jeu simple où il faut deviner un chiffre (il n'est pas fini il me manque encore quelques instructions notamment les boucles et le chiffre au hasard).
je poste le contenu du programme:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int nbr, prop, difficult, tour ; /*déclaration de varibles: nbr sera a deviner, prop à entrer pour deviner, difficult fixera la limite supérieure de nbr et tour enregistrera le nombre de tour avant victoire*/
printf ("Enter your difficulty level, between 100 and infinite \n") ;
scanf ("%d", &difficult) ; /*ici l'utilisateur entre la limite supérieure de la variable nbr*/
/*ajouter ici le chiffre au hasard (variable nbr) puis la boucle*/
printf ("try to guess the number between 1 and %d \n", difficult) ;
scanf ("%d", &prop) ; /*ici l'utilistateur tente de deviner le chiffre*/
/*insérer les "if" sans oublier les boucles*/
if ( prop < nbr ) /*Ici les caractéres "{" et "}" servent à délimiter la fonction "if" car elle contient plusieurs instructions: on appelle ça un bloc*/
{ printf ("too little, try a bigger number !! \n") ;
tour = tour + 1 ;
/*ne pas oublier la boucle!!*/
}
if ( prop > nbr )
{ printf ("too big, try a tinyer number! /n") ;
tour = tour + 1 ;
/* la boucle */
}
if ( prop = nbr )
{ printf ( "Congratulation! You won! the number was %d /n", nbr ) ;
tour = tour + 1 ;
printf ( " You tried %d time before guessing!", tour ) ;
system("PAUSE") ;
return 0 ; }

voila (il est rédigé en anglais :D ).
J'ai 2 problèmes:
-Il me faut une instruction pour faire un nombre au hasard, entre 1 et la variable "difficult".
-ça tient peut être au fait que je n'ai pas encore mis les boucles mais le programme me signale toujours la dernière ligne comme une erreur (peut on enchainer les fonctions "if" comme je l'ai fait? En TI basic sa marche, en C je ne sais pas.
Merci beaucoup

10 réponses

Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
Salut.
Je te conseillerai tout de même avant toute chose de prendre un cour de C et de le lire.
pour les variables aléatoire, il exiset une fonction, rand(). si tu veux de l'aide sur une fonction quelconque en C, tape "man fonction" sur un moteur de recherche internet, tu devrais trouver dans les premiers résultats la documentation de la fonction.
if ( prop = nbr )
je pense que tu veux dire
if ( prop == nbr )
qui est le test booléen
Pas de problème avec les if, à part qu'il manque une accolade fermante pour le dernier.
à l'avenir, utilise les balises de code (à droite de souligner) pour mettre du code, c'est plus lisible.
0
shryke2a Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Merci (oui je me suis rendu compte de mon erreur moi aussi concernant le test booléen) mais qu'est ce que tu appelle les balises de code? Et enfin j'ai essayé "rand ()" mais je n'arrive pas à fixer les limites supérieures et inférieures au nombre... J'ai essayé entre les parenthése mais comment séparer la inférieure de la supérieure... Bref je débute :)
Edit: j'ai trouvé les balises de code merci je m'en servirais
0
Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
Je t'ai donné l'astuce à connaître pour utiliser une fonction, à toi de l'utiliser. Ensuite, utilise ton cerveau pour modifier la sortie de manière à avoir l'intervalle de ton choix.
0
shryke2a Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Je n'ai jamais pus supporter la "man" (elle me donne de l'urtiquaire) et c'est trop souvent man (oups mal) fichu pour les débutants...
Par exemple: "La fonction random() renvoie une valeur entre 0 et RAND_MAX."
Trés bien mais qu'est ce que RAND_MAX? Une variable? Un sac à dos?
Selon moi, et je demande confirmation pour ne pas me tromper, je devrais créer une variable RAND_MAX (qui remplacera ma variable "difficult" qui avait le même but). Ensuite, comment placer la valeur crée par "rand ()" dans ma variable "nbr" L'instruction
nbr = rand () ;
marche t elle?
Tout ceci n'est pas dit dans man, ce qui me pousse à préférer les forums et groupes de discussion
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
shryke2a Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Et en fin derniére question, les instructions:
system("PAUSE") ;
return 0 ;
doivent être placées dans le bloc de la dernière fonction "if" (celle qui n'est pas reliée par une boucle puisqu'elle conclut le jeu) ou en dehors?
0
Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
Il te manque vraiment les bases...
Il n'y a pas de raison pour que nbr = rand () ; ne soit pas valide.
NOM
       rand, srand - Générateur de nombres aléatoires. // c'est le nom et une breve description de ce que fait la fonction

SYNOPSIS
       #include <stdlib.h> //indique l'en-tête qu'il faut inclure pour utiliser la fonction

       int rand (void);   // prototype de la fonction, tu sais alors que rand ne prend pas d'argument et retourne un entier.

       void srand (unsigned int seed);

RAND_MAX, est un mot en majuscule, il y a donc toutes les chances pour que ça soit une macro (#define) défini dans l'en-tête stdlib.h. En C la convention est de nommer en majuscules les macros.
Donc, rand() génère un nombre entre 0 et RAND_MAX, c'est tout, si tu change RANDMAX, ça ne changera pas la fonction, RAND_MAX est une variable qui peut être susceptible de changer dans le temps et les distribution, c'est pour ça qu'on la remplace par un mot, RAND_MAX a juste valeur d'alias, d'aide pas de définition de la fonction rand().
http://www.linux-france.org/article/man-fr/man3/rand-3.html
Il est expliqué dans le man comment modifier les bornes du nombre aléatoire !
Pour le return, tu peux faire comme tu veux, mais penses que si ta condition du if n'est pas vérifié il n'y aura alors pas de return à la fonction main().
0
shryke2a Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Oui mais je ne veux pas entre 0 et RAND_MAX mais entre 1 et RAND_MAX... Il n'y a aucune fonction de type "random number (1-100)" ? SI ça existe dans un language aussi simple que le TI basic ça doit exister en C? ça serait pour moi une insulte au bon sens ou a la facilité...
0
Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
heu...
http://www.linux-france.org/article/man-fr/man3/rand-3.html
encore et encore ! il y a un exemple pour les nombres de 1 à 10, il suffit d'adapter à ton cas.
Il n'y a pas de fonction comme tu dis, à ma connaissance. Il faut dire que c'est tellement simple à réaliser...
Il y a tellement de manière de vouloir tirer des nombres aléatoires. Tu peux vouloir des reels, des entiers naturels, des entiers relatifs, avec des bornes très différentes. Tu pourrais aussi vouloir modifier la distribution, passer à une distribution type gaussienne, ou log-normale etc. et tout ceci peut se réaliser simplement à partir du générateur pseudo-aléatoire rand().
0
shryke2a Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Bon,
D'accord mais donner une valeur à une macro?
Puis je faire:
RAND_MAX = difficult ;
Ou l'utiliser directement comme une variable avec un "scanf"?
0
Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
Non, c'est ce que je t'expliquait, ça ne sert à rien de modifier RAND_MAX, et en plus tu ne peux pas.
Il faut bien voir qu'une macro c'est un pré-traitement, c'est à dire une transformation du texte avant compilation.
Si tu écris #define FRO 45 ça remplace le texte "FRO" par 45 dans le fichier.
Si tu as :
int a=sin(FRO);
le compilateur aura pour de vrai
int a=sin(45);
Donc, si tu fais
FRO=25;
le compilateur voi :
45=25;
et génère une erreur. Je ne comprends pas ton obstination à ne pas vouloir utiliser la technique du man.
Pourtant, c'est simple, sans conversion de type :
random entre xmin et xmax, c'est : (rand()/RAND_MAX)*(xmax-xmin)+xmin
0