Partage
  • Partager sur Facebook
  • Partager sur Twitter

tp 1: avec les fonctions

    25 octobre 2008 à 10:52:22

    Je suis littéralement bloqué surement parce que j'ai fais les améliorations mais je n'arrive pas à écrire mes fonctions...
    Un p'tit coup de pouce ce serait super sympa ( je veux pas la réponse hein !? juste un p'tit coup de pouce :p)
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    long genereNombre(long nombreMystere)
    {
       long MAX = 100, MIN = 1;
    	srand(time(NULL));
        nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
    	
    	return nombreMystere;
    }
    
    void compareNombre()
    {
    if (nombreEntre < nombreMystere)
      {
      printf("C'est plus !");
      }
    
    else if (nombreEntre > nombreMystere)
      {
      printf("C'est moins");
      }
    else if (nombreEntre != nombreMystere)
     {
     printf("C'est gagné ! Vous avez trouvé le nombre mystère !");
     }
    }
    
    
    int main ( int argc, char** argv )
    {
    long nombreJoueur = 0;
    long niveau = 0;
    
    printf ("====================== Menu ======================\n\n\n");
    printf ("Nombres de joueurs :\n\n");
    printf ("1. Un joueur\n");
    printf ("2.Deux joueur\n");
    printf ("Tapez 1 pour joueur seul ou 2 pour jouer à deux : ");
    scanf ("%ld", &nombreJoueur);
    printf ("Maintenant que vous avez choisi le nombres de joueurs choissisez le niveau de difficulter : \n");
    printf ("1. Facile, nombres de 1 à 100\n");
    printf ("2. Normal, nombres de 1 à 1000\n");
    printf ("3. Difficile, nombres de 1 à 10000\n");
    printf("Tapez 1 pour facile, 2 pour normal ou 3 pour difficile : ");
    scanf("%ld", &niveau);
    printf("\n==================================================\n");
    
    
    if (nombreJoueur == 1 && niveau == 1)
      {
      long nombreMystere = 0, nombreEntre = 0, nombreCoup = 0;
      const long MAX = 100, MIN = 1;
      
      nombreMystere = genereNombre(MIN, MAX);
      
          do
        {
        nombreCoup++;
        printf("Quel est le nombre ? ");
        scanf("%ld", &nombreEntre);
    
    	compareNombres(nombreEntre, nombreMystere);
    	
    	} while (nombreEntre != nombreMystere);
      }
    
    else if (nombreJoueur == 1 && niveau == 2)
      {
      long nombreMystere = 0, nombreEntre = 0, nombreCoup = 0;
      const long MAX = 1000, MIN = 1;
      
      nombreMystere = genereNombre(MIN, MAX);
      
          do
        {
        nombreCoup++;
        printf("Quel est le nombre ? ");
        scanf("%ld", &nombreEntre);
    
    	compareNombres(nombreEntre, nombreMystere);
    	
    	} while (nombreEntre != nombreMystere);
      }
      
    else if (nombreJoueur == 1 && niveau == 3)
      {
      long nombreMystere = 0, nombreEntre = 0, nombreCoup = 0;
      const long MAX = 10000, MIN = 1;
      
      nombreMystere = genereNombre(MIN, MAX);
      
          do
        {
        nombreCoup++;
        printf("Quel est le nombre ? ");
        scanf("%ld", &nombreEntre);
    
    	compareNombres(nombreEntre, nombreMystere);
    	
    	} while (nombreEntre != nombreMystere);
      }
    
    else if (nombreJoueur == 2 && niveau == 1)
      {
      long nombreMystere = 0, nombreEntre = 0, nombreCoup = 0;
    printf("Un joueur va choisir le nombre mystere entre 1 et 100: ");
    scanf("%ld", &nombreMystere);
    
          do
        {
        nombreCoup++;
        printf("Quel est le nombre ? ");
        scanf("%ld", &nombreEntre);
    
    	compareNombres(nombreEntre, nombreMystere);
    	
    	} while (nombreEntre != nombreMystere);
      }
      
      else if (nombreJoueur == 2 && niveau == 2)
      {
      long nombreMystere = 0, nombreEntre = 0, nombreCoup = 0;
    printf("Un joueur va choisir le nombre mystere entre 1 et 1000: ");
    scanf("%ld", &nombreMystere);
    
          do
        {
        nombreCoup++;
        printf("Quel est le nombre ? ");
        scanf("%ld", &nombreEntre);
    
    	compareNombres(nombreEntre, nombreMystere);
    	
    	} while (nombreEntre != nombreMystere);
      }
     
      else if (nombreJoueur == 2 && niveau == 3)
      {
      long nombreMystere = 0, nombreEntre = 0, nombreCoup = 0;
    printf("Un joueur va choisir le nombre mystere entre 1 et 10000: ");
    scanf("%ld", &nombreMystere);
    
          do
        {
        nombreCoup++;
        printf("Quel est le nombre ? ");
        scanf("%ld", &nombreEntre);
    
    	compareNombres(nombreEntre, nombreMystere);
    	
    	} while (nombreEntre != nombreMystere);
      }
      
    else
      {
      printf("Il ne peut y avoir que un ou deux joueurs...");
      }
      
    return 0;
    }
    


    Voilà le code en entier et voici la partie a laquelle j'ai besoin du coup de pouce :
    long genereNombre(long nombreMystere)
    {
       long MAX = 100, MIN = 1;
    	srand(time(NULL));
        nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
    	
    	return nombreMystere;
    }
    
    void compareNombre()
    {
    if (nombreEntre < nombreMystere)
      {
      printf("C'est plus !");
      }
    
    else if (nombreEntre > nombreMystere)
      {
      printf("C'est moins");
      }
    else if (nombreEntre != nombreMystere)
     {
     printf("C'est gagné ! Vous avez trouvé le nombre mystère !");
     }
    }
    


    Voilà merci d'avance !!!!!
    Yoshi-tun

    • Partager sur Facebook
    • Partager sur Twitter
      25 octobre 2008 à 11:14:03

      Le problème vient de la génération aléatoire de nombre, je te conseille de vérifier dans le tuto de m@teo les précisions qu'il donne quand à l'utilisation de srand(time(NULL)).

      Sinon si vraiment tu ne trouve pas la solution est dans le cadre en dessous :

      srand ne doit être appeler qu'une fois par execution du programme, pour ce il faut le placer dans la main juste après la déclaration des variables.

      Je pensse qu'il y'as aussi un petit problème au niveau des conditions dans ta fontion comparNombre() mais tu devrais t'en rendre compte asser facilement


      Voila bon code et bonne journée
      • Partager sur Facebook
      • Partager sur Twitter
        25 octobre 2008 à 11:20:11

        Je n'ai pas vraiment comprit il faut que je place seulement le srand dans la main ?
        De cette façon ?
        #include <stdio.h>
        #include <stdlib.h>
        #include <time.h>
        
        long genereNombre(long nombreMystere)
        {
           long MAX = 100, MIN = 1;
            nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
        	
        	return nombreMystere;
        }
        
        void compareNombre()
        {
        if (nombreEntre < nombreMystere)
          {
          printf("C'est plus !");
          }
        
        else if (nombreEntre > nombreMystere)
          {
          printf("C'est moins");
          }
        
        else
         {
         printf("C'est gagné ! Vous avez trouvé le nombre mystère !");
         }
        }
        
        
        int main ( int argc, char** argv )
        {
        long nombreJoueur = 0;
        long niveau = 0;
        
        srand(time(NULL));
        


        • Partager sur Facebook
        • Partager sur Twitter
          25 octobre 2008 à 11:30:25

          le srand ne peut etre utiliser qu'une fois comme la dit M@theo ainsi que furzel. Donc tu dois le mettre hors de n'importe quel boucle;)
          • Partager sur Facebook
          • Partager sur Twitter
            25 octobre 2008 à 11:38:42

            il faut mettre
            void compareNombre(long nombreEntre, long nombreMystere) a la place pour que la fonction puisse utiliser ces valeurs, sinon elle ne pourra pas travailler.

            - la fonction genereNombre en ravanche n'a pas besoin de travailler avec les valeurs MIN et MAX car tu les a déja créé dans la fonctionGenere nombre elle-meme, pour qu'une fonction travaille avec des variables il faut soit les lui envoyer, soit les créer a l'interieur. donc c'est
            nombreMystere = genereNombre(nombreMystere);
            

            car il faut envoyer le "long nombre mystere" (qui vaut 0) pour qu'il genere un nombre et la stocke dans cette variable.
            tu fais ca a toutes les erreures de compilation a ce niveau.

            - fautes de frapes : la fonction compareNombre tu l'a écrite au singulier mais il t'es arrivé de mettre compareNombres donc tu dois tout écrire de la meme façon "compareNombre" a toutes les erreures de compilation a ce niveau.
            • Partager sur Facebook
            • Partager sur Twitter
              25 octobre 2008 à 12:09:50

              Voilà le programme est fini mais un p'tit dileme mes niveau de difficulter ne marche plus le nombre est toujours entre 1 et 100
              ce qui est normal car :
              long genereNombre(long nombreMystere)
              { 
                long MAX = 100, MIN = 1;
                
                  nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
              	
              	return nombreMystere;
              }
              


              MAX = 100 et MIN = 1

              donc j'ai essayer de faire un else..if qui ne marche pas

              en gros j'ai fais ça :
              long genereNombre(long nombreMystere)
              { 
              long niveau = 0;
              
              if (niveau == 1)
                {
                long MAX = 1000, MIN = 1;
                }
              
              else if (niveau == 3)
                {
                long MAX = 10000, MIN = 1;
                }
              
              else if (niveau == 2)
                {
                long MAX = 100, MIN = 1;
                }
              
               else
               {
               printf("Saisie eronné...");
               }
                
                  nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
              	
              	return nombreMystere;
              }
              


              Je lançe et le debugger me dit dit que je n'utilise jamais MAX et MIN dans les conditions et que je n'est rien assigner a MAX et MIN dans "nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;"

              Mais pas questions de me décourager alors j'ai mis "nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;" dans chaque condition :
              long genereNombre(long nombreMystere)
              { 
              long niveau = 0;
              
              if (niveau == 1)
                {
                long MAX = 100, MIN = 1;
                nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
                }
              
              else if (niveau == 2)
                {
                long MAX = 1000, MIN = 1;
                nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
                }
              
                else if (niveau == 3)
                {
                long MAX = 10000, MIN = 1;
                nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
                }
              
                else
                {
                printf("Saisie eronné...");
                }
                
                return nombreMystere;
              }
              


              J'me suis dis c'est bon ça va marcher ! Et ba pas encore ! Le programme sa lance mais le nombre mystere est toujours zéro et il me dit toujours "Saisie eronné..."

              Ma faute est (et j'en suis sur) ici :
              long niveau = 0;
              


              c'est ce niveau qui ne va pas, j'ai voulu mettre le menu dans la fonction "long genereNombre" mais c'est idiot de faire ça n'est ce pas ?? ^^

              J'ai trouvé un très bon moyen =D sois j'enleve mes améliortions sois j'enleve les fonctions ( sisi ça marchais très bien sans et même si faut tapé plus de chose ça marche et ça ne m'embrouille pas l'esprit !!)
              • Partager sur Facebook
              • Partager sur Twitter
                25 octobre 2008 à 12:23:53

                long niveau = 0;
                


                effectivement ca va pas, ne l'initialise pas a 0 dans genereNombre sinon t'es sur que t'aura "valeur éronnée"

                je ferais en revanche dans la fonction main.c
                long niveau = 0;
                
                (dans le main hein)
                et la fonction genereNombre sera comme ceci:

                nombreMystere = genereNombre(nombreMystere, niveau);
                


                je pense que ca devrait marcher pour l'appel de fonction

                donc pour la fonction genereNombre :

                long genereNombre(long nombreMystere, long niveau)
                {
                
                if (niveau == 1)
                  {
                         /*etc.*/
                


                donc en envoie la variable "niveau" dans genereNombre pour qu'il genere le nombre EN FONCTION du niveau (grace a ton if...else)
                tu as par reflexe intuitif fais un
                long niveau = 0;
                

                car le compilateur ne connaissait pas niveau
                mais ce qu'il aurait fallu faire c'est envoyer niveau directement du main et c'est tout

                sinon il y avait moyen de recréer ton "long niveau" mais tu sais il faudrait refaire un scanf pour demander quel type de difficulté on veut pour que "niveau" contienne le bon chiffre, et ca serait n'importe quoi...

                donc seul moyen : envoyer a la fonction genereNombre la variable niveau. voilou


                et n'oubli pas quand tu utilise l'appel a genereNombre ca se passe comme ca :

                nombreMystere = genereNombre(nombreMystere, niveau);
                


                car mon compilateur ne detectait pas de fautes a ce niveau lorsque j'ai repri l'ancien code et que j'ai corrigé au fur et a mesure mais c'était quand meme faux
                • Partager sur Facebook
                • Partager sur Twitter
                  25 octobre 2008 à 12:35:10

                  Voila c'est bon ! Merci a vous tous !

                  Bon maintenant on va essayer de tout retaper depuis le début :p
                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 octobre 2008 à 12:58:06

                    @Adexxan : Faire nombreMystere = genereNombre(nombreMystere) ne sert à rien : le paramètre de la fonction est une copie de la variable, pas la variable elle-même, pour que la fonction puisse changer la variable, il faudrait utiliser un pointeur. La fonction retourne la valeur, donc le pointeur est également inutile. Le code le plus approprié est bien :
                    nombreMystere = genereNombre();
                    
                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 octobre 2008 à 13:03:56

                      nombreMystere = genereNombre(nombreMystere) et nombreMystere = genereNombre();
                      c'est la même chose sauf que dans le premier cas on écrit plus ? ( enfin plus ... on écrit 3secondes de plus mais bon....)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 octobre 2008 à 13:07:38

                        Moi j'aimerais avoir une commande qui efface le texte précédent inscrit dans la console comme ça si l'on joue à deux celui qui doit chercher le chiffre ne le voit pas précédemment.(Je parle d'une fonction genre cleartext sur CASIO, quand on s'embete en cours :-° )
                        • Partager sur Facebook
                        • Partager sur Twitter
                          25 octobre 2008 à 13:09:39

                          nan Hauru explique bien qu'on envoi un parametre inutile et je m'en rend bien compte

                          donc il faut faire
                          nombreMystere = genereNombre();
                          


                          ou bien
                          nombreMystere = genereNombre(&nombreMystere);
                          


                          comme appel de fonction et :

                          genereNombre(long* nombreMystere)
                          {
                                   /* suite */
                          

                          pour l'utilisation de la fonction, donc vaut mieux la premiere option de plus qu'au niveau du "plus ou moins" on n'a pas encore vu les pointeurs :p

                          @hugob29 > j'ai deja reflechi et il y a pas vraiment de moyen pour effacer le mot secret du joueur pour l'autre joueur.
                          mais moyen de le cacher peut etre : a l'aide de l'annexe 3 du cours C que je n'ai pas encore lu (je le reserve quand j'aurai finis la SDL car cet annexe a l'air moins sympas que les autres (plus dur apparement :p à voir ..))
                          • Partager sur Facebook
                          • Partager sur Twitter
                            25 octobre 2008 à 13:43:44

                            Moi j'ai trouvé le moyen : tu efface tout simplement !
                            ça marche sur la console de Xcode mais sur les consoles windows je ne sais pas si on peux effacer le texte ^^'
                            • Partager sur Facebook
                            • Partager sur Twitter
                              25 octobre 2008 à 14:59:08

                              Hum, effacer "a la main" c'est un peu laborieux. Surtout par exemple si tu fait le mode "2 joueurs"
                              Sous Windows, pour effacer la console, tu peut utiliser
                              system("cls");
                              

                              Cela efface tout ce qui est dans ta console à ce moment là.
                              Par contre pour effacer une seule partie de la console, je sais pas.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                25 octobre 2008 à 15:27:13

                                Pour n'effacer qu'une seule partie, tu effaces tout et tu ré-écris ce qu'il y avait avant sans la partie que tu veux cacher.

                                J'utilise cette astuce dans mon propre TP - Plus ou moins et c'est encore plus visible dans mon second TP - Le pendu.

                                Bon courage pour la suite ;).
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  25 octobre 2008 à 18:12:30

                                  Citation : Yoshi-tun

                                  nombreMystere = genereNombre(nombreMystere) et nombreMystere = genereNombre();
                                  c'est la même chose sauf que dans le premier cas on écrit plus ? ( enfin plus ... on écrit 3secondes de plus mais bon....)


                                  Certes, mais contrairement à la première, la seconde forme montre qu'on sait ce qu'on fait... On évite tout codage inutile.

                                  - perte de temps
                                  - augmentation de la taille du source
                                  - augmentation de la taille du code
                                  - augmentation du risque d'erreurs
                                  - ralentissement
                                  ...

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Music only !

                                  tp 1: avec les fonctions

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown