Partage
  • Partager sur Facebook
  • Partager sur Twitter

Menu se repete plusieur fois

Sujet résolu
    23 février 2018 à 7:20:16

    Bonjour a tous

    Mon problème est que lorsque je crée un menu si je tape 1 j’accède bien a la suite de mon programme, mais des que je tape 2 pour accéder a "crée un fichier " mon menu réapparait et me redemande de choisir une deuxième fois avant d’accéder a la suite du programme, si je tape 3 pour accéder a "Écrire dans un fichier" mon menu apparait 3 fois avant de passez a la suite du programme et si je rajoute une 4éme option dans le menu il réapparait 4 fois etc...

    Ce n'est pas la première fois que j'ai ce problème et je ne comprend pas pourquoi il ne passe pas direct a la suite du programme sauf quand je choisis "1".

    J’espère avoir bien réussit a expliquer mon problème, et merci a ce qui pourront m'aider.

    #include <stdlib.h>
    #define TAILLE_MAX 1000
    
    int menu(int choix);
    int programme();
    
    int main()
    {
        programme();
        return 0;
    }
    
    int menu(int choix)
    {
        printf("1. Lire un fichier\n");
        printf("2. Cree un fichier\n");
        printf("3. Ecrire dans un fichier\n");
    
        printf("Votre choix : ");
            scanf("%d", &choix);
    
       return choix;
    }
    
    int programme()
    {
        int choix = 0;
    
        if(menu(choix) == 1)
        {
            char text[TAILLE_MAX] = "";
    
            FILE *fichier = NULL;
    
            fichier = fopen("text.txt", "r");
    
            if(fichier != NULL)
            {
                fgets(text, TAILLE_MAX, fichier);
                printf("%s", text);
            }
    
            fclose(fichier);
        }
    
        else if(menu(choix) == 2)
        {
            char text[TAILLE_MAX];
    
            FILE *fichier = NULL;
    
            fichier = fopen("text2.txt", "w");
    
            printf("le fichier a etais crée.\n");
            printf("que souhaitait vous ecrire dans ce fichier : ");
            scanf("%s", &text);
    
            fprintf(fichier, "%s", text);
    
            fclose(fichier);
        }
    
        else if(menu(choix) == 3)
        {
            char text[TAILLE_MAX];
    
            FILE *fichier = NULL;
    
            fichier = fopen("text3.txt", "w");
    
            printf("Que souhaitait vous ecre dans le fichier text3.txt : ");
            scanf("%s", &text);
    
            fprintf(fichier, "%s", text);
    
            fclose(fichier);
        }
    
        return 0;
    }



    • Partager sur Facebook
    • Partager sur Twitter
      23 février 2018 à 9:25:29

      Tu initialises choix à 0. Ligne 29 tu rentres dans ton if et dans ta fonction menu, si tu choisis 1 ton if est vérifié donc le programme ne passera pas aux else.

      Si tu choisis 2 : ligne 29 tu rentres dans le if puis ta fonction menu, tu entres 2 donc

      if(menu(choix) == 1)

      n'est pas vérifié -> tu passes ensuite au else if(menu(choix)==2) et donc ton menu sera ré affiché.

      Pour résoudre ton problème ce n'est pas compliqué, il te suffit de faire un switch(menu(choix)) avec les cas voulus.

      -
      Edité par Xaaav67 23 février 2018 à 14:08:59

      • Partager sur Facebook
      • Partager sur Twitter
        23 février 2018 à 13:59:19

        Hello,

        Xaaav67 a écrit:

        menu(choix);
        if(choix == 1)
        {
            //ton code
        }
        else if(choix == 2)
        {
            //ton code
        }
        //etc...


        Cela ne fonctionnera pas: choix est passé par valeur, pas par adresse.

        Le plus simple:

        int menu(void) {
            int choice;
        
            ....
        
            return(choice);
        }
        
        int programme(void) {
            int choice;
        
            choice=menu();
            switch(choice) {
                ....
                ....
            }
            ....
        
            return(....);
        }


        -
        Edité par edgarjacobs 23 février 2018 à 14:01:37

        • Partager sur Facebook
        • Partager sur Twitter

        On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

          23 février 2018 à 14:08:40

          edgarjacobs a écrit:


          Cela ne fonctionnera pas: choix est passé par valeur, pas par adresse.

          Effectivement, grosse erreur de ma part, je me demande comment j'ai pu dire ça... :o

          Ceci dit la solution avec le switch reste valable.

          • Partager sur Facebook
          • Partager sur Twitter
            23 février 2018 à 14:49:11

            Salut Mec 

            il faut savoir un truc que le menu est toujours réalisé avec " switch " car il t'évite de trop écrire exemple:

            switch(choix){
            
             case 1:
              // instruction;
              break;
            
              case 2:
              // instruction;
              break;
            
             case 3:
              // instruction;
              break;
            
             default:
              // instruction;
              break;
            }

            tu vois que c'est très simple et rapide

            -
            Edité par EL-jos 23 février 2018 à 14:50:05

            • Partager sur Facebook
            • Partager sur Twitter

            Ton présent détermine ton futur et la connaissance te placera au dessus de ta génération .

              23 février 2018 à 16:54:07

              Merci a tous, j'ai essayer les 2 solution (if et switch) j'ai réussi a régler mon problème en utilisant if et else comme expliquer plus haut mais quand j'utilise switch une erreur apparait a la déclaration 
              char text[TAILLE_MAX] = "";

              Pourtant je pense bien déclarer mon switch et il n'y a pas ce problème quand j'utilise if else

              int menu()
              {
                  int choix = 0;
              
                  printf("1. Lire un fichier\n");
                  printf("2. Cree un fichier\n");
                  printf("3. Ecrire dans un fichier\n");
              
                  printf("Votre choix : ");
                      scanf("%d", &choix);
              
                 return choix;
              }
              
              int programme()
              {
                  int choix = 0;
                  choix = menu();
              
                  switch(choix == 1)
                  {
                   case 1:
                      char text[TAILLE_MAX] = "";
              
                      FILE *fichier = NULL;
              
                      fichier = fopen("text.txt", "r");
              
                      if(fichier != NULL)
                      {
                          fgets(text, TAILLE_MAX, fichier);
                          printf("%s", text);
                      }
              
                      fclose(fichier);
              
                   break;
              
                   case 2:
                       //code
              
                   break;
              etc... 



              Quand je fait ce code en if sa marche mais en switch   --error expected expression before 'FILE'

              Désole si la réponse peut vous paraitre évidente mais j'aimerais bien comprendre pour ne pas avoir ce problème a chaque fois.

              -
              Edité par moitoi39 23 février 2018 à 16:59:06

              • Partager sur Facebook
              • Partager sur Twitter
                23 février 2018 à 17:41:14

                Hello,

                Si tu compiles en c89, il est normal d'avoir cette erreur. Ne sachant pas quel compilateur tu utilises, pour régler ce problème, mets une { en fin de ligne 22 et une } en ligne 36.

                Tu vas devoir revoir le principie du switch: que penses-tu que fait switch(choix==1) ?

                -
                Edité par edgarjacobs 23 février 2018 à 17:45:24

                • Partager sur Facebook
                • Partager sur Twitter

                On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                  23 février 2018 à 18:01:08

                  edgarjacobs a écrit:

                  Tu vas devoir revoir le principie du switch: que penses-tu que fait switch(choix==1) ?

                  merci pour ta réponse c'est bien cela en rajoutant les { en ligne 22 et } en ligne 36 tout fonctionnent comme prévue c'est parfait :D

                  Et pour ce qui est du switch l'erreur vient de quand j'ai copié le code ici j'ai bien écrit dans mon code :

                  switch(choix)

                  et non pas :

                  switch(choix == 1)




                  -
                  Edité par moitoi39 23 février 2018 à 18:06:29

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Menu se repete plusieur fois

                  × 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