IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Résolution d'une équation du second degré


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Points : 66
    Points
    66
    Par défaut Résolution d'une équation du second degré
    Bonjour je dois écrire un programme de résolution d'une équation du second degré. Les coefficients (réels) sont saisis au clavier. Les erreurs éventuelles doivent être traitées. Est-ce que je peux améliorer mon programme ? Par ailleurs, comment est-ce que je peux vider le buffer sans avoir à taper une deuxième fois sur entrée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    #include <stdio.h>
    #include <math.h>
    #include <ctype.h>
     
    void saisie(double* coeff,char c)
    {
        int ok;
        char buffer[1024];
     
        printf("Entrez le coefficient %c : ",c);
        ok=scanf("%lf",coeff);
     
        if(getchar()!='\n' || ok==0)
        {
            printf("La saisie n'est pas valide.");
            exit (-1);
        }
        //fgets(buffer,1023,stdin);
        //while(getchar()!='\n');
    }
     
    void racines_polynome (double a,double b,double c,int* nbracines,double* x1,double* x2)
    {
        double delta;
        delta=b*b-4*a*c;
     
        if(a==0)
            if (b==0)
                if(c==1)
                    *nbracines=-2;
                else
                    *nbracines=-1;
            else
            {
                *nbracines=1;
                *x1=-c/b;
            }
     
        else
        {
            if(delta<0)
                *nbracines=0;
            else
            {
                *nbracines=2;
                *x1=(-b+sqrt(delta))/(2*a);
                *x2=(-b-sqrt(delta))/(2*a);
            }
        }
    }
     
    int main()
    {
        double a,b,c,x1,x2;
        int nbracines,ok;
        char rep;
     
        do
        {
            printf("Entrez les coefficients a,b et c du polynome ax2+bx+c : \n");
     
            saisie(&a,'a');
            saisie(&b,'b');
            saisie(&c,'c');
     
            racines_polynome(a,b,c,&nbracines,&x1,&x2);
     
            switch (nbracines)
            {
                case -2 : printf("Le polynome est constant et n'a pas de racines.\n");break;
     
                case -1 : printf("Le polynome est nul et a une infinite de racines.\n");break;
     
                case 0 : printf("Le polynome n'a pas de racines dans R.\n");break;
     
                case 1 : printf("Le polynome est du premier degre; racine=%lf.\n",x1);break;
     
                case 2 : {  if ( x1 == x2 )
                                printf( "Le polynome a une racine double; racine = %lf\n" , x1 );
                            else
                                printf( "Le polynome a 2 racines;x1 = %lg; x2 = %lf\n" , x1 , x2 );
                         }
            }
     
            printf("Voulez-vous recommencer ? o/n");
            scanf("%c",&rep);
            while(getchar()!='\n');
     
        } while (tolower(rep)!='n');
     
        return 0;
    }

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par benjamin_malaussene Voir le message
    Par ailleurs, comment est-ce que je peux vider le buffer sans avoir à taper une deuxième fois sur entrée ?
    À ma connaissance, ce problème n'est pas censé se poser après un scanf(), mais se pose après un fgets().
    Le principe est de ne tenter de vider le buffer que si fgets() n'a pas retourné de \n.

    Regarde du côté de ce code: http://www.developpez.net/forums/d14...e/#post8140473
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par benjamin_malaussene Voir le message
    Est-ce que je peux améliorer mon programme ?
    Ne calculer delta que dans le cas où tu l'utilises !!!

    Par ailleurs je ne comprends pas trop pourquoi tu testes si "c" vaut 1. Peut-être que l'utilisateur cherchera à résoudre 0x²+0x+18=0 !!!

    Autre chose: tu as aussi un cas particulier où a, b et c sont différents de 0 mais où il n'y a quand-même qu'une seule solution: quand delta vaut 0 (ton programme fonctionne dans ce cas mais trouve deux solutions égales ce qui peut-être vu par ton prof comme une erreur).

    Sinon on ne sort jamais par exit() d'une fonction autre que main(). On entre dans le programme par le main(), on en ressort par le main(). Si tu écris une fonction qui détecte et qui renvoie les erreurs alors tu dois ensuite faire l'effort (du coté appelant) de gérer ces erreurs récupérées (y compris renvoyer le problème à l'appelant du dessus jusqu'à arriver au main).

    Citation Envoyé par benjamin_malaussene Voir le message
    Par ailleurs, comment est-ce que je peux vider le buffer sans avoir à taper une deuxième fois sur entrée ?
    Ca ça t'a déjà été expliqué: un fgets() pour vider le buffer et récupérer tout son contenu sous forme de chaine puis traiter la chaine par sscanf pour récupérer ses valeurs (et détecter les erreurs éventuelles).

    Citation Envoyé par Médinoc Voir le message
    À ma connaissance, ce problème n'est pas censé se poser après un scanf(), mais se pose après un fgets().
    Ben si (ou alors j'ai mal compris ce que tu veux dire).
    Si tu fais un scanf("%d"), comme tu es obligé de valider ta saisie par <return> tu stockes dans stdin un caractère '\n' qui n'est pas récupéré par scanf("%d") (ou scanf("%f")).
    A la saisie suivante (surtout si tu fais saisir une chaine), tu récupères alors ce '\n' à la place de ce que tu aurais aimé taper...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Points : 66
    Points
    66
    Par défaut
    Super merci beaucoup Svear, j'ai l'impression que je fais tout le temps des erreurs... J'ai modifié mon programme du coup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    #include <stdio.h>
    #include <math.h>
    #include <string.h>
     
    int saisie(double* coeff,char c)
    {
        int ok;
        char buffer[1024];
        char other[1024];
        char *c;
     
        printf("Entrez le coefficient %c : ",c);
        fgets(buffer,1023,stdin);
     
        if (c=strchr(buf, '\n')) *c='\0';
        if (sscanf(buffer, "%lf", coeff) == 0 || (sprintf(other, "%lf", *coeff), strcmp(buffer, other) != 0))
        {
            printf("La saisie n'est pas valide.");
            return (-1);
        }
        return 0;
    }
     
    void racines_polynome (double a,double b,double c,int* nbracines,double* x1,double* x2)
    {
        double delta;
     
        if(a==0)
            if (b==0)
                if(c!=0)
                    *nbracines=-2;
                else
                    *nbracines=-1;
            else
            {
                *nbracines=1;
                *x1=-c/b;
            }
     
        else
        {
            delta=b*b-4*a*c;
     
            if(delta<0)
                *nbracines=0;
            else
            {
                *nbracines=2;
                *x1=(-b+sqrt(delta))/(2*a);
                *x2=(-b-sqrt(delta))/(2*a);
            }
        }
    }
     
    int main()
    {
        double a,b,c,x1,x2;
        int nbracines,ok;
        char rep;
     
        do
        {
            printf("Entrez les coefficients a,b et c du polynome ax2+bx+c : \n");
     
            if(saisie(&a,'a')==-1 || saisie(&b,'b')==-1 || saisie(&c,'c')==-1)
                exit(-1);
     
            racines_polynome(a,b,c,&nbracines,&x1,&x2);
     
            switch (nbracines)
            {
                case -2 : printf("Le polynome est constant et n'a pas de racines.\n");break;
     
                case -1 : printf("Le polynome est nul et a une infinite de racines.\n");break;
     
                case 0 : printf("Le polynome n'a pas de racines dans R.\n");break;
     
                case 1 : printf("Le polynome est du premier degre; racine=%lf.\n",x1);break;
     
                case 2 : {  if ( x1 == x2 )
                                printf( "Le polynome a une racine double; racine = %lf\n" , x1 );
                            else
                                printf( "Le polynome a 2 racines;x1 = %lg; x2 = %lf\n" , x1 , x2 );
                         }
            }
     
            printf("Voulez-vous recommencer ? o/n");
            scanf("%c",&rep);
            while(getchar()!='\n');
     
        } while (tolower(rep)!='n');
     
        return 0;
    }

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par benjamin_malaussene Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(c!=0)
        *nbracines=-2;
    else
        *nbracines=-1;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *nbracines=(c != 0) ?-2 :-1;
    ...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si tu fais un scanf("%d"), comme tu es obligé de valider ta saisie par <return> tu stockes dans stdin un caractère '\n' qui n'est pas récupéré par scanf("%d") (ou scanf("%f")).
    A la saisie suivante (surtout si tu fais saisir une chaine), tu récupères alors ce '\n' à la place de ce que tu aurais aimé taper...
    Ce que je veux dire, c'est qu'après un scanf("%d") on a toujours un \n restant dans le buffer clavier, et donc on n'est jamais confronté au problème de devoir appuyer une seconde fois sur Entrée.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Résoudre une équation du second degré
    Par Emmanuel Delahaye dans le forum Télécharger
    Réponses: 3
    Dernier message: 04/12/2011, 02h59
  2. Résolution d'équation de second degrès dans C
    Par acidburns dans le forum Débuter
    Réponses: 5
    Dernier message: 07/11/2011, 21h46
  3. Méthode de résolution d'une équation degré 3
    Par mysty57 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 03/10/2009, 21h11
  4. Résolution d'une équation trigonométrique
    Par tlemcenvisit dans le forum Algorithmes et structures de données
    Réponses: 21
    Dernier message: 20/08/2009, 17h47
  5. Visual basic: algo résolvant une équation du second degré
    Par mauriiice dans le forum VB 6 et antérieur
    Réponses: 15
    Dernier message: 05/12/2005, 17h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo