Programmation » A peine je m'y mets que j'ai déjà des problèmes >.<...
Catégorie:  
Rappel du message précédent
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 09/09/2011 @ 16:31:38,
Par Pinou

int compareNombres (nombreEntre,nombreMystere)


C'est un peu vieux dans mon cerveau ramoli mais tu dois pas déclarer tes variables en C ???

Un truc du genre :
int compareNombres (int nombreEntre, int nombreMystere)
???


   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 09/09/2011 @ 18:04:46,
Par crodilus


C'est un peu vieux dans mon cerveau ramoli mais tu dois pas déclarer tes variables en C ???

Un truc du genre :
int compareNombres (int nombreEntre, int nombreMystere)
???


A vrai dire que je déclare la variable ou pas ça, lorsque j'introduis :

  1. printf("\nQuel est le nombre ? "); 
  2. scanf("%d", &nombreEntre);


dans la fonction main, j'ai toujours droit à un long défilé de c'est plus ou c'est moins :ohwell: !

Bon le programme marche lorsque je l'introduit dans la fonction genereNombre, c'est le plus important, mais ce genre de petites interrogations auxquelles je n'arrive pas à répondre me turlupine toujours :huit: !
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 09/09/2011 @ 18:36:35,
Par max
oui mais c'est normal, tu ne sortiras que quand le nombre généré vaudra zéro et que tu l'auras trouvé, c-a-d jamais vu que tu en génère un entre 1 et 100.

Pourquoi ?
tu fais deux boucles: une dans ta fonction pour trouver le nombre, afficher un message avec le nombre de coups utilisés, et renvoyer la valeur du dernier nombre entré.

La deuxième dans main(), tu appelles ta fonction dans une boucle et tu poses comme condition de sortie de boucle que ce nombre doit être égale à celui qui a été généré par genereNombre(). Outre le fait que cette deuxième boucle est inutile, tu oublies de sauver le retour de la fonction compareNombres() dans nombreMystere et comme tu l'as déclaré valoir zéro en début de programme....

Bref, vire cette deuxième boucle.


Sinon, j'ai trouvé 95 en 4 coups :smile:

Dernière édition: 09/09/2011 @ 18:40:16
Trololo
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 09/09/2011 @ 20:34:10,
Par crodilus
Outch :crazy: !! Ce n'est pas piqué des vers !!

Je vais encore relire quelque fois ta réponse pour être bien sur de l'avoir assimilée correctement !

Merci :clindoeil: !
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 09/09/2011 @ 20:48:23,
Par philfr
Alors:
1. Indente ton code. C'est une bonne habitude que tu ferais mieux de prendre depuis le début. Si en plus tu veux le faire relire par d'autres, c'est indispensable.
2. Le type int est le type par défaut des variables, des fonctions et de leurs arguments. Mais c'est un des laxismes du C qu'il aurait mieux valu ne pas garder, donc prends l'habitude de mettre un type à tout (dans ton cas, suis le conseil de Pinou).
3. À quoi te sert-il de passer nombreEntre en argument de ta fonction compareNombres ? C'est ton prochain exercice :wink:
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 09/09/2011 @ 21:16:21,
Par max
je reprends en mode rapide, on ingorera la fonction de comparaison

juste dans main():

1. nombreMystere vaut 0 et nombreEntre vaut 0
2. nombreMystere vaut un nombre compris entre 1 et 100
3. une boucle dure tant que 0 n'est pas égale à un nombre compris entre 1 et 100



ce n'est pas un problème de C mais de logique.

Dernière édition: 09/09/2011 @ 21:17:41
Trololo
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 10/09/2011 @ 08:26:15,
Par blietaer
Par rapport à ton post initial, as-tu choisi des études? :write:
maintenant que tu (nous) as prouvé tout ton acharnement et ta passion? :itm:
Et au besoin s'arrêter.
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 10/09/2011 @ 12:14:26,
Par crodilus
Alors:
3. À quoi te sert-il de passer nombreEntre en argument de ta fonction compareNombres ? C'est ton prochain exercice :wink:


