Partage
  • Partager sur Facebook
  • Partager sur Twitter

programmer une equation du second degre en C

Les pointeurs

3 mars 2007 à 21:01:20

Bonsoir a tous,
Je suis un pt peu un debutant en programmation(langage C)et j'ai 2 exercices qui me sont difficile a resoudre,avant de les poser j'ai bien-sur regarde ds les cours donnes sur ce web comme cela est conseille et j'ai vu un sur l'equation du second degre qui semblait m'aider mais je suis encore bloque:
Exercice 1:On me demande d'ecrire une fonction int qui determine les racines d'une equat.second degre.
S'il ya 2 solutions,la fonction retourne 2 et donne des solutions a l'aide de 2 donnees de sorties;s'il ya une solution,la fonction retourne 1 et les 2 donnees de sorties ont la meme solution,si c'est pas ces 2 cas-la la fonction retourne 0.
Ecrit un programme dans lequel l'utilisateur peut faire entrer les coefficients de type"double"ds l'equation et qui ensuite montre les racines.
P.S:je ne pense pas qu'il est necessaire de reprendre les formules mathematique d'une equation du second degre,mais on me dit effectivement que pour calculer le delta(le discriminant),je peux utiliser la fonction standard "sqrt(double x)"qu'on trouve ds <math.h>
L'analyse que j'ai trouve sur le site est tout pres de ma reponse,sauf qu'en essayant d'eliminer les parties dont je n'en avais pas besoin(somme,soustraction etc...) le compilateur m'a envoye des fautes(peut-etre par ce que je l'ai mal morcele),l'autre probleme est qu'on me demande d'utiliser les pointeurs ds la solution.
Exercice 2::Ecrire un programme pour la somme a l'aide de for-declaration(for-statement): ax+a^2x^2+a^3x^3+........+a^10x^10 avec a=2 et x=3 et qui fait apparaitre la reponse sur l'ecran.
En y inserant ces valeurs de a et x la reponse doit-etre:6+36+216.......+60466176=72559410 L'analyse doit inclure l'expression d'incremention:"for(i=0,i<=9,i++)"
Tous ces 2 exercices doivent etre analyser en langage C.
Je vous remercie d'avance du temps que vous consacrez a ces exercices
  • Partager sur Facebook
  • Partager sur Twitter
3 mars 2007 à 21:07:00

C'est pas un peu compliqué ( je parle des calculs :D ) pour t'entrainer ?
  • Partager sur Facebook
  • Partager sur Twitter
3 mars 2007 à 21:17:29

Citation : MUTHA

Exercice 1:On me demande d'ecrire une fonction int qui determine les racines d'une equat.second degre.
S'il ya 2 solutions,la fonction retourne 2 et donne des solutions a l'aide de 2 donnees de sorties;s'il ya une solution,la fonction retourne 1 et les 2 donnees de sorties ont la meme solution,si c'est pas ces 2 cas-la la fonction retourne 0.
Ecrit un programme dans lequel l'utilisateur peut faire entrer les coefficients de type"double"ds l'equation et qui ensuite montre les racines.


Ca me parait très clair. Je serais toi, je commencerais par définir l'interface de la fonction (son prototype, quoi...)

Citation : Pas de titre

P.S:je ne pense pas qu'il est necessaire de reprendre les formules mathematique d'une equation du second degre,


Ah bon ? Tu crois que l'informatique, c'est magique et que le code se génère tout seul ?

Ben non. Il faut écrire le code en fonction de ce que tu connais du 'métier' pour lequel tu travailles (ici, les mathématiques'. Ce 'métier' a ses regles (formules de calcul du discriminant, et des racines réelles). Il faut donc les appliquer dans leur plus extrême rigueur (attention à ne pas passer de nombre <0 à sqrt(), par exemple, ou aux divisions par 0). Le fait que la réalisation se fasse en C introduit d'autres gags liés à l'utilisation des nombres à virgule flottante...

Fait de ton mieux et poste ton code.

Citation : Pas de titre

Je vous remercie d'avance du temps que vous consacrez a ces exercices


On veut bien corriger quelque chose, mais c'est à toi de poster le code...
  • Partager sur Facebook
  • Partager sur Twitter
Music only !
4 mars 2007 à 1:26:18

Bonsoir,

Voici les formules:
Equation du second degre:ax^2+bx+c=0
D(discriminant)=b^2-4ac
Si D<0 alors il n'ya pas de solution(solutions reelle,je veux dire){ex:a=1;b=1,c=1}
Si D=0 alors x1=-b/2a {ex:a=1;b=4;c=4}
Si D>0 alors x1=(-b+sqrt(b^2-4ac))/2a et x2=(-b-sqrt(b^2-4ac))/2a {ex:a=3; b=-21;c=36}
Je ne sais pas si cette fois-ci j'ai repondu a la question qui m'a ete posee ou si c'est mon code sur le site que je dois donner.
P.S:Je suis entrain de relire aussi le cours donne sur ce site sur les pointeurs et autre pour remonter la pente.

Merci d'avance

MUTHA
M69
  • Partager sur Facebook
  • Partager sur Twitter
4 mars 2007 à 3:14:32

Citation : MUTHA


Voici les formules:
Equation du second degre:ax^2+bx+c=0
D(discriminant)=b^2-4ac
Si D<0 alors il n'ya pas de solution(solutions reelle,je veux dire){ex:a=1;b=1,c=1}
Si D=0 alors x1=-b/2a {ex:a=1;b=4;c=4}
Si D>0 alors x1=(-b+sqrt(b^2-4ac))/2a et x2=(-b-sqrt(b^2-4ac))/2a {ex:a=3; b=-21;c=36}


OK. Et le code ?
  • Partager sur Facebook
  • Partager sur Twitter
Music only !
4 mars 2007 à 9:47:48

Hum il te demande, dans la fonction où tu calcul le discriminant,de retourner une valeur 0, 1 ou 2 et aussi si il y a des racines, de retourner celles-ci donc.
Connais-tu les pointeurs? Car là tu n'y echappe pas ^^ .


PS: Ah oui une autre question, on te demande de résoudre l'équation dans l'ensemble des réels ou dans l'ensemble des complexes? Logiquement ça devrait être marqué sur ton énoncé... mais ça n'y est pas.

@FUBU : Non c'est très simple de calculer un discriminant, à condition biensûr de connaitre la formule, et connaitre les équations du second degré (vus en 1ere).
  • Partager sur Facebook
  • Partager sur Twitter
4 mars 2007 à 10:04:53

Citation : UltimAKnighT

PS: Ah oui une autre question, on te demande de résoudre l'équation dans l'ensemble des réels ou dans l'ensemble des complexes? Logiquement ça devrait être marqué sur ton énoncé... mais ça n'y est pas.


Citation : énoncé

S'il ya 2 solutions,la fonction retourne 2 et donne des solutions a l'aide de 2 donnees de sorties;s'il ya une solution,la fonction retourne 1 et les 2 donnees de sorties ont la meme solution,si c'est pas ces 2 cas-la la fonction retourne 0.


Pour moi, c'est réel uniquement...
  • Partager sur Facebook
  • Partager sur Twitter
Music only !
4 mars 2007 à 10:49:57

Bonjour,

Toutes les solutions doivent etre reelles donc pas de solutions complexes(autrement dit je n'aurai pas ecrit que pour Delta=0 il n'y aurai pas de solutions,sauf que meme je l'ai marque ds les parentheses que toutes les solutions sont reelles).
Les pointeurs c'est le chapitre que ns abordons pour l'instant a l'ecole mais comme je ne vois pas comment analyser ces 2 exercices j'ai sollicite votre aide et en meme temps je les relis aussi sur le site pour remonter effectivement la pente,mais c'est chaud.

MUTHA
  • Partager sur Facebook
  • Partager sur Twitter
4 mars 2007 à 10:58:05

Si tu veux de l'aide poste, ce que tu as fait et ce que tu ne comprend pas. Il n'est pas question d'écrire le code à ta place.
  • Partager sur Facebook
  • Partager sur Twitter
Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
4 mars 2007 à 11:26:39

Citation : Mutha


l'autre probleme est qu'on me demande d'utiliser les pointeurs ds la solution.


Ah oui, on te demande ça pour résoudre une équation du second degré ? pourquoi faire simple quand on peut faire compliqué.

Visiblement tu es très débutant, donc dans un premier temps cherche à écrire un programme qui tourne même si par exemple tout ton programme est dans le main. Une fois que ton programme tournera, ce sera assez facile de le découper en une ou plusieurs fonctions autres que la fonction main.

Ton exercice comporte deux volets indépendants :
a) le calcul des solutions,
b) la gestion des entrées/sorties.
------

Concernant le a), c'est très très classique. Tu peux faire de plusieurs façons mais une instruction switch qui correspond au trois cas me semble adapté. Pour le calcul des racines, bien que ce ne soit pas du tout indispensable, tu pourras remarquer que :
- il te suffit d'un seul calcul avec la racine carrée, disons x1=(-b-sqrt(delta))/(2*a), car l'autre racine vaut x2=-x1-b/a (la somme des racines vaut -b/a).
- le cas numéro 2 est un cas particulier du numéro 1 (donc ce serait bien que tu construises une fonction qui te calcule juste une racine).

