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"
Pour la fonction "poly_pt.h" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #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"
Et pour la fonction "main_pt.c"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 #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); }
Quand je compile (avec mon executant ./exe sur le terminal , il m'affiche pas d'erreur et ça s'execte!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #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 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!!
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 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
Pire encore , quand je prend le polynome (3,2,1,0) (toujours rangé suivant les puissances decroissantes!), il m'affiche:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 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
Et je ne vois pas où est l'erreur, ni comment faire, je suis vraiment scotché!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 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)
Partager