-
24/12/2011 - 15h05 mounia07 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
-
24/12/2011 - 15h31 mounia07
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;
} -
24/12/2011 - 15h34 Jack
Re : polynome en programme C ( LLC)
Non. L'indentation n'est pas respectée. J'ai fait la modif dans le 1er post
A+
-
24/12/2011 - 15h48 Jack
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+
-
24/12/2011 - 16h28 photon57
Re : polynome en programme C ( LLC)
 Envoyé par mounia07 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
-
24/12/2011 - 17h11 whoami
Re : polynome en programme C ( LLC)
Bonjour,  Envoyé par Jack 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. À part la mort et les impôts, tout n'est qu'incertitude. -
24/12/2011 - 20h42 mounia07
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.
-
24/12/2011 - 23h15 mounia07
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.
-
25/12/2011 - 05h38 photon57
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.
-
25/12/2011 - 12h22 whoami
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.
À part la mort et les impôts, tout n'est qu'incertitude. -
25/12/2011 - 18h43 mounia07
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
-
25/12/2011 - 19h13 Jack
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.
-
25/12/2011 - 21h36 JPL
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 -
25/12/2011 - 22h00 mounia07
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 !! -
26/12/2011 - 05h41 photon57
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.
Dernière modification par photon57 ; 26/12/2011 à 05h42.
| | |