Quand tu testes ton programme, prends les coefficients a, b et c comme des variables de ta fonctions main,
donc par exemple tu écris au début du main un truc du genre

double a=5.0, b=2.3, c=-3.4;

Une fois que ton programme sera au point, passe au b) et là tu pourras faire entrer des valeurs arbitraires pour tes coefficients a, b et c. Au passage l'énoncé ne dit pas ce qu'il faut faire si a=0.
  • Partager sur Facebook
  • Partager sur Twitter
4 mars 2007 à 12:29:17

Citation : UltimAKnighT


@FUBU : Non c'est très simple de calculer un discriminant, à condition biensûr de connaitre la formule, et connaitre les équations du second degré (vus en 1ere).



Surement mais je ne connais pas encore la formule, je suis pas encore en 1ere :D
  • Partager sur Facebook
  • Partager sur Twitter
4 mars 2007 à 12:30:27

Ok autant pour moi, mais selon moi un énoncé mathematique bien fait le précise toujours...
  • Partager sur Facebook
  • Partager sur Twitter
4 mars 2007 à 12:38:14

bon, au cas où ...
ax²+bx+c=0
il faut calculer le discriminant delta.
delta = b²-4ac

cas 1:
delta > 0
l'équation a deux solution
x1 = (-b-racine(delta))/(2a)
x2 = (-b+racine(delta))/(2a)