A se que j'ai pu lire un argument : "Dans une programmation, un argument est un paramètre saisi à la main, comme dans un code source. L'argument, contrairement au paramètre, ne peut pas être changé ou récupéré."

Donc vu que j'ai initialiser mon nombreEntre en valeur 0 dans la fonction main et qu'après je le renvois comme argument dans la fonction genereNombre, elle le considera nul pour tout le reste de l'opération vu que c'est un argument ?


Par rapport à ton post initial, as-tu choisi des études? :write:
maintenant que tu (nous) as prouvé tout ton acharnement et ta passion? :itm:


Oui, je me suis inscrit en informatique de Gestion à l'IESCA qui fait partie de la HELHA.
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 10/09/2011 @ 15:22:18,
Par philfr
Je ne sais pas où tu as lu ce que tu dis des paramètres et arguments...

Quand tu définis ta fonction, tu définis ses paramètres:
  1. int compareNombres (int nombreEntre, int nombreMystere) 
  2.    /* blabla */ 
  3. }


Quand tu l'utilises tu lui passe des arguments:
  1.     // ... 
  2.     compareNombres(nombreEntre, nombreMystere); 
  3.     // ...


Rien ne t'oblige évidemment à ce qu'ils aient le même nom, puisque tu passes des valeurs et non des variables:
  1.     compareNombres(monNombre, sonNombre);

ou
  1.     compareNombres(510);

sont également corrects.

Ma question revenait à demander à quoi te servait de déclarer la variable nombreEntre dans ta fonction main, puis de la passer en argument à la fonction compareNombres, alors qu'elle ne sert à rien dans le contexte de main.

Ah, et ton do/while dans le main, il refait passer le quiz avec toujours la même valeur du nombre mystere :D.
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 10/09/2011 @ 17:05:22,
Par max
Prochain exercice: faire le programme sans boucle;

Mais après avoir compris pourquoi ça cloche ici et lu quelques chapitres supplémentaire de ton livre de programmation
Trololo
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 11/09/2011 @ 01:28:54,
Par crodilus
Ok merci, maintenant j'y vois plus clair entre paramètre et arguments !

Si je ne l'a déclare pas dans main il me met à la ligne 65 :

"error :'nombreEntre' undeclared (first use in this fonction)

c'est pour ça que je l'ai déclaré par la suite.

Sans boucle ? Je vais encore attendre un peu :ddr555: !

Peut-être serait-il intéressant que je vous écrive comment je conçois le fonctionnement du programme ?

1) Le programme rentre dans main

2) Il va rentrer dans la fonction générer nombre, le faire et renvoyer ce nombre dans main afin que nombreMystere ait cette valeur

3)Ensuite il affiche le premier printf

4) Il rentre dans la boucle do/while

5) Il rentre dans la fonction compareNombre

6) L'utilisateur inscrit le nombre et la fonction analyse si celui = le nombreMystere

7) Quand ceci est fait, il renvoie le résultat dans le do while de main

:sol: Le programme s'arrête quand nombreMystere = nombreEntre.
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 11/09/2011 @ 02:16:48,
Par max
4) inutile, tu fais déjà une boucle dans ta fonction compareNombre

7) nope, il ne renvoie rien du tout dans main(). C'est ce qu'on essaye de te dire subtilement depuis quelques message
(et le programme ne s’arrête donc pas.)


si tu veux ta boucle dans main(), ta fonction compareNombre() ne doit faire que comparer le nombre, afficher un message, renvoyé le nombre entré, tu mets un compteur dans cette boucle et tu affiche en sortie bravo, tu as fais x coup.
Trololo
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 11/09/2011 @ 11:31:50,
Par Olaf

Si je ne l'a déclare pas dans main il me met à la ligne 65 :

"error :'nombreEntre' undeclared (first use in this fonction)

c'est pour ça que je l'ai déclaré par la suite.


J'ai l'impression que tu confonds également deux notions, que sont la déclaration, et l'initialisation (pour les fonctions, il y a aussi la définition).

La déclaration identifie une variable ou une fonction. Exemple

int monEntier; // monEntier est une variable de type int
float* maFonction(int premierArg, int* secondArg); // maFonction prend 2 arguments, un entier et un pointeur vers un entier, et retourne un pointeur vers un flotant.


