lavela | Bonjour,
Je suis debutant et actuellement , je voudrais faire un e fonction qui calcule une somme de 2 polynomes (et ensuite le produit de 2 polynomes!!). J'ai crée une structure du type "polynome", j'ai crée ma fonction poly_pt.h,poly_pt.c ,mon Makefile et ma fonction "main_pt.c", dont les voici:
pour le "Makefile"
Code :
- exe :main_pt.o poly_pt.o
- gcc -o exe main_pt.o poly_pt.o -Wall -lm
- poly_pt.o:poly_pt.c
- gcc -c poly_pt.c
- main.o :main_pt.c poly_pt.h
- gcc -c main_pt.c
- clean:
- rm *.o exe
|
Pour la fonction "poly_pt.h" :
Code :
- #ifndef poly_pt_h
- #define poly_pt_h
- #include <stdlib.h>
- #define max(a,b) (a>=b)?(a):(b)
- #define min(a,b) (a<=b)?(a):(b)
- typedef struct{
- int deg;
- float *tab;
- }polynome;
- polynome *init_poly(int n);
- polynome *sum_poly(polynome *U,polynome *V);
- void affiche(polynome *U); // Pour afficher
- #endif
|
Pour la fonction "poly_pt.c"
Code :
- #include<stdio.h>
- #include<math.h>
- #include<stdlib.h>
- #include<string.h>
- # include "poly_pt.h"
- polynome *init_poly(int n) // La table U doit etre de taille (n+1)!!
- {
- int j; // qui va servir dans la boucle for
- polynome *V=(polynome *)malloc(n*sizeof(polynome));// Le tableau que je veux le faire retourné
- V->tab = (float *)malloc(n*sizeof(float));
- (*V).deg=n; // equivalent à V->deg=n
- for(j=0;j<=n;j++)// JE VAIS JUSQU'A V.deg(donc (V.ded+1)elts!!) , car ,comme le polynome est de
- // degre V.deg, alors on aura V.deg+1 elements!!
- {
- printf("V[%d]=\n",j);
- scanf("%f",&(V->tab[j]));
- }
- return (V);
- }
- void affiche(polynome *U) //
- {
- int j;
- printf("%fx^%d",(U->tab[0]),U->deg); // Rappellons que U->tab equivaut à (*U).tab
- for(j=1;j<=(U->deg)-1;j++)
- {
- if(U->tab[j]!=0)
- {
- if(j!=U->deg-1)
- {
- printf("+%fx^%d",U->tab[j],U->deg-j);
- }
- else
- {
- printf("+%fx",U->tab[j]);
- }
- }
- }
- if(U->tab[U->deg]!=0) printf("+%f",U->tab[U->deg]);
- }
- polynome *sum_poly(polynome *U,polynome *V)
- {
- int s,q,i,j;
- s=min(U->deg,V->deg);
- q=max(U->deg,V->deg);
- // Declaration et allocation des tableau ,polynome *W,W->tab et W->deg !!
- polynome *W=(polynome *)malloc((q+1)*sizeof(polynome));// Le tableau que je veux le faire retourné
- W->tab=(float *)malloc((q+1)*sizeof(float));
- W->deg=q;
- for(i=q;i>=0;i--)
- {
- if((i>=s+1)&(i<=q)) // Il faut comprendre que si le polynome est de taille n, alors le tableau des coefficient
- // est de taille (n+1)
- {
- if(q==U->deg) W->tab[q-i]=U->tab[q-i];
- else W->tab[q-i]=V->tab[q-i];
- }
- else W->tab[q-i]=U->tab[q-i]+V->tab[q-i];
- }
- return (W);
- }
|
Et pour la fonction "main_pt.c"
Code :
- #include<stdio.h>
- #include<math.h>
- #include<stdlib.h>
- #include<string.h>
- #include "poly_pt.h"
- int main()
- {
- int q;
- printf("donner le degré du polynome est ensuite le polynome souhaité\n" );
- scanf("%d",&q);
- polynome *U;//=(polynome *)malloc(q*sizeof(polynome));
- polynome *Z;
- U= init_poly(q);
- //printf("V[%d]=%f\n",U->deg,U->tab[U->deg]); // Pour verification de mon //proramme
- Z=sum_poly(U,U);
- //printf("Z[%d]=%f\n",Z->deg,Z->tab[Z->deg]);// Pour verification de mon //proramme
- affiche(Z);
- return(0);
- }
|
Quand je compile (avec mon executant [B]./exe[/B] sur le terminal , il m'affiche pas d'erreur et ça s'execte!
Quand je prend , un polynome de taille 2, 4,6 (en gros de degre paire il me semble, MAIS je ne suis pas sur ),il m'affiche le bon resultat que je recherchiais (à savoir sommer les 2 polynomes!!
Code :
- donner le degré du polynome est ensuite le polynome souhaité
- 6
- V[0]=
- 4
- V[1]=
- 9
- V[2]=
- 0
- V[3]=
- 6
- V[4]=
- 4
- V[5]=
- 2
- V[6]=
- 1
- 8.000000x^6+18.000000x^5+12.000000x^3+8.000000x^2+4.000000x+2.000000
|
Mais là ou il y'a probleme, c'est que quand je prend le polynime de degre 3,5,7( donc de degre impair ,il me semble) que ça se complique vu que la derniere valeur s'affiche tjrs 0. Par exemple, un polynome de degre 3 qui a comme coef(1,3,3,1) ( ranger suivant les puissances decroissantes du polynome) , Le terminal ,ne me donne pas le bon resultat (il devait me donner (2,6,6,2)), mais il me donne donne ça!:
Code :
- donner le degré du polynome est ensuite le polynome souhaité
- 3
- V[0]=
- 1
- V[1]=
- 3
- V[2]=
- 3
- V[3]=
- 1
- 2.000000x^3+6.000000x^2+6.000000x+0.000000
|
Pire encore , quand je prend le polynome (3,2,1,0) (toujours rangé suivant les puissances decroissantes!), il m'affiche:
Code :
- donner le degré du polynome est ensuite le polynome souhaité
- 3
- V[0]=
- 3
- V[1]=
- 2
- V[2]=
- 1
- V[3]=
- 0
- V[3]=0.000000
- exe: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
- Abandon (core dumped)
|
Et je ne vois pas où est l'erreur, ni comment faire, je suis vraiment scotché!! |