cas 2:
delta = 0
l'équation a une racine double.
x0 = -b/(2a)

cas 3:
delta < 0
l'équation a deux racines complexes. Mais si tu es pas encore en première on va plutot dire que l'équation n'a pas de solutions.
  • Partager sur Facebook
  • Partager sur Twitter
4 mars 2007 à 12:54:19

Je pense que MUTHA n'est plus au lycée Guizmus...
S'il a des cours d'info, c'est qu'il n'y est plus.
  • Partager sur Facebook
  • Partager sur Twitter
4 mars 2007 à 13:11:50

Lol pas faux... Désolé, pas bien réveillé moi...
  • Partager sur Facebook
  • Partager sur Twitter
4 mars 2007 à 15:58:57

Bonjour,

Je suis tjrs-la pour essayer de resoudre mes exercices surtout que je dois les rendre demain soir!!(le temps me serre)
Je continue de faire mon mieux depuis le matin,donc je zigzage entre le site,le compilateur et les livres mais...........
Voila ce que j'ai essaye de faire avec l'incrementation sur l'exercice de somme mais la chaine de sommation ne marche pas

#include <stdio.h>
#include <math.h>
void main ()
{int x,a,i;
float som=0;
printf("entre la valeur de x : ");
scanf("%d",&x);
printf("entre la valeur de a : ");
scanf("%d",&a);
for (i=0;i<=9;i++)
som=pow(x*a,i);
printf("resultat :%f\n",som);
}
  • Partager sur Facebook
  • Partager sur Twitter
4 mars 2007 à 16:22:15

Citation : MUTHA


#include <stdio.h>
#include <math.h>
void main ()
{int x,a,i;
float som=0;
printf("entre la valeur de x : ");
scanf("%d",&x);
printf("entre la valeur de a : ");
scanf("%d",&a);
for (i=0;i<=9;i++)
som=pow(x*a,i);
printf("resultat :%f\n",som);
}


  • Merci d'utiliser les balises de code. C'est expliqué dans les regles du forum que tu aurais dû lire...
  • main() retourne int. Toujours.
  • Si une fonction n'a pas de paramètres, on le précise avec (void)
  • Apprends à indenter don code. Il est illisible...
  • float ne sert qu'au stockage. Pour les calculs, c'est double.
  • MATH : j'aurais plutôt saisi les paramètres de la fonction, non ? a, b, c ?
  • J'ai rien compris. On est plus dans l'équation du 2ème degré ?. Un post par question, c'est la regle...
  • Partager sur Facebook
  • Partager sur Twitter
Music only !
4 mars 2007 à 16:37:53

Bonjour,

Le message de depart contenait 2 exercices dont celui-ci et celui du second degre.

Merci
  • Partager sur Facebook
  • Partager sur Twitter
4 mars 2007 à 16:53:04

J'ai rajouté 3 commentaires à ton programme. Essaye de répondre aux questions qu'ils soulèvent et tu devrais pouvoir en déduire le code correct.


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