L'initialisation, c'est donner une valeur à cette variable lors de la déclaration, mais ce n'est pas obligatoire.


/*
* Utilisation sans initialisation
*/
int monEntier;
monEntier = generationEntier();
// ou encore
monEntier = 3;

/*
* Utilisation avec initialisation
*/
int monEntier = generationEntier();
// ou encore
int monEntier = 3;


La définition d'une fonction, c'est la desctiption de ce que fait la fontion:

int multiplier(int a, int b) {
return a*b;
}

En C, toute utilisation de variable ou de fonction doit être précédée dans le code par sa déclaration, pas forcément par la l'initialisation (mais alors, il vaut mieux pour toi que la première utilisation soit une affectation :smile: ) ni la définition.

Exemple de structure de code:

// Mes prototypes (déclarations)
int multiplier(int a, int b);

/*
* Main
*/
int main(int argc, char** argv) {
int monEntier; // ici je déclare
int premier = 3;
int second = 4;

[...]

monEntier = multiplier(premier, second);

[...]
}

// Définitions des fonctions
int multiplier(int a, int b) {
return a*b;
}


Ensuite, suivant la version de C que tu utilises (ANSI, C99, ...), les variables peuvent devoir être déclarée en début de bloc, avant tout autre code.
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 11/09/2011 @ 12:07:29,
Par crodilus
Je pense que la pièce vient de tomber :lol: !

En faite ma boucle do/while du main ne sert à rien vu que tout est déjà fait dans la boucle do/while de genereNombre ! On a deux fois la même condition sur while :

  1. while (nombreEntre != nombreMystere);


qui est éffectuée d'habord dans compareNombre et puis le programme se termine quand la condition est remplie sans rien renvoyer dans main !

=> La fonction main ne sert à rien !

Donc déclaration ==> on indique les variables et les arguments.

initialisation ==> on donne une valeur aux variablex que l'on vient de déclarer.

définition ==> description de se que fait la fonction.

Bon après toutes ces explications je vais retravailler le programme :clindoeil: !

Merci bien :clindoeil: !

Amicalement crodilus !

Dernière édition: 11/09/2011 @ 12:08:12
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 11/09/2011 @ 17:21:27,
Par crodilus
  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <time.h> 
  4. int genereNombre () 
  5. int nombre=0
  6. const int MAX = 100, MIN = 1
  7. srand (time(NULL)); 
  8. nombre = (rand () % (MAX - MIN + 1)) + MIN; 
  9. return nombre; 
  10. int main ( int argc, char** argv ) 
  11.      
  12. int nombreMystere = 0, nombreEntre = 0 , compteur=1
  13. const int MAX = 100, MIN = 1
  14. nombreMystere = genereNombre(MIN, MAX); 
  15. printf("Bienvenue dans le jeu du nombre mystere !\n\nLe principe est tres simple, l'ordinateur va enregistrer un nombre entre 0 et \n100 et vous devrez le trouver !\n"); 
  16. do 
  17. printf("\nQuel est le nombre ? "); 
  18. scanf("%d", &nombreEntre); 
  19. if (nombreMystere > nombreEntre) 
  20. printf("\nC'est plus !\n"); 
  21.             else if (nombreMystere < nombreEntre) 
  22.             printf("\nC'est moins !\n"); 
  23.                           else 
  24.                           printf ("\nBravo, vous avez trouve le nombre mystere en %d coups !!!\n\n", compteur); 
  25.                           compteur++; 
  26. while (nombreEntre != nombreMystere); 
  27. return 0
  28. }


C'est mieux ainsi :grin: ? !

==> en le relisant non :ohwell: vu que le but est de créer la fonction genereNombre et compareNombre et ici je n'ai plus que genereNombre.

J'y retourne :petrus: !

