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; }
-----