int main(void)
{
int x,a,i;
double som=0;

    printf("entre la valeur de x : ");
    scanf("%d",&x);

    printf("entre la valeur de a : ");
    scanf("%d",&a);

    /* Quelles valeurs va prendre i ? */
    for (i=0;i<=9;i++)         
    {
        /* Combien vaut som à chaque passage ? */
        som = pow(a*x,i);       
    }
    /* combien vaut som finalement ? */
    printf("resultat :%lf\n",som);

    return 0;
}
  • Partager sur Facebook
  • Partager sur Twitter
Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
Anonyme
4 mars 2007 à 17:21:27

Bon l'exercie sur le polynome du second degrés me semblais interessant voila ce que j'ai fais :

#include <stdio.h>
#include <stdlib.h>
#include <math.h> // ne pas oublier afin de calculer la racine

int polynome( double a, double b, double c, double *x1, double *x2);

int main()
{
        double a =0, b =0, c =0, x1 =0, x2 =0; // ax^2+bx+c
        long solution =0;

//--------------------------------- PRESENTATION -----------------------------

    printf( "      * * * * *         * * * * * * * * * * * * * *          * * * * * * \n\n" );
    printf( "               * * * * *     PROGRAMME POLYNOME     * * * * *\n\n" );
    printf( "      * * * * *         * * * * * * * * * * * * * *          * * * * * * \n\n\n" );

// -------------------- On demmande a l'uttilisateur de choisir a b et c ---------------

         do{

        printf("\n Merci de choisir a :");
        scanf("%lf", &a);

        printf("\n Merci de choisir b :");
        scanf("%lf", &b);

        printf("\n Merci de choisir c :");
        scanf("%lf", &c);

        if( a == 0)
            printf(" Nous cherchons des solutions reels , a doit etre different de 0\n");

        }while( a == 0);

        printf("\n\nOn a donc f(x) = %.2lfx^2 + %.2lfx + %.2lf", a, b, c);

        printf("\n\nOn a donc f(x) = %.2lfx^2 + %.2lfx + %.2lf", a, b, c);

// ------------------- Appelle de la fonction qui calcul les racines ------------------

    solution = polynome( a, b, c, &x1, &x2);

// ----------- On affiche la reponse en fonction du nombre retourné par la fonction -------------

    if ( solution == 2)
        printf("\n\n x1 = %.2lf et x2 = %.2lf", x1, x2);

    else if ( solution == 1)
        printf("\n\n x0 = %lf ", x1);

    else
        printf("\n\nIl n'y a pas de solutions dans l'enssemble R .");



        return 0;
}



int polynome( double a, double b, double c, double *x1, double *x2)
{
    double deltat, rdeltat, r1, r2;

    deltat = b*b - 4*a*c; // j'aurais pu faire appelle a la fonction pow .  : pow(b,2);
    rdeltat = sqrt(deltat);// je stock la racine dans la variable . Pas trés utile mais c'est pour allegerle calcule en bas

    printf("\n\n\n\n\n Cherchons le discriminant Deltat du polynome");
    printf("\n\n    Deltat = b^2-4*a*c = %.2lf^2 - 4*%.2lf*%.2lf = %.2lf", b , a , c, deltat);

    if (deltat > 0)
    {
        printf("\n\n deltat > 0 . On a donc deux solutions reels x1 et x2");

        r1 = (-b-rdeltat)/(2*a); //  ici je ne pouvais pas faire le calcule avec le pointeur
        r2 = (-b+rdeltat)/(2*a); //  j'ai donc fait appelle a deux variables r1 et r2
        *x1=r1;
        *x2=r2;

        return 2;
    }

    else if( deltat == 0)
    {
        printf("\n\n deltat =0 . On a donc une solution reel double x0");

        r1 = r2 = -b/(2*a); //  r1 = r2 car il y a une solution double
        *x1 = *x2 = r1; 

        return 1;
    }

    else
    {
        return 0; // pas de solution reel retourne 0
    }

}


Je pense qu'il y avais plus simple( mais bon contrainte de l'exercice d'une part et j'ai pas passé beaucoups de temps sur l'exercice) . J'attend toute vos critique pour ameliorer ce code .

EDIT : J'ai rajouté une securité si a =0 . Merci a candide d'avoir souligné ce point qui certe pas precisé dans l'ennoncé était responsable d'un bug.
  • Partager sur Facebook
  • Partager sur Twitter
4 mars 2007 à 17:51:07


