Mon programme écrit en langage C ne renvoi pas à l'état initial
Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

Mon programme écrit en langage C ne renvoi pas à l'état initial



  1. #1
    InToX86

    Mon programme écrit en langage C ne renvoi pas à l'état initial


    ------

    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 :

    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
    }

    -----

  2. #2
    Ikhar84
    Animateur Informatique

    Re : Mon programme écrit en langage C ne renvoi pas à l'état initial

    Bonne nuit...

    Sans lire plus en détails ton code (vu l'heure...) une partie de ton code est hors du bloc
    Code:
    while (l!=3) {
        //...
    }
    Et donc ne s'exécutera non seulement qu'une seule fois, mais en plus que si tu choisis de sortir de la boucle...

    Deuxième remarque... le float que retourne ta fonction main pique un peu les yeux, non les puristes ?

    Troisième remarque...
    À quoi sert ton float s dans ton main ?
    Tu y stockes le retour de tes appels de fonction, sans l'utiliser, puis ru l'écrases d'un scanf, sans plus l'utiliser ?

    La logique est from scratch et non patiement réfléchie rien qu'à voir ce code...
    J'ai glissé Chef !

  3. #3
    umfred

    Re : Mon programme écrit en langage C ne renvoi pas à l'état initial

    pour compléter Ikhar84, regarde à quel moment/endroit tu demandes/affiches ton menu par rapport à ta boucle while

  4. #4
    InToX86

    Re : Mon programme écrit en langage C ne renvoi pas à l'état initial

    Merci Ikhar84, merci umfred.

    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 à la première remarque d'Ikhar84, j'ai mis toute les instructions dans une boucle do white mais je trouve toujours le même problème .
    J'ai compris la deuxième et la troisième remarque mais je suis débutant je ne trouve pas un moyen pour changer le float et appeler la fonction sans injecter son résultat dans une variable.

    Voilà un autre essai (fonction main):

    Code:
    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);
    }
    Dernière modification par JPL ; 19/11/2020 à 15h57. Motif: ajout de la balise Code (#) pour garder l’indentation

  5. A voir en vidéo sur Futura
  6. #5
    umfred

    Re : Mon programme écrit en langage C ne renvoi pas à l'état initial

    ton scanf à la fin, il sert à quoi ?

  7. #6
    Ikhar84
    Animateur Informatique

    Re : Mon programme écrit en langage C ne renvoi pas à l'état initial

    À mettre le programme en pause mode brute
    J'ai glissé Chef !

  8. #7
    InToX86

    Re : Mon programme écrit en langage C ne renvoi pas à l'état initial

    j'ai utilisé un scanf pour afficher le résultat des fonctions

  9. #8
    InToX86

    Re : Mon programme écrit en langage C ne renvoi pas à l'état initial

    Merci bcp, votre remarque du scanf était pertinente, j'ai enlevé le scanf et le programme s'est exécuté en norme.
    Mon problème est résolu mais je dois replonger dans les cours surtt les boucles et les fonctions.
    Merci pour votre aide.
    Voilà le code après modification:

    Code:
    float main()
    {
        int l ;
        float s;
        printf("************************************************\n****  Solveur de polynôme  ****\n************************************************\n\n");  
        l=lirechoix();
        while (l!=3)
        {
            if (l==1)
            {
                s=premier(); // appel de fonction premier
            }
            else if (l==2)
            {
                s=second(); // appel de fonction second
            }
            l= lirechoix(); // pour renvoyer le menu s'il veut continuer
        }
    }

  10. #9
    Jack
    Modérateur

    Re : Mon programme écrit en langage C ne renvoi pas à l'état initial

    Le "float main" est curieux dans le sens où la fin de programme retourne généralement un entier signalant la bonne exécution du code ou une code d'erreur (entier).
    De plus, la fonction main ne retourne rien, quel intérêt de vouloir retourner un float.

  11. #10
    umfred

    Re : Mon programme écrit en langage C ne renvoi pas à l'état initial

    Citation Envoyé par InToX86 Voir le message
    j'ai utilisé un scanf pour afficher le résultat des fonctions
    un scanf pour afficher un truc ???? un printf c'est mieux non ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/06/2013, 18h59
  2. V.E.V Puissance a l etat initial 65% aujourd hui 85%?
    Par invite7b70133d dans le forum Physique
    Réponses: 1
    Dernier message: 07/03/2013, 06h30
  3. Etat initial / état à un instant t
    Par Scaeva dans le forum Discussions scientifiques
    Réponses: 13
    Dernier message: 07/11/2011, 18h54
  4. Courbure de l'univers : état initial
    Par Squared dans le forum Archives
    Réponses: 12
    Dernier message: 18/07/2005, 10h59