Dernière édition: 11/09/2011 @ 17:31:14
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 11/09/2011 @ 17:39:26,
Par gollum33
Tu appel "genereNombre" dans ton main avec des paramètres alors qu'il n'en a pas dans son prototype.
Cela peut fonctionner, mais tu peux mettre un "void" dans le prototype de "genereNombre" pour que ton compilateur crie.
Pour tes "const int", soit tu les mets en global, soit tu fais des #DEFINE. Pour le moment, quand tu veux modifier MIN et/ou MAX tu dois le faire à 2 endroits différents.
Tu peux prendre l’habitude de mettre ton main avant tes autres fonctions. Il te faudra donc déclarer tes fonctions entre les directives préprocesseur et ton main. C’est plus propre et c’est une bonne habitude à prendre : quand tu auras des gros programmes tu devras organiser ton travail dans plusieurs fichiers et le compilateur devra s’y retrouver.
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 11/09/2011 @ 20:11:56,
Par crodilus
Je pense que cette fois ci c'est bon :smile: !

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <time.h> 
  4. int genereNombre (int Max,int Min) 
  5.     int nombre=0
  6.     const int MAX = 100, MIN = 1
  7.     srand (time(NULL)); 
  8.     nombre = (rand () % (MAX - MIN + 1)) + MIN; 
  9.     return nombre; 
  10. int compareNombre(int nombreEntre, int nombreMystere) 
  11.     if (nombreEntre==nombreMystere) 
  12.     { 
  13.         printf("bravo tu as trouvé le nombre"); 
  14.     } 
  15.     else if (nombreEntre != nombreMystere) 
  16.     { 
  17.         printf("\nContinue de chercher ce n'est pas le bon nombre !\n"); 
  18.     } 
  19.     return nombreEntre; 
  20. int main ( int argc, char** argv ) 
  21.     int nombreMystere = 0, nombreEntre = 0, nombreEntre1=0, compteur=2
  22.     const int MAX = 100, MIN = 1
  23.     nombreMystere = genereNombre(MIN, MAX); 
  24.     printf("Inscrivez un nombre : "); 
  25.     scanf("%d",&nombreEntre); 
  26.     compareNombre (nombreEntre,nombreMystere); 
  27.     if (nombreEntre != nombreMystere) 
  28.     { 
  29.         do 
  30.         { 
  31.             printf("\nInscrivez a nouveau un nombre : "); 
  32.             scanf("%d",&nombreEntre1); 
  33.             if (nombreMystere > nombreEntre1) 
  34.             { 
  35.                 printf("\nC'est plus !\n"); 
  36.             } 
  37.             else if (nombreMystere < nombreEntre1) 
  38.             { 
  39.                 printf("\nC'est moins !\n"); 
  40.             } 
  41.             else 
  42.             { 
  43.                 printf ("\nBravo, vous avez trouve le nombre mystere en %d coups !!!\n\n", compteur); 
  44.             } 
  45.             compteur++; 
  46.         } while (nombreEntre1 != nombreMystere); 
  47.     return 0
  48. }



? !

Dernière édition: 11/09/2011 @ 23:24:54
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 11/09/2011 @ 20:58:16,
Par philfr
Je me suis permis de reformater ton code :smile:
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 11/09/2011 @ 21:03:29,
Par crodilus
Je me suis permis de reformater ton code :smile:


Merci :wink: !

Pas de remarques, je suppose que cela veut dire que c'est enfin bon :grin: ?

Dernière édition: 11/09/2011 @ 21:03:43
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 11/09/2011 @ 22:04:54,
Par max
ben si:

int genereNombre ()
et
nombreMystere = genereNombre(MIN, MAX);
Trololo
   
A peine je m'y mets que j'ai déjà des problèmes >.<...
Publié le 11/09/2011 @ 22:12:43,
Par rfr
A sa place, je laisserais tomber le C pour l'instant et je me dirigerais vers un langage qui empêche de faire ce genre de bêtises ...

Pascal, Java, C#, ...

Dernière édition: 11/09/2011 @ 22:13:07
To die is a time consuming activity, it often takes a lifetime (but some are faster than others ... though)
Répondre - Catégorie:  
Informaticien.be - © 2002-2024 AkretioSPRL  - Generated via Kelare
The Akretio Network: Akretio - Freedelity - KelCommerce - Votre publicité sur informaticien.be ?