</code>{
     printf ("ax² + bx + c\n");
             printf ("Quelle est la valeur de a?\n");
             scanf ("%lf", &a);
             printf ("Quelle est la valeur de b?\n");
             scanf ("%lf", &b);
             printf ("Quelle est la valeur de c?\n");
             scanf ("%lf", &c);

             printf ("%lfx²+%lfx+c\n", a, b, c);

             printf ("delta = b*b - 4ac\n");
             delta = b*b - (4* a * c);
             printf ("delta = %lf\n", delta);

             if (delta ==0)
             {
             printf ("x = -%lf/ (2* %lf)\n", b, a);
             X0 = - b / (2* a);
             printf ("X0 = %lf\n", X0);

}

             if (delta > 0)
             {
                       printf ("X1 = -b - racine(delta) / 2a\n");
                       X1 = (-b - sqrt(delta))/2*a;
                       printf ("X1 = %lf\n", X1);
                       printf ("\n");
                       printf ("X2 = -b + racine(delta) / 2a\n");
                       X2 = (-b + sqrt(delta))/2*a;
                       printf ("X2 = %lf\n", X2);
}
         if (delta<0)
{
printf ("il n'y a pas de solutions\n");
}
}
<code type="c">

il faut ajouter la fonction, et les variables(a,b,c,x1,x2,x0)
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
4 mars 2007 à 18:40:13

Hum tu rigoles la ?

Le but d'un exercice est de s'exercer je t'apprends rien :p il faut donc suivre les conssigne .Ensuite dans n'importe quel language il faut etre le plus claire possible ( les fonction sont donc la pour sa en parties pour sa)le main est " juste " la pour gerer le programme et faire apelle au differente fonctions ( eh oui en generale le main ne contient pas beaucoups de code il fait surtt apelle au autre fonction). A mon avis cette exercice est fait pour apprendre a uttiliser les fonctions ainsi que les pointeurs de plus je cite :

Citation : MUTHA

On me demande d'ecrire une fonction int qui determine les racines d'une equat.second degre



Citation : MUTHA

S'il ya 2 solutions,la fonction retourne 2 et donne des solutions a l'aide de 2 donnees de sorties;s'il ya une solution,la fonction retourne 1 et les 2 donnees de sorties ont la meme solution,si c'est pas ces 2 cas-la la fonction retourne 0.



et normalement il ne faut pas de varaible x0 puisqu'il est dit que lorsque deltat = 0 on renvoie deux sorties ont la meme valeurs

  • Partager sur Facebook
  • Partager sur Twitter
4 mars 2007 à 18:58:05

Citation : alxalpha


Hum tu rigoles la ?


Pardon ?

Il me semble the legend est allé droit à l'essentiel et a bien cerné les difficulté du posteur original, que demande le peuple ?

EDIT je viens de regarder ce que tu as posté, ça me semble tout à fait correct à des détails près. Mais alors seulement ce n'est vraiment pas sobre. Tu crois pas que tes pointeurs x1 et x2 servent à quelque chose ? l'énoncé dit d'en utiliser mais c'est complètement débile et artificiel, un peu de sens critique ! Tu n'as pas traité le cas a=0 qui pourrait créer une exception. Pourquoi écris-tu deltat avec un t ? Tu dis toi-même dans un autre message que la fonction main doit être réduite au minimum alors pourquoi ne pas créer une fonction qui gère les entrées et une fonction qui gère l'affichage de la réponse ? Bye
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
4 mars 2007 à 19:24:12

Me revoila pour le deuxieme exercice :D

pour commencer je ne suis pas la pour me battre ou me prendre la tete :p mais

Citation : candide

Il me semble the legend est allé droit à l'essentiel et a bien cerné les difficulté du posteur original, que demande le peuple ?



posteur original ???????
que demande le peuple ? Sur un forum de l'aide et si il pose un exercice je pense qu'il recherche la reponse au probleme posé et pas un autre non ?

Enfin bref voila ce que j'ai fait pour le deuxieme exercice qui ma pris la tete a cause de sa : ax au debut je pensait qu'il y avait une faute de phrape et j'ai fait avec a^x . ensuite a^2x^2 c'est relou car on comprend pas bien enfin moi je comprennais pas trop .


/* Exercice 2::Ecrire un programme pour la somme a l'aide de
for-declaration(for-statement): ax+a^2x^2+a^3x^3+........+a^10x^10
avec a=2 et x=3 et qui fait apparaitre la reponse sur l'ecran.
En y inserant ces valeurs de a et x la reponse doit-etre
:6+36+216.......+60466176=72559410 L'analyse doit inclure
l'expression d'incremention:"for(i=0,i<=9,i++)" */



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

