Forum Programmation.c Problème avec le renvoi au menu principal

Posté par  . Licence CC By‑SA.
Étiquettes :
0
19
nov.
2020

Bonjour.
Je veux écrire un programme qui affiche le menu suivant:
1- Résolution d'un polynôme de 1er degré
2- Résolution d’un polynôme de 2nd degré
3- Quitter
Après avoir fait un de ces traitement, le programme doit interroger l'utilisateur s’il veut continuer ou non. Si oui, il le renvoi au menu principal sinon il met fin à l’exécution.
J’ai fait un premier essai mais mon programme ne fait pas ça : dans un premier temps, il fait correctement le traitement d’un choix parmi les 3 mais juste ensuite il ne communique pas comme voulu avec l’utilisateur pour le renvoyer au menu ou quitter.
SVP Aidez-moi!!
Voila mon code :

    #include<stdio.h>
    #include <math.h>

    void affichagemenu()
    {
        printf("Tapez le nombre correspondant pour choisir l'opération à effectuer:\n 1 pour résoudre un polynome de premier degré\n 2 pour résoudre un polynome de second degré\n 3 pour quitter le programme\n");
    }

    int lirechoix()
    {
        int Indice=0;
        affichagemenu();
        scanf("%d",&Indice);
        return(Indice);
    }

    float premier()
    {
        int a=0, b=0;
        float x=0;

        printf("Votre polynome s'écrit sous la forme: ax+b=0\n\n");

        printf("Que vaut 'a' ? ");
        scanf("%d", &a);
        printf("\n\n");

        printf("Que vaut 'b' ? ");
        scanf("%d", &b);
        printf("\n\n");

        if (a!=0)
        {
            x=-((float)b)/a;
            printf("La solution de l'equation est : x = %f\n\n\n", x);
        }
        else
        {
            if(b == 0)
            printf("Tout réel a strictement different de zero est une solution !\n\n\n"); // la solution est 0 divisé par a avec a non nul
            else
            printf("Pas de solution réelle\n\n\n");
            return (x);
        }
    }


    float second()
    {
        /* Calcul des solutions réelles d'une équation du second degré */
        int A, B, C;
        float f;
        double D; /* Discriminant Delta*/
        printf("Votre polynome s'écrit sous la forme:  ax^2 + bx + c = 0 \n\n");
        printf("Que vaut a, b et c? Introduisez les en ordre: a, b, puis c :\n");
        scanf("%i %i %i", &A, &B, &C);

        D = pow(B,2) - 4.0*A*C; /* Calcul du discriminant b^2-4ac */

        /* Distinction des différents cas */
        if (A==0 && B==0 && C==0) /* 0x = 0 */
        printf("Tout réel est une solution de cette équation.\n");
        else if (A==0 && B==0)  /* Contradiction: c # 0 et c = 0 */  
        printf("Cette équation ne possède pas de solutions.\n");
        else if (A==0) /* bx + c = 0 */ 
        {
            printf("La solution de cette équation est :\n"); 
            f=((double)C/B);
            printf(" x = %.4f\n", f);
        }
        else if (D<0)  /* b^2-4ac < 0 */ 
        printf("Cette équation n'a pas de solutions réelles.\n");
        else if (D==0) /* b^2-4ac = 0 */ 
        {
            printf("Cette équation a une seule solution réelle :\n");
            f=((double)-B/(2*A));
            printf(" x =  %.4f\n", f);
        }
        else /* b^2-4ac > 0 */ 
        {
            printf("Les solutions réelles de cette équation sont :\n");
            f=((-B+sqrt(D))/(2*A)); //sqrt est la fonction dans le langage C pour le racine carré
            printf(" x1 = %.4f\n", f);
            f=((-B-sqrt(D))/(2*A));
            printf(" x2 = %.4f\n", f);
            return (f);
        }
    }

    float main()
    {
        int l,o ;
        float s;
        printf("************************************************\n**** Solveur de polynome ****\n************************************************\n\n");  
        l=lirechoix();
        while (l!=3)
        {
            if (l==1)
            {
                s=premier();
                scanf("%f",&s);
            }
            else if (l==2)
            {
                s=second();
                scanf("%f",&s);
            }
        }
            printf("Tapez 1 pour continuer vers une autre opération\nTapez une touche quelconque pour quitter\n");
            /*j'ai choisi d'ajouter cette étape pour ne pas encombrer les affichages et mettre l'utilisateur à l'aise au
            lieu de lui afficher le menu à chaque fois */
            scanf("%d",&o);
            while (o!=1)
            {
                return 0; // si l'utilisateur ne veut pas continuer
            }

        l= lirechoix(); // pour renvoyer le menu s'il veut continuer
    }
  • # boucle infinie

    Posté par  (Mastodon) . Évalué à 2. Dernière modification le 19 novembre 2020 à 08:34.

    si l'utilisateur tape 1, tu rentres dans une boucle infinie (la condition est sur 'o' et aucun traitement ne modifie 'o').

    je pense qu'il te faut simplement un if à la place du while.

    cela dit, le mieux est de le laisser dans la gestion du menu général, et pas de rajouter encore un printf/scanf.

    En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

  • # Boucle infinie

    Posté par  . Évalué à 2.

    Ton problème se situe dans ta logique du premier while (celui qui vérifie si le choix de l'utilisateur est différent de 3).
    En gros, si l'utilisateur choisit n'importe quelle autre chose que 3, la boucle while va s'exécuter indéfiniment.
    Je te laisse méditer dessus.

  • # [Bb]oucle infinie

    Posté par  . Évalué à 2. Dernière modification le 19 novembre 2020 à 09:14.

    En fait, ton problème, c'est que tu as une boucle infinie.

    Une fois le choix fait tu rentre dans in while

    File bien vite

    Matricule 23415

  • # kreu mignon !

    Posté par  . Évalué à 1. Dernière modification le 19 novembre 2020 à 10:42.

    Bien que ça ne soit pas très élégant, ça devrait marcher, c'est juste un problème d'indentation qui fait que tu as une accolade fermante de trop :)

            float main() {
                 ...
    
                    l=lirechoix();
                    while (l!=3)
                    {
    
                 ...
                        {
                            s=second();
                            scanf("%f",&s);
                        }
                  }
                        printf("Tapez 1 pour continuer vers une autre opération\nTapez une touche quelconque pour quitter\n");
                        /*j'ai choisi d'ajouter cette étape pour ne pas encombrer les affichages et mettre l'utilisateur à l'aise au
                        lieu de lui afficher le menu à chaque fois */
                        scanf("%d",&o);
                        while (o!=1)
                        {
                            return 0; // si l'utilisateur ne veut pas continuer
                        }
             ....
            }
    • [^] # Re: kreu mignon !

      Posté par  . Évalué à 2. Dernière modification le 19 novembre 2020 à 09:52.

      Rha, mauvaise manip, peut pas éditer mon commentaire !

      Bref, c'est naïf, mais ça peut marcher ; un problème d'indentation qui t'as conduit à ça : faudrait juste déplacer ton '}' du premier while à la fin et vérifier la confirmation à ce moment :

          float main()
          {
              int l,o ;
              float s;
              printf("************************************************\n**** Solveur de polynome ****\n************************************************\n\n");  
              l=lirechoix();
              while (l!=3)
              {
                  if (l==1)
                  {
                      s=premier();
                      scanf("%f",&s);
                  }
                  else if (l==2)
                  {
                      s=second();
                      scanf("%f",&s);
                  }
           /* } <--------- celui-ci */
      
              if (l == 1 || l == 2) {
                  printf("Tapez 1 pour continuer vers une autre opération\nTapez une touche quelconque pour quitter\n");
                  /*j'ai choisi d'ajouter cette étape pour ne pas encombrer les affichages et mettre l'utilisateur à l'aise au
                  lieu de lui afficher le menu à chaque fois */
                  if (scanf("%d",&o) == 1 && o == 1) /* <---- on vérifie qu'on a bien la bonne confirmation */
                       break;
                }
      
                l= lirechoix(); // pour renvoyer le menu s'il veut continuer
      
              } /* <-------- à bouger ici */
          }
  • # Perdu :(

    Posté par  . Évalué à 1.

    Pareil avec le déplacement de l'accolade ça affiche un premier résultat puis ne renvoie pas le menu.
    C'est vrai je pense qu'il y a une boucle infinie mais je n'ai pas pu déterminer l'emplacement exacte :(

    • [^] # Re: Perdu :(

      Posté par  . Évalué à 1.

      Si tu regardes bien, tu remarqueras qu'une fois entré dans la boucle, l n'est plus jamais assignée et du coup, ça boucle indéfiniment.

  • # Un autre essai

    Posté par  . Évalué à 1. Dernière modification le 20 novembre 2020 à 07:53.

    Voilà,

    J'ai essayé de simplifier le code en éliminant l'interrogation de l'utilisateur pour continuer ou non (pour revenir directement au menu).
    En répondant à votre remarque, j'ai mis toute les instructions dans une boucle do white mais je trouve toujours le même problème .

    Voilà un autre essai (fonction main):
    je suis encore perdu :(

    float main()
    {
        int l ;
        float s;
        printf("************************************************\n**** Solveur de polynome ****\n************************************************\n\n");  
        do
        {
        l=lirechoix();
            if (l==1)
            {
                s=premier();
            }
            else if (l==2)
            {
                s=second();
            }
        scanf("%f",&s);
        }
        while (l!=3);
    }
    • [^] # Re: Un autre essai

      Posté par  (Mastodon) . Évalué à 2. Dernière modification le 20 novembre 2020 à 14:11.

      Pour afficher le résultat de tes calculs de polynômes, ce n'est pas scanf("%f",&s); mais printf("%f",&s); printf("%f\n",s); qu'il faut faire.

      Et ce n'est à faire que pour le choix 1 et 2, pas pour le choix 3 (donc il faut les laisser dans chaque if().

      En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

      • [^] # Re: Un autre essai

        Posté par  . Évalué à 2.

        je dirais même plus printf("%f\n", s) !

        • [^] # Re: Un autre essai

          Posté par  (Mastodon) . Évalué à 2.

          bien sûr !

          En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.