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 : 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
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
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"
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);
}
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
 #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 ./exe 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 : 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
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
 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 : 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)
Et je ne vois pas où est l'erreur, ni comment faire, je suis vraiment scotché!!