int main()
{
    long i, solution[10] ={0}, s;
    long a =0, x =0;

    printf (" une valeur pour a : ");
    scanf("%ld", &a);

    printf(" une valeur pour x : ");
    scanf("%ld", &x);

        for(i =0; i <= 10 ; i++)
    {
        if ( i == 0)
            solution[i] = 0;

        else if( i == 1)
            solution[i] = a*x;

        else
        {
            s = pow( x , i);
            solution[i] = pow(a , i)*s;
        }
    }

        for(i =1 ; i <= 10 ; i++)
    {
        if( i == 1)
            printf(" ax +");

        else if ( i == 10)
            printf(" a^%ld*x^%ld =", i, i);

        else
            printf(" a^%ld*x^%ld +", i, i);
    }

    for(i =0 ; i <= 10 ; i++)
    {
        printf(" %ld +", solution[i]);
        s += solution[i];
    }


    printf(" = %ld ", s);

        return 0;
}


Le seul probleme c'est que je ne vois pas du tt l'interet du for demandé : for(i=0,i<=9,i++) j'ai donc pris la liberter de mettre 10 et pas 9 .

Allez faite ce que vous savez faire de mieux et critiquez le code ainsi que mon message aussi si vous voulez

EDIT : La plupart de tes questions on pour reponse : je reponds a l'ennoncé posé
Sinon pour la sobriété : je copie le code ecrit de code block. Et sur le site du zero la largeur du code est plus petite que sur code block dc sa passe a la ligne en dessous d'ou le code grade et pas trés lisible. Essay de copier le code dans code block tu vas constater que le code est trés claire et lisible .
Pourquoi delta a un t : pourquoi pas :p non enfet j'ai mis un t dans la declaration contre ma volonté :p et du coups par flemme j'ai continué avec le t .
  • Partager sur Facebook
  • Partager sur Twitter
4 mars 2007 à 19:38:52

Citation : alxalpha


posteur original ???????


Ca dit pas que le monsieur il a beaucoup d'originalité, non, ça se réfère à celui qui a envoyé (posté) le message à l'origine de la discussion. On écrit d'ailleurs souvent PO.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
4 mars 2007 à 19:44:12

autant pour moi . Tu viens de m'apprendre quelque chose :)
  • Partager sur Facebook
  • Partager sur Twitter
4 mars 2007 à 21:16:12

Citation : alxalpha

Bon l'exercie sur le polynome du second degrés me semblais interessant voila ce que j'ai fais :

Je pense qu'il y avais plus simple( mais bon contrainte de l'exercice d'une part et j'ai pas passé beaucoups de temps sur l'exercice) . J'attend toute vos critique pour ameliorer ce code .


Au moins, ça compile sans trop de problèmes. Manque juste un (void) à main.

