polynome en programme C ( LLC)
Répondre à la discussion
Affichage des résultats 1 à 19 sur 19

polynome en programme C ( LLC)



  1. #1
    invited2313232

    Question polynome en programme C ( LLC)


    ------

    bonjour
    j'ai fais un pgm qui lit un polynome de degré n, l'affiche, le calcule en un point donné x, fait sa derivé ,et calcule la somme de 2 polynome en liste lineaire chainée j'ai aucune erreur ni warning or j'ai 2 problemes quand j'entre par exp le polynome : 3x^2-x^1+2x^0 il m'affiche :+2x^0-x^1+3x^^2 a lenver car l'insertion est par la tete je c pas comment faire pour changer ça !!!? le probleme est dans l'insertion mais je ny arrive pas a le résoudre
    et de meme pour la dérivé puisque je derive tanque l'exposant est superieur strictement a 0 et puisque dans l'insertion l'exposant 0 est le premier donc il ne derive pas et il sort de la compilation !!!
    si je met pas l'exposant 0 il derive normal mais ça reste tjr a lenver biensur!! or il compile normalement jusqua la fct de la somme il me dis c qui le max apres il sort je comprend pas pk !!?
    svp aidez moi pliiiz merci d'avance

    ps: pour la derivé et la somme j'ai cree une nouvelle liste pour le 2 meme polynome aussi donc j'ai 4 liste en tt .

    voici mon pgm:



    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    typedef struct poly {float coef; // coefficient
                          int exp;   // l'exposant du x
                          struct poly*suiv;} maillon_p; // la structure du maillon d'un polynome
    
    
    typedef maillon_p*Liste; // l'ensemble des pointeurs sur les maillon_p
     Liste tete;
    
    void creer_Liste_poly(Liste*tete)
     {*tete=NULL;}
    
    void all_maillon_p(Liste*p)
    {*p=(Liste) malloc(sizeof(maillon_p));}
    
    void aff_coef(Liste p, float x) // unez fct pour affecter la valeur du coefficion x dans le champ coef du maillon pointé par p
    {p->coef=x;}
    
    void aff_exp(Liste p, int y) // une fct pour affecter la valeur de l'exposant y dans le champ exp du maillon pointé par p
    {p->exp=y;}
    
    void aff_adr(Liste p,Liste q) // une fct pour affecter ladresse qui est dans q dans le champ suiv du maillon pointé par p
    {p->suiv=q;}
    
    int expo(Liste p) // une fonction qui nous retourne l'exposant du x
    {return p->exp;}
    
    float coef(Liste p) // une fct qui nous retourne le coefficient
    {return p->coef;}
    
    Liste adr(Liste p) // une fct qui nous retourne l'adresse qui dans le champ suiv
    {return p->suiv;}
    
    int entrer_poly(Liste*tete, float x, int y) // une fct pour la saisie du polynome l'insertion
     {Liste p; int sortie = 0;
       all_maillon_p(&p);
        if( p!=NULL )// tanque la liste n'est pas vide
         {
          sortie=1;
          aff_coef(p,x);
          aff_exp(p,y);
          aff_adr(p,*tete);
          *tete=p;}
      return sortie;
     }
    
     void affiche_poly(Liste p) // une fct qui nous affiche le polynome
      {printf("P=");
        while(p!=NULL) // on parcoure tt la liste d'ou le polynome
         {
             if(coef(p)<0) // pour les nombres negatives
             printf("%f*x^%d",coef(p),expo(p));
             else
                  { if(coef(p)>0)// pour les nombres positives
                  printf("+%f*x^%d",coef(p),expo(p)); } // on ajoute le +
           p=adr(p); // pour parcourir tt le polynome (passer au terme suivant)
         }
    
      }
    
     void affiche_poly_deriv(Liste p) // une fct qui nous affiche la derivé du polynome
      {printf("P'=");// on a changer le P= a P'= pour montrer que c la derivé du polynome
        while(p!=NULL)
         {
             if(coef(p)<0)
             printf("%f*x^%d",coef(p),expo(p));
             else
                  { if(coef(p)>0)
                  printf("+%f*x^%d",coef(p),expo(p)); }
           p=adr(p);
         }
      }
    
     void affiche_poly_somme(Liste p) // une fct qui nous affiche la somme de 2 polynomes
      {printf("S=");// on a changer le P= a S= pour montrer que c la somme
        while(p!=NULL)
         {
             if(coef(p)<0)
             printf("%f*x^%d",coef(p),expo(p));
             else
                  { if(coef(p)>0)
                  printf("+%f*x^%d",coef(p),expo(p)); }
           p=adr(p);
         }
      }
    
    // la fonction qui calcule du polynome en un point x donné
    float calcul_poly(Liste p,double x)
    { double result=0;
    
       while (p!=NULL)
         {result=result+ coef(p)* pow(x,expo(p));
         p=adr(p);}// avancer pour calculer tt les termes du polynome
     return result;
     }
    
    // la fonction qui derive un polynome
     Liste derive_poly(Liste p,Liste *d)
    { Liste s;
    
      while(p!=NULL) // tanque  la liste n'est pas vide 
       {   if(expo(p)>0) // l'exposant doit être supérieur strictement a 0 
           all_maillon_p(&s); // on allouer un nouveau maillon s dans une nouvelle liste dont la tete est d et qui contiendra la derivé
           aff_coef(s,expo(p)*coef(p));
           aff_exp(s,expo(p)-1);
           aff_adr(s,*d);
           *d=s;
           p=adr(p);}
    
      return (*d);
    }
    // la fonction qui fait la somme de 2 polynomes
    Liste somme_poly(Liste l, Liste q,Liste *s,int max)// la liste du 1ere et 2eme polynome + la liste somme et le nbr max des termes de l'un des polynomes
     {Liste p; int i;
    
      for (i=1;i<= max;i++)
        {
          if (expo(l)==expo(q))
             {all_maillon_p(&p);
              aff_coef(p,coef(q)+(coef(l)));// j'ai mis les parentheses entre +( coef(l) ) en cas ou le nbr est negative pour ne pas crée d'erreur
              aff_exp(p,expo(q));
              aff_adr(p,*s);
              *s=p;
              l=adr(l);q=adr(q);}// pour avancer au autres termes
    
          else if(expo(l)>expo(q))
                 {all_maillon_p(&p);
    
                  aff_coef(p,coef(l));
                  aff_exp(p,expo(l));
                  aff_adr(p,*s);
                  *s=p;
                  l=adr(l);
                 }
               if(expo(l)<expo(q))
                 {all_maillon_p(&p);
                 aff_coef(p,coef(q));
                 aff_exp(p,expo(q));
                 aff_adr(p,*s);
                 *s=p;
                 q=adr(q);
                 }
          if (expo(l))// exemple (x^2+ x^1-3x^0)+(x^3-4x^2) on voit que pendant l'operation les termes x^1 et -3x^0 n'ont pas d'equivalent sur l'autre poly donc on vas les prendre individuellement un par un
             {all_maillon_p(&p);
              aff_coef(p,coef(l));
              aff_exp(p,expo(l));
              aff_adr(p,*s);
              *s=p;
              l=adr(l);
              }
          if (expo(p))
             {all_maillon_p(&p);
              aff_coef(p,coef(q));
              aff_exp(p,expo(q));
              aff_adr(p,*s);
              *s=p;
              q=adr(q) ;
             }
        } return (*s);
     }
    
    int main()
    { float x,res; int y; double z; int i=1 ; int test=1;// x=coef,y=exposant, z=la valeur pour la quelle le poly vas etre calculé,
       Liste l,d,D,s,S,v;// res =le resulta du calcule, l=la tete de la liste du poly ,d= la tete de la liste de la derivé
       int n,m,max; // s=la tete de la liste de la somme, v=la tete de la liste du 2 polynome
       creer_Liste_poly(&l);
    
    
            printf("donner le nombre de termes de votre polynome\n");//pour nous aider a inserer et faire le calculer de la somme apres
            scanf("%d",&n);
            printf("veillez entrer le premier coefficient de votre polynome \n");
            scanf("%f",&x);
            printf("veillez entrer le premier exposant de  votre polynome meme s'il est egale a zero\n");
            scanf("%d",&y);
            if(y<0) {printf("votre exposant doit etre positive\n"); printf("rettaper votre exposant.\n"); scanf("%d",&y);}
            test= entrer_poly(&l,x,y);
            if (test==0)
             printf("espace insuffisant\n");
    
    
       while(i<=n-1 && test==1) // tanque qu'il ya d'espace (test) et qu'on na pas encors terminer de taper notre polynome
    
         {
            printf("veillez entrer le coefficient \n");
            scanf("%f",&x);
            printf("veillez entrer le exposant meme s'il est egale a zero\n");
            scanf("%d",&y);
               if(y<0) {printf("votre exposant doit etre positive\n"); printf("rettaper votre exposant.\n"); scanf("%d",&y);}
            test= entrer_poly(&l,x,y);
            if (test==0)
             printf("espace insuffisant\n");i++;
         }
      printf("voici votre polynome:\n");
      affiche_poly(l);printf("\n\n");
    
      // le calcule du polynome en un point donné
      printf("veuillez entrer la valeur pour laquelle votre polynome sera calculé\n");
      scanf("%lf",&z);
      res=calcul_poly(l,z);
      printf("voici le resultat du calcule:%f\n",res);
    
    // le calcule de la derivé
     creer_Liste_poly(&d);/* la nouvelle liste ou on vas palcer la derivé dont la tete est d */
      D = derive_poly(l,&d);// la fonction derive_poly nous retourne 1 si oui O sinon
       printf("le polynome a étè deriver.\n");
    
       printf("voici la derivé de votre polynome:\n");
       affiche_poly_deriv(D);printf("\n\n");
    
    // la sommes de 2 polynomes
    creer_Liste_poly(&v);// la liste du 2eme polynome
    
            printf("donner le nombre de termes de votre 2eme polynome\n");
            scanf("%d",&m);
            printf("veillez entrer le premier coefficient de votre 2eme polynome \n");
            scanf("%f",&x);
            printf("veillez entrer le premier exposant de  votre 2eme polynome meme s'il est egale a zero\n");
            scanf("%d",&y);
            if(y<0) {printf("votre exposant doit etre positive\n"); printf("rettaper votre exposant.\n"); scanf("%d",&y);}
            test= entrer_poly(&v,x,y);
            if (test==0)
            printf(" espace insuffisant\n");i=1;
    
    
             while(i<=m-1 && test==1) // tanque qu'il ya d'espace (test) et qu'on veut continuer a taper
    
         {
            printf("veillez entrer le coefficient \n");
            scanf("%f",&x);
            printf("veillez entrer le exposant meme s'il est egale a zero\n");
            scanf("%d",&y);
            if(y<0) {printf("votre exposant doit etre positive\n"); printf("rettaper votre exposant.\n"); scanf("%d",&y);}
            test= entrer_poly(&v,x,y);
            if (test==0)
            printf("espace insuffisant\n");i++;
         }
      printf("voici votre 2eme polynome\n");
      affiche_poly(v);printf("\n");
    
    creer_Liste_poly(&s);// liste de la somme
     if(n>m)
     max=n;
     else if(m>n)||(m=n)
          max=m;
    
    S= somme_poly(l,v,&s,max);// la fct somme nous retourn la tete de la liste
    printf("voici votre polynome somme:\n");
    affiche_poly_somme(s);
    return 0;
    }

    -----
    Dernière modification par Jack ; 24/12/2011 à 15h33. Motif: Ajout balises code

  2. #2
    invited2313232

    Re : polynome en programme C ( LLC)

    c mieux comme ça
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    typedef struct poly {float coef; // coefficient
    int exp; // l'exposant du x
    struct poly*suiv;} maillon_p; // la structure du maillon d'un polynome
    
    
    typedef maillon_p*Liste; // l'ensemble des pointeurs sur les maillon_p
    Liste tete;
    
    void creer_Liste_poly(Liste*tete)
    {*tete=NULL;}
    
    void all_maillon_p(Liste*p)
    {*p=(Liste) malloc(sizeof(maillon_p));}
    
    void aff_coef(Liste p, float x) // unez fct pour affecter la valeur du coefficion x dans le champ coef du maillon pointé par p
    {p->coef=x;}
    
    void aff_exp(Liste p, int y) // une fct pour affecter la valeur de l'exposant y dans le champ exp du maillon pointé par p
    {p->exp=y;}
    
    void aff_adr(Liste p,Liste q) // une fct pour affecter ladresse qui est dans q dans le champ suiv du maillon pointé par p
    {p->suiv=q;}
    
    int expo(Liste p) // une fonction qui nous retourne l'exposant du x
    {return p->exp;}
    
    float coef(Liste p) // une fct qui nous retourne le coefficient
    {return p->coef;}
    
    Liste adr(Liste p) // une fct qui nous retourne l'adresse qui dans le champ suiv
    {return p->suiv;}
    
    int entrer_poly(Liste*tete, float x, int y) // une fct pour la saisie du polynome l'insertion
    {Liste p; int sortie = 0;
    all_maillon_p(&p);
    if( p!=NULL )// tanque la liste n'est pas vide
    {
    sortie=1;
    aff_coef(p,x);
    aff_exp(p,y);
    aff_adr(p,*tete);
    *tete=p;}
    return sortie;
    }
    
    void affiche_poly(Liste p) // une fct qui nous affiche le polynome
    {printf("P=");
    while(p!=NULL) // on parcoure tt la liste d'ou le polynome
    {
    if(coef(p)<0) // pour les nombres negatives
    printf("%f*x^%d",coef(p),expo( p));
    else
    { if(coef(p)>0)// pour les nombres positives
    printf("+%f*x^%d",coef(p),expo (p)); } // on ajoute le +
    p=adr(p); // pour parcourir tt le polynome (passer au terme suivant)
    }
    
    }
    
    void affiche_poly_deriv(Liste p) // une fct qui nous affiche la derivé du polynome
    {printf("P'=");// on a changer le P= a P'= pour montrer que c la derivé du polynome
    while(p!=NULL)
    {
    if(coef(p)<0)
    printf("%f*x^%d",coef(p),expo( p));
    else
    { if(coef(p)>0)
    printf("+%f*x^%d",coef(p),expo (p)); }
    p=adr(p);
    }
    }
    
    void affiche_poly_somme(Liste p) // une fct qui nous affiche la somme de 2 polynomes
    {printf("S=");// on a changer le P= a S= pour montrer que c la somme
    while(p!=NULL)
    {
    if(coef(p)<0)
    printf("%f*x^%d",coef(p),expo( p));
    else
    { if(coef(p)>0)
    printf("+%f*x^%d",coef(p),expo (p)); }
    p=adr(p);
    }
    }
    
    // la fonction qui calcule du polynome en un point x donné
    float calcul_poly(Liste p,double x)
    { double result=0;
    
    while (p!=NULL)
    {result=result+ coef(p)* pow(x,expo(p));
    p=adr(p);}// avancer pour calculer tt les termes du polynome
    return result;
    }
    
    // la fonction qui derive un polynome
    Liste derive_poly(Liste p,Liste *d)
    { Liste s;
    
    while(p!=NULL) // tanque la liste n'est pas vide 
    { if(expo(p)>0) // l'exposant doit être supérieur strictement a 0 
    all_maillon_p(&s); // on allouer un nouveau maillon s dans une nouvelle liste dont la tete est d et qui contiendra la derivé
    aff_coef(s,expo(p)*coef(p));
    aff_exp(s,expo(p)-1);
    aff_adr(s,*d);
    *d=s;
    p=adr(p);}
    
    return (*d);
    }
    // la fonction qui fait la somme de 2 polynomes
    Liste somme_poly(Liste l, Liste q,Liste *s,int max)// la liste du 1ere et 2eme polynome + la liste somme et le nbr max des termes de l'un des polynomes
    {Liste p; int i;
    
    for (i=1;i<= max;i++)
    {
    if (expo(l)==expo(q))
    {all_maillon_p(&p);
    aff_coef(p,coef(q)+(coef(l)));// j'ai mis les parentheses entre +( coef(l) ) en cas ou le nbr est negative pour ne pas crée d'erreur
    aff_exp(p,expo(q));
    aff_adr(p,*s);
    *s=p;
    l=adr(l);q=adr(q);}// pour avancer au autres termes
    
    else if(expo(l)>expo(q))
    {all_maillon_p(&p);
    
    aff_coef(p,coef(l));
    aff_exp(p,expo(l));
    aff_adr(p,*s);
    *s=p;
    l=adr(l);
    }
    if(expo(l)<expo(q))
    {all_maillon_p(&p);
    aff_coef(p,coef(q));
    aff_exp(p,expo(q));
    aff_adr(p,*s);
    *s=p;
    q=adr(q);
    }
    if (expo(l))// exemple (x^2+ x^1-3x^0)+(x^3-4x^2) on voit que pendant l'operation les termes x^1 et -3x^0 n'ont pas d'equivalent sur l'autre poly donc on vas les prendre individuellement un par un
    {all_maillon_p(&p);
    aff_coef(p,coef(l));
    aff_exp(p,expo(l));
    aff_adr(p,*s);
    *s=p;
    l=adr(l);
    }
    if (expo(p))
    {all_maillon_p(&p);
    aff_coef(p,coef(q));
    aff_exp(p,expo(q));
    aff_adr(p,*s);
    *s=p;
    q=adr(q) ;
    }
    } return (*s);
    }
    
    int main()
    { float x,res; int y; double z; int i=1 ; int test=1;// x=coef,y=exposant, z=la valeur pour la quelle le poly vas etre calculé,
    Liste l,d,D,s,S,v;// res =le resulta du calcule, l=la tete de la liste du poly ,d= la tete de la liste de la derivé
    int n,m,max; // s=la tete de la liste de la somme, v=la tete de la liste du 2 polynome
    creer_Liste_poly(&l);
    
    
    printf("donner le nombre de termes de votre polynome\n");//pour nous aider a inserer et faire le calculer de la somme apres
    scanf("%d",&n);
    printf("veillez entrer le premier coefficient de votre polynome \n");
    scanf("%f",&x);
    printf("veillez entrer le premier exposant de votre polynome meme s'il est egale a zero\n");
    scanf("%d",&y);
    if(y<0) {printf("votre exposant doit etre positive\n"); printf("rettaper votre exposant.\n"); scanf("%d",&y);}
    test= entrer_poly(&l,x,y);
    if (test==0)
    printf("espace insuffisant\n");
    
    
    while(i<=n-1 && test==1) // tanque qu'il ya d'espace (test) et qu'on na pas encors terminer de taper notre polynome
    
    {
    printf("veillez entrer le coefficient \n");
    scanf("%f",&x);
    printf("veillez entrer le exposant meme s'il est egale a zero\n");
    scanf("%d",&y);
    if(y<0) {printf("votre exposant doit etre positive\n"); printf("rettaper votre exposant.\n"); scanf("%d",&y);}
    test= entrer_poly(&l,x,y);
    if (test==0)
    printf("espace insuffisant\n");i++;
    }
    printf("voici votre polynome:\n");
    affiche_poly(l);printf("\n\n") ;
    
    // le calcule du polynome en un point donné
    printf("veuillez entrer la valeur pour laquelle votre polynome sera calculé\n");
    scanf("%lf",&z);
    res=calcul_poly(l,z);
    printf("voici le resultat du calcule:%f\n",res);
    
    // le calcule de la derivé
    creer_Liste_poly(&d);/* la nouvelle liste ou on vas palcer la derivé dont la tete est d */
    D = derive_poly(l,&d);// la fonction derive_poly nous retourne 1 si oui O sinon
    printf("le polynome a étè deriver.\n");
    
    printf("voici la derivé de votre polynome:\n");
    affiche_poly_deriv(D);printf(" \n\n");
    
    // la sommes de 2 polynomes
    creer_Liste_poly(&v);// la liste du 2eme polynome
    
    printf("donner le nombre de termes de votre 2eme polynome\n");
    scanf("%d",&m);
    printf("veillez entrer le premier coefficient de votre 2eme polynome \n");
    scanf("%f",&x);
    printf("veillez entrer le premier exposant de votre 2eme polynome meme s'il est egale a zero\n");
    scanf("%d",&y);
    if(y<0) {printf("votre exposant doit etre positive\n"); printf("rettaper votre exposant.\n"); scanf("%d",&y);}
    test= entrer_poly(&v,x,y);
    if (test==0)
    printf(" espace insuffisant\n");i=1;
    
    
    while(i<=m-1 && test==1) // tanque qu'il ya d'espace (test) et qu'on veut continuer a taper
    
    {
    printf("veillez entrer le coefficient \n");
    scanf("%f",&x);
    printf("veillez entrer le exposant meme s'il est egale a zero\n");
    scanf("%d",&y);
    if(y<0) {printf("votre exposant doit etre positive\n"); printf("rettaper votre exposant.\n"); scanf("%d",&y);}
    test= entrer_poly(&v,x,y);
    if (test==0)
    printf("espace insuffisant\n");i++;
    }
    printf("voici votre 2eme polynome\n");
    affiche_poly(v);printf("\n");
    
    creer_Liste_poly(&s);// liste de la somme
    if(n>m)
    max=n;
    else if(m>n)||(m=n)
    max=m;
    
    S= somme_poly(l,v,&s,max);// la fct somme nous retourn la tete de la liste
    printf("voici votre polynome somme:\n");
    affiche_poly_somme(s);
    return 0;
    }

  3. #3
    Jack
    Modérateur

    Re : polynome en programme C ( LLC)

    Non. L'indentation n'est pas respectée. J'ai fait la modif dans le 1er post

    A+

  4. #4
    Jack
    Modérateur

    Re : polynome en programme C ( LLC)

    quand j'entre par exp le polynome : 3x^2-x^1+2x^0 il m'affiche :+2x^0-x^1+3x^^2 a lenver car l'insertion est par la tete je c pas comment faire pour changer ça !!!? le probleme est dans l'insertion mais je ny arrive pas a le résoudre
    Commence par entrer x^0, puis x^1, etc. Ça me semble plus logique d'ailleurs.

    Je pense également que tu n'es pas obligée de mettre la valeur de l'exposant dans le maillon, à la condition de prévoir un maillon pour chaque coefficient, même nul.

    A+

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

    Re : polynome en programme C ( LLC)

    Citation Envoyé par mounia07 Voir le message
    bonjour
    j'ai fais un pgm qui lit un polynome de degré n, l'affiche, le calcule en un point donné x, fait sa derivé ,et calcule la somme de 2 polynome en liste lineaire chainée j'ai aucune erreur ni warning or j'ai 2 problemes quand j'entre par exp le polynome : 3x^2-x^1+2x^0 il m'affiche :+2x^0-x^1+3x^^2 a lenver car l'insertion est par la tete je c pas comment faire pour changer ça !!!? le probleme est dans l'insertion mais je ny arrive pas a le résoudre
    et de meme pour la dérivé puisque je derive tanque l'exposant est superieur strictement a 0 et puisque dans l'insertion l'exposant 0 est le premier donc il ne derive pas et il sort de la compilation !!!
    si je met pas l'exposant 0 il derive normal mais ça reste tjr a lenver biensur!! or il compile normalement jusqua la fct de la somme il me dis c qui le max apres il sort je comprend pas pk !!?
    svp aidez moi pliiiz merci d'avance

    ps: pour la derivé et la somme j'ai cree une nouvelle liste pour le 2 meme polynome aussi donc j'ai 4 liste en tt .

    voici mon pgm:

    (...)
    Hello,

    la portion
    Code:
    creer_Liste_poly(&s);// liste de la somme
     if(n>m)
     max=n;
     else if(m>n)||(m=n)
          max=m;
    est fausse au niveau du parenthésage et du test (m==n) , tu peux utiliser >= dans ce cas ...

    La manière dont tu as conçu le programme il serait plus simple :
    *soit de trier les liste pour avoir les coef dans un ordre précis (rien n'empèche l'utilisateur d'entrer 1 1 1 0 1 2 pour x²+x+1)
    * soit faire non une insertion en tête mais une insertion de manière à créer un liste triée.
    * attention aux saisies du genre 1 1 1 1 1 1 qui devrait te donner 3x ...

    il y a d'autres petits problèmes ...

    sinon pour afficher «proprement» un polynome dont les coef sont dans un liste, simple avec une liste triée

  7. #6
    invite2d7144a7

    Re : polynome en programme C ( LLC)

    Bonjour,
    Citation Envoyé par Jack Voir le message
    Je pense également que tu n'es pas obligée de mettre la valeur de l'exposant dans le maillon, à la condition de prévoir un maillon pour chaque coefficient, même nul.
    Ok si on est absolument sûr d'avoir des termes avec des puissances qui restent "raisonnables", sinon, essaye si tu acceptes des puissances de -1000 à +54000 (valeurs prises au hasard) : non seulement tu vas consommer énormément de mémoire, mais aussi de puissance de calcul, car tu passeras ton temps à chercher les termes existants, sans même parler de la nécessité d'initialiser toutes les cases pour dire "ce terme n'existe pas" (mise à 0), bref, pas très réaliste comme idée.

  8. #7
    invited2313232

    Re : polynome en programme C ( LLC)

    Merci bcp a tous ----@ .Je vais prendre en compte toutes vos remarques ,elles sont bonne .
    reste le prob de la somme !!! elle ne veut tjr pas marcher !!! je l'ai un peut modifier mais rien a changer a chaque fois qu'il arrive a la somme il sort de la compilation !!!comment faire !!!!?
    voici la fct somme modif :


    Code:
    // la fonction qui fait la somme de 2 polynomes
    Liste somme_poly(Liste l, Liste q,Liste *s,int max)// la liste du 1ere et 2eme polynome + la liste somme et le nbr max des termes de l'un des polynomes
     {Liste p; int i;
    
      for (i=1;i<= max;i++)
        {
          if (expo(l)==expo(q))
             {all_maillon_p(&p);
              aff_coef(p,coef(q)+(coef(l)));// j'ai mis les parentheses entre +( coef(l) ) en cas ou le nbr est negative pour ne pas crée d'erreur
              aff_exp(p,expo(q));
              aff_adr(p,*s);
              *s=p;
              l=adr(l);q=adr(q);}// pour avancer au autres termes
    
          else
              {
    
               if(expo(l)>expo(q))
                 {all_maillon_p(&p);
    
                  aff_coef(p,coef(l));
                  aff_exp(p,expo(l));
                  aff_adr(p,*s);
                  *s=p;
                  l=adr(l);
                 }
               if(expo(l)<expo(q))
                 {all_maillon_p(&p);
                 aff_coef(p,coef(q));
                 aff_exp(p,expo(q));
                 aff_adr(p,*s);
                 *s=p;
                 q=adr(q);
                 }
               if (expo(l))// exemple (x^2+ x^1-3x^0)+(x^3-4x^2) on voit que pendant l'operation les termes x^1 et -3x^0 n'ont pas d'equivalent sur l'autre poly donc on vas les prendre individuellement un par un
                {all_maillon_p(&p);
                aff_coef(p,coef(l));
                aff_exp(p,expo(l));
                aff_adr(p,*s);
                *s=p;
                l=adr(l);
                }
               if (expo(p))
                {all_maillon_p(&p);
                aff_coef(p,coef(q));
                aff_exp(p,expo(q));
                aff_adr(p,*s);
                *s=p;
                q=adr(q) ;
                }
                }
        } return (*s);
     }
    Thank uuu
    Dernière modification par JPL ; 24/12/2011 à 22h54.

  9. #8
    invited2313232

    Re : polynome en programme C ( LLC)

    salut lol je vous embete un peut avec moi !!mais serieux sa va me rendre dingue
    enfaite j'ai remodifie ma fonction somme en ajoutant des if else ,maintenant elle marche quand je compile il m'affiche le polynôme somme juste
    MAIS ya tjr ce mais qui gene !!!! elle marche pas dans le cas ou par exp je fais la somme de (1x^2+3x^1-4x^0) + (2x^2+1x^1) car le dernier terme du 1ere polynome na pas d'equivalent sur le deuxième polynome en plus je ne peux pas le comparer avec d'autre vus qu'il est le dernier j'ai esseyer autres chose mais rien aaa de l'aide pliiiiiiiiiiiiz proposer moi un truk ,il me reste juste ce cas pliiiiiiiiiiiiz je veux enfiniiiiiiiiiir
    merci et merci de votre patience

    voici ma fontion qui marche :

    Liste somme_poly(Liste l, Liste q,Liste *s,int max)// la liste du 1ere et 2eme polynome + la liste somme et le nbr max des termes de l'un des polynomes
    Code:
     {Liste p; int i;
    
      for (i=1;i<= max;i++)
        {
          if (expo(l)==expo(q))
             {all_maillon_p(&p);
              aff_coef(p,coef(q)+(coef(l)));// j'ai mis les parentheses entre +( coef(l) ) en cas ou le nbr est negative pour ne pas crée d'erreur
              aff_exp(p,expo(q));
              aff_adr(p,*s);
              *s=p;
              l=adr(l);q=adr(q);}// pour avancer au autres termes
           else
               { if (expo(l)>expo(q))
                 {all_maillon_p(&p);
                  aff_coef(p,coef(l));
                  aff_exp(p,expo(l));
                  aff_adr(p,*s);
                  *s=p;
                  l=adr(l);}
    
                 else
                   if(expo(l)<expo(q))
                      {all_maillon_p(&p);
                      aff_coef(p,coef(q));
                      aff_exp(p,expo(q));
                      aff_adr(p,*s);
                      *s=p;
                      q=adr(q);}
               }
    
         }return (*s);}
    Dernière modification par yoda1234 ; 24/12/2011 à 23h27.

  10. #9
    invite4492c379

    Re : polynome en programme C ( LLC)

    Hello,

    respire un coup
    Je supposerais dans la suite que tes listes ne sont pas triées mais que chaque exposant est unique. L'algorithme de base n'est pas très compliqué : (avec L3=L2+L1)

    * L3 = copie de L1
    * pour chaque maillon m2 de L2
    ** m3=chercher(expo(m2),L3)
    ** si m3 existe alors coef(m3)=coef(m3)+coef(m2)
    ** sinon ajouter(L3,copie(m2))

    où on dispose de fonctions de copie de liste et de maillons, de recherche d'un exposant dans une liste (renvoie NULL si ne le trouve pas, sinon le maillon trouvé).

    Tu peux essayer d'optimiser en mixant la partie copie et la partie fusion.

    Dans le cas de listes triées ce serait plus simple.

  11. #10
    invite2d7144a7

    Re : polynome en programme C ( LLC)

    Bonjour,

    Oui, c'est un des cas typiques où il faut maintenir la liste triée.

    Et pour l'algorithme, on en revient encore et toujours à la base : PAPIER + CRAYON, et inutile d'écrire du code tant que ça ne fonctionne pas manuellement.

  12. #11
    invited2313232

    Re : polynome en programme C ( LLC)

    salut
    je vous assure que cette nuit j'ai rêvé du pgm lol je vous ai dis que sa me rendais dingue
    ce matin j'ai tt refais papier crayon action du coup j'ai résolus le probleme et ma fct marche pour tt les cas and im happy
    merci a tous de votre aide thank u

    voici ma miraculeuse fct somme lol :



    Code:
    Liste somme_poly(Liste l, Liste q,Liste *s)
     {Liste p; float t;
    
      for (;l!=NULL && q!=NULL;)
        {
          if (expo(l)==expo(q))
             {t = coef(q)+(coef(l));
              if(t!=0)
              all_maillon_p(&p);
              aff_coef(p,t);
              aff_exp(p,expo(q));
              aff_adr(p,*s);
              *s=p;
              l=adr(l);q=adr(q);}
           else
               { if (expo(l)>expo(q))
                 {all_maillon_p(&p);
                  aff_coef(p,coef(l));
                  aff_exp(p,expo(l));
                  aff_adr(p,*s);
                  *s=p;
                  l=adr(l);}
    
                 else
                   if(expo(l)<expo(q))
                      {all_maillon_p(&p);
                      aff_coef(p,coef(q));
                      aff_exp(p,expo(q));
                      aff_adr(p,*s);
                      *s=p;
                      q=adr(q);}
               }
    
         }
      for (;l!=NULL;)
           { all_maillon_p(&p);
             aff_coef(p,coef(l));
             aff_exp(p,expo(l));
             aff_adr(p,*s);
             *s=p; l=adr(l);}
      for(;q!=NULL;)
          {  all_maillon_p(&p);
             aff_coef(p,coef(q));
             aff_exp(p,expo(q));
             aff_adr(p,*s);
             *s=p;q=adr(q);}
    
    
         return (*s);}
    Dernière modification par JPL ; 25/12/2011 à 21h33. Motif: Ajout de la balise Code

  13. #12
    Jack
    Modérateur

    Re : polynome en programme C ( LLC)

    pas le courage de lire, c'est trop moche sans les indentations, comme déjà évoqué au début de ce fil.

  14. #13
    JPL
    Responsable des forums

    Re : polynome en programme C ( LLC)

    J'avoue être lassé, en tant que modérateur, d'avoir à ajouter la balise Code. La première fois on peut comprendre, mais en récidives, c'est un manque de courtoisie.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  15. #14
    invited2313232

    Re : polynome en programme C ( LLC)

    je suis sincèrement désolé vraiment sorry ça ne se reproduira plus je vous le promets excuser moi !!

  16. #15
    invite4492c379

    Re : polynome en programme C ( LLC)

    Hello,

    une remarque juste sur la forme cette fois-ci : on sent bien que le sujet demandait d'utiliser les listes chaînées. Tu t'es beaucoup plus focalisée sur l'utilisation de ces listes que sur la résolution du problème. Au bout du compte ça fonctionne ... donc bon. Mais, et c'est un avis très personnel, tu aurais pu créer un type polynome, avec toutes les fonctions d'accès nécessaires comme Polynome* creerPolynome(), void detruirePolynome(Polynome* p), double evaluerPolynome(Polynome* P, double valeur), Polynome* deriverPolynome(Polynome* p), Polynome* ajouterPolynome(Polynome* p1, Polynome* p2) pour les fonctions que tu rends accessibles et pour les fonctions que tu gardes privées monomeExiste, monomePremier, monomeSuivant, monomeDernier, monomeCoef, monomeExposant, ...
    Il s'agit bien sûr d'une liste non exhaustive. Cela permet de rendre le code un peu plus clair en première lecture, donner un sens précis aux manipulations de listes, respecter certaines règles, rendre le code plus facilement maintenable ....

    Mais beaucoup plus important une règle d'or (de platine ?) :

    Tout ce que tu alloueras avec malloc tu le libèreras avec free.

    Sinon tu t'exposes à beaucoup de problèmes ... et ton code pour autant que je l'ai parcouru n'en contient aucun.

  17. #16
    invited2313232

    Re : polynome en programme C ( LLC)

    Merci beaucoup pour cette remarque importante ,c'est vrais tu as raison ,je vais la prendre en compte et faire des modifications
    thank you so much for your help i appreciate

  18. #17
    lolo1546

    Re : polynome en programme C ( LLC)

    Bonjour

    j'ai aussi un programme sur les polynomes

    mais je voudrais savoir qu'est ce que signifie maillon en effet??

    cordialement

  19. #18
    Jack
    Modérateur

    Re : polynome en programme C ( LLC)

    mais je voudrais savoir qu'est ce que signifie maillon en effet??
    Le polynome peut être représenté par une liste chaînée, chaîne composée de maillons.

  20. #19
    lolo1546

    Re : polynome en programme C ( LLC)

    D'accord merci

Discussions similaires

  1. comment utiliser les résultats d'un programme fortran dans un autre programme
    Par invitedb78a3a3 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 30/09/2010, 19h21
  2. LLC, effets secondaires ?
    Par invitea1021652 dans le forum Santé et médecine générale
    Réponses: 4
    Dernier message: 20/08/2009, 13h51
  3. Automatique. Passage d'un polynôme en p à un polynôme en Z
    Par invite1bf94880 dans le forum Physique
    Réponses: 1
    Dernier message: 14/03/2008, 11h03
  4. polynome, m paramètre , différentes valeurs degré du polynome
    Par invited7a80298 dans le forum Mathématiques du collège et du lycée
    Réponses: 8
    Dernier message: 15/10/2007, 17h54
  5. Les leucémies LLC
    Par invitebe8c0b0f dans le forum Santé et médecine générale
    Réponses: 1
    Dernier message: 22/05/2006, 03h23