Par contre :

  • Tu pourrais nous épargner des présentations à la gomme... Les *** on en a rien a faire, a moins que tu ne créées une fonction d'encadrement automatique d'un titre...
  • l'indentation n'est pas régulière. Utilise un indenteur...
  • Il est inutile de séparer le prototype d'une fonction 'locale'. Il suffit de la définir avant de l'utiliser. Elle peut être qualifiée 'static'.
  • OK, pour le 'pow()' à la main.
  • Ne pas mettre de commentaires en fin de lignes. Illisible. Les mettre au-dessus et utiliser /* */. (// n'est pas portable: C99 uniquement)
  • Eviter les fautes d'orthographe grossières dans les commentaires et surtout dans les textes affichés !.
  • Quel est le sens du 't' dans 'deltat' ?
  • Quand c'est possible, il est bon de donner aux variables directement leur bonne valeur. Ca permet, entre autres, de la protéger (const : accès en lecture seule).
  • Eviter les affectations multiples. OK, c'est très C-geek, mais c'est surtout très illisible...
  • éviter les returns multiples. Ici, c'est sans danger, mais dans des fonctions avec allocations de ressources, c'est mortel. Autant éviter de donner de mauvaises habitudes (mal comprises) aux débutants.
  • Il est utile de vérifier si les pointeurs des racines sont valides, et de signaler l'erreur... (ret=-1, par exemple)
  • on ne peut pas calculer 'rdeltat' si le Delta est négatif.
  • avec un entier, utiliser plutôt switch-case que if-else-if.
  • le type de 'solution' est int et non long.
  • les saisies par scanf() sont fragiles... Utiliser fgets() + strtod().
  • attention à l'abus de '\n' en début de ligne et à leur absence en fin de lignes.


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <errno.h>

static int polynome (double a, double b, double c, double *x1, double *x2)
{
   int ret;
   /* j'aurais pu faire appel a la fonction pow .  : pow(b,2); */
   double const delta = b * b - 4 * a * c;

   printf ("\n\n\n\n\n Cherchons le discriminant Delta du polynome");
   printf ("\n\n    Delta = b^2-4*a*c = %.2lf^2 - 4*%.2lf*%.2lf = %.2lf", b,
           a, c, delta);

   if (delta > 0)
   {
      /* je stocke la racine dans la variable . Pas trés utile mais c'est
         pour allegerle calcul en bas */

      double const rdelta = sqrt (delta);

      /* ici je ne pouvais pas faire le calcul avec le pointeur
         j'ai donc fait appelle a deux variables r1 et r2 */

      double const r1 = (-b - rdelta) / (2 * a);
      double const r2 = (-b + rdelta) / (2 * a);

      printf ("\n Delta > 0. On a donc deux solutions reelles x1 et x2\n");

      if (x1 != NULL && x2 != NULL)
      {
         *x1 = r1;
         *x2 = r2;
         ret = 2;
      }
      else
      {
         ret = -1;              /* erreur */
      }
   }
   else if (delta == 0)
   {
      double const r1 = b / (2 * a);

      printf ("\n deltat = 0. On a donc une solution reelle double x0\n");
      if (x1 != NULL && x2 != NULL)
      {
         /*  x1 = x2 car il y a une solution double */
         *x1 = r1;
         *x2 = r1;
         ret = 1;
      }
      else
      {
         ret = -1;              /* erreur */
      }
   }
   else
   {
      /* pas de solution reelle retourne 0 */
      ret = 0;
   }
   return ret;
}

double get_d (char const *prompt)
{
   double val;
   int err;
   do
   {
      printf ("%s : ", prompt);
      fflush (stdout);

      /* saisie */
      {
         char *pend;
         char s[16];
         fgets (s, sizeof s, stdin);

         /* nettoyage */
         {
            char *p = strchr (s, '\n');
            if (p != NULL)
            {
               *p = 0;
            }
            else
            {
               int c;
               while ((c = getchar ()) != '\n' && c != EOF)
               {
               }
            }
         }

         /* conversion, detection des erreurs */
         val = strtod (s, &pend);
         err = *pend != 0;
         err |= errno == ERANGE;
         if (err)
         {
            printf ("valeur '%s' incorrecte\n", s);
         }
      }
   }
   while (err);
   return val;
}

int main (void)
{
   double a = 0, b = 0, c = 0, x1 = 0, x2 = 0; // ax^2+bx+c
   int solution = 0;

/* -------------------------------- PRESENTATION ---------------------------- */

   printf ("PROGRAMME POLYNOME\n\n");

/* ----------- On demande a l'utilisateur de choisir a b et c --------------- */

   do
   {
      a = get_d ("Merci de choisir a");
      b = get_d ("Merci de choisir b");
      c = get_d ("Merci de choisir c");

      if (a == 0)
      {
         printf ("Nous cherchons des solutions reelles.\n"
                 "a doit etre different de 0\n");
      }

   }
   while (a == 0);

   printf ("On a donc f(x) = %.2lfx^2 + %.2lfx + %.2lf\n", a, b, c);

/* ------------- Appel de la fonction qui calcule les racines --------------- */

   solution = polynome (a, b, c, &x1, &x2);

/* -- On affiche la reponse en fonction du nombre retourné par la fonction -- */

   switch (solution)
   {
   case 2:
      printf ("x1 = %.2lf et x2 = %.2lf\n", x1, x2);
      break;
   case 1:
      printf ("x0 = %lf\n", x1);
      break;
   case 0:
      printf ("Il n'y a pas de solutions dans l'ensemble R.\n");
      break;
   default:
      printf ("erreur #%d\n", solution);
   }
   return 0;
}
  • Partager sur Facebook
  • Partager sur Twitter
Music only !
Anonyme
4 mars 2007 à 21:58:14

ouai sa tend vers la perfection :p

Bon quelque question :

#include <errno.h> c'est quoi???
#include <string.h> pour quoi faire ?
EDIT : pardon j'ai pas vu char *p = strchr (s, '\n');

Citation : -ed-

Tu pourrais nous épargner des présentations à la gomme... Les *** on en a rien a faire, a moins que tu ne créées une fonction d'encadrement automatique d'un titre..



C'est pour faire beau :D

Citation : -ed-

l'indentation n'est pas régulière.



Ha bon ???? un exemple ?? ( je rapelle que j'ai fait un copier coller a partir de code blocks. C'est pour cela que certaine phrases trop longue reviennent a la ligne

Citation : -ed-

Utilise un indenteur...



Sa existe ??? Ou puis je m'en procurer un . Car pour certain programme long c'est prise de tete si l'indentation est mal faite

Citation : -ed-

Eviter les fautes d'orthographe grossières dans les commentaires et surtout dans les textes affichés !.



J'ai toujours eu zero en dictée

Citation : -ed-

Quel est le sens du 't' dans 'deltat' ?



Deja expliqué un peu plus haut . Tu vas voir c'est basé sur un resonnement trés fondé

Citation : -ed-

Eviter les affectations multiples. OK, c'est très C-geek, mais c'est surtout très illisible...



Je prends note . Merci pour ce genre de remarque toute bete qui permette vraiment d'aider les pti noob comme moi :p

Citation : -ed-

éviter les returns multiples. Ici, c'est sans danger, mais dans des fonctions avec allocations de ressources, c'est mortel. Autant éviter de donner de mauvaises habitudes (mal comprises) aux débutants.



Enfete j'ai mal lu l'ennoncé je pensais qu'il était demmandé 3 return different or il fallais retourner des valeurs differentes . On pouvait , on devait donc utiliser un seul return .

Citation : -ed-

Il est utile de vérifier si les pointeurs des racines sont valides, et de signaler l'erreur... (ret=-1, par exemple)



Il est vrai que je n'y pense aps assez et ceux parceque je n'en voit pas l'utilité . Comment pourait il y avoir une erreur ????? ( a ce moment la se serais plutot pour les gros programme nn? enfin je ne sait pas )

Citation : -ed-

le type de 'solution' est int et non long.



Ha bon ?? et pourquoi pas?

Citation : -ed-

les saisies par scanf() sont fragiles... Utiliser fgets() + strtod().



Entiérement d'ccord mais MUTHA debute et je ne pense pas qu'il connaisse strtod , ssancf ...


Sur ceux bonne soiré
  • Partager sur Facebook
  • Partager sur Twitter
4 mars 2007 à 22:34:15

Citation : alxalpha


Bon quelque question :

#include <errno.h> c'est quoi???


C'est pour accéder à la variable globale du C 'errno' (error number) qui contient le code de la dernière erreur causée par une fonction de la bibliothèque. On peut visualiser l'erreur avec perror().

Citation : Pas de titre


Citation : -ed-

l'indentation n'est pas régulière.



Ha bon ???? un exemple ?? ( je rapelle que j'ai fait un copier coller a partir de code blocks. C'est pour cela que certaine phrases trop longue reviennent a la ligne




int main()
{
        double a =0, b =0, c =0, x1 =0, x2 =0; // ax^2+bx+c

indentation de 9

         do{

        printf("\n Merci de choisir a :");
        scanf("%lf", &a);

indentation de -2 !

        if( a == 0)
            printf(" Nous cherchons des solutions reels , a doit etre
 

indentation de 5
etc.

Citation : Pas de titre


Citation : -ed-

Utilise un indenteur...



Sa existe ??? Ou puis je m'en procurer un . Car pour certain programme long c'est prise de tete si l'indentation est mal faite


Incorporé à Code::Blocks (Plugins > Astyle)

Citation : Pas de titre

J'ai toujours eu zero en dictée


Moi aussi, mais je travaille ça... J'ai du mal...

Citation : Pas de titre


Il est vrai que je n'y pense aps assez et ceux parceque je n'en voit pas l'utilité . Comment pourait il y avoir une erreur ????? ( a ce moment la se serais plutot pour les gros programme nn? enfin je ne sait pas )


Il n'y a pas de petits programmes. Une fonction comme ça pourrait très bien être placée en bibliothèque et être appelée par un abruti de passage qui mettrais 0 ou NULL en paramètre. Il faut se protéger de ça. C'est ce qu'on appelle la programmation défensive. Oui, c'est pro, mais c'est le moment de s'y mettre. (voir le concept de 'QoI' ou Quality of Implementation).

L'expérience prouve que si on ne code pas comme ça le premier jour, on ne revient jamais dessus parce qu'il y aura toujours un abruti de chef de projet pour te dire "on ne modifie pas du code qui marche".

Citation : Pas de titre


Citation : -ed-

le type de 'solution' est int et non long.



Ha bon ?? et pourquoi pas?


Tu as toi même défini le type retourné par la fonction. C'est int... De plus, switch() n'est garanti de fonctionner qu'avec des int.
  • Partager sur Facebook
  • Partager sur Twitter
Music only !
4 mars 2007 à 23:02:22

Bonsoir.


do
   {
      a = get_d ("Merci de choisir a");
      b = get_d ("Merci de choisir b");
      c = get_d ("Merci de choisir c");

      if (a == 0)
      {
         printf ("Nous cherchons des solutions reelles.\n"
                 "a doit etre different de 0\n");
      }

   }



Si a est nul, l'équation devient une équation du premier degré.
Il y aura alors une solution réelle, pour autant que b ne soit pas également nul.
  • Partager sur Facebook
  • Partager sur Twitter