Structure Polynome( probleme d'affichage) en C

Structure Polynome( probleme d'affichage) en C - C - Programmation

Marsh Posté le 26-10-2013 à 15:30:35    

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 :
  1. exe :main_pt.o poly_pt.o
  2. gcc -o exe main_pt.o poly_pt.o -Wall -lm
  3. poly_pt.o:poly_pt.c
  4. gcc -c poly_pt.c
  5. main.o :main_pt.c poly_pt.h
  6. gcc -c main_pt.c
  7. clean:
  8. rm *.o exe


 
Pour la fonction "poly_pt.h" :

Code :
  1. #ifndef poly_pt_h
  2. #define poly_pt_h
  3. #include <stdlib.h>
  4. #define max(a,b) (a>=b)?(a):(b)
  5. #define min(a,b) (a<=b)?(a):(b)
  6. typedef struct{
  7. int deg;
  8. float *tab;
  9. }polynome;
  10. polynome *init_poly(int n);
  11. polynome  *sum_poly(polynome *U,polynome *V);
  12. void affiche(polynome *U); // Pour afficher
  13. #endif


 
 
Pour la fonction "poly_pt.c"

Code :
  1. #include<stdio.h>
  2. #include<math.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. # include "poly_pt.h"
  6. polynome *init_poly(int n) // La table U doit etre de taille (n+1)!!
  7. {
  8. int j; // qui va servir  dans la boucle for
  9. polynome *V=(polynome *)malloc(n*sizeof(polynome));// Le tableau que je veux le faire retourné
  10.  V->tab = (float *)malloc(n*sizeof(float));
  11.  (*V).deg=n; // equivalent à V->deg=n
  12. for(j=0;j<=n;j++)// JE VAIS JUSQU'A V.deg(donc (V.ded+1)elts!!) , car ,comme le polynome est de
  13.            // degre V.deg, alors on aura V.deg+1 elements!!
  14. {
  15.   printf("V[%d]=\n",j);
  16.   scanf("%f",&(V->tab[j]));
  17.  }
  18. return (V);
  19. }
  20. void affiche(polynome *U) //  
  21. {
  22. int j;
  23.  printf("%fx^%d",(U->tab[0]),U->deg);  // Rappellons que U->tab equivaut à (*U).tab
  24. for(j=1;j<=(U->deg)-1;j++)
  25. {
  26.  if(U->tab[j]!=0)
  27.  {
  28.   if(j!=U->deg-1)
  29.   {
  30.    printf("+%fx^%d",U->tab[j],U->deg-j);
  31.   }
  32.   else   
  33.   {
  34.     printf("+%fx",U->tab[j]);
  35.   }
  36.  }
  37. }
  38. if(U->tab[U->deg]!=0) printf("+%f",U->tab[U->deg]);
  39. }
  40. polynome  *sum_poly(polynome *U,polynome *V)
  41. {
  42. int s,q,i,j;
  43. s=min(U->deg,V->deg);
  44. q=max(U->deg,V->deg);
  45. // Declaration et allocation des tableau ,polynome *W,W->tab et W->deg !!
  46. polynome *W=(polynome *)malloc((q+1)*sizeof(polynome));// Le tableau que je veux le faire retourné
  47. W->tab=(float *)malloc((q+1)*sizeof(float));
  48.  W->deg=q;
  49. for(i=q;i>=0;i--)
  50. {
  51.  if((i>=s+1)&(i<=q))  // Il faut comprendre que si le polynome est de taille n, alors le tableau des coefficient
  52.        // est de taille (n+1)
  53.  {
  54.   if(q==U->deg) W->tab[q-i]=U->tab[q-i];
  55.   else         W->tab[q-i]=V->tab[q-i];
  56.  }
  57.  else      W->tab[q-i]=U->tab[q-i]+V->tab[q-i];
  58. }
  59. return (W);
  60. }


 
Et pour la fonction "main_pt.c"

Code :
  1. #include<stdio.h>
  2. #include<math.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. #include "poly_pt.h"
  6. int main()
  7. {
  8. int q;
  9. printf("donner le degré du polynome est ensuite le polynome souhaité\n" );
  10. scanf("%d",&q);
  11. polynome *U;//=(polynome *)malloc(q*sizeof(polynome));
  12. polynome *Z;
  13. U= init_poly(q);
  14. //printf("V[%d]=%f\n",U->deg,U->tab[U->deg]);  // Pour verification de mon //proramme
  15. Z=sum_poly(U,U);
  16. //printf("Z[%d]=%f\n",Z->deg,Z->tab[Z->deg]);// Pour verification de mon //proramme
  17. affiche(Z);
  18. return(0);
  19. }


 
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 :
  1. donner le degré du polynome est ensuite le polynome souhaité
  2. 6
  3. V[0]=
  4. 4
  5. V[1]=
  6. 9
  7. V[2]=
  8. 0
  9. V[3]=
  10. 6
  11. V[4]=
  12. 4
  13. V[5]=
  14. 2
  15. V[6]=
  16. 1
  17. 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 :
  1. donner le degré du polynome est ensuite le polynome souhaité
  2. 3
  3. V[0]=
  4. 1
  5. V[1]=
  6. 3
  7. V[2]=
  8. 3
  9. V[3]=
  10. 1
  11. 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 :
  1. donner le degré du polynome est ensuite le polynome souhaité
  2. 3
  3. V[0]=
  4. 3
  5. V[1]=
  6. 2
  7. V[2]=
  8. 1
  9. V[3]=
  10. 0
  11. V[3]=0.000000
  12. 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.
  13. Abandon (core dumped)


 
Et je ne vois pas où est l'erreur, ni comment faire, je suis vraiment scotché!!

Reply

Marsh Posté le 26-10-2013 à 15:30:35   

Reply

Marsh Posté le 26-10-2013 à 15:50:34    

Bonjour !  
 
En lisant rapidement votre code, plusieurs erreurs dans poly_pt.c:
 
 * Ligne 11 : vous devriez allouer n+1 éléments, non ? Car vous allez écrire trop loin dans la saisie ...
 * Ligne 65 : & au lieu de &&. Par ailleurs, la deuxième moitié du test est inutile, au vu des bornes du for.
 
Quand vous allouez une structure de type polynome, faites simplement un "malloc(sizeof(polynome)) au lieu de malloc(degre*sizeof(polynome)), cela ne gêne pas pour la suite si le degré est supérieur ou égal à 1, mais vous allouez de la mémoire inutilement.
Dans le main, vous ne désallouez rien, ce n'est pas gênant car vous quittez le programme juste après, certes, mais autant faire les choses bien :)
 
Bonne continuation !

Reply

Marsh Posté le 27-10-2013 à 06:29:56    

Farian a écrit :

Bonjour !  
 
En lisant rapidement votre code, plusieurs erreurs dans poly_pt.c:
 
 * Ligne 11 : vous devriez allouer n+1 éléments, non ? Car vous allez écrire trop loin dans la saisie ...
 * Ligne 65 : & au lieu de &&. Par ailleurs, la deuxième moitié du test est inutile, au vu des bornes du for.
 
Quand vous allouez une structure de type polynome, faites simplement un "malloc(sizeof(polynome)) au lieu de malloc(degre*sizeof(polynome)), cela ne gêne pas pour la suite si le degré est supérieur ou égal à 1, mais vous allouez de la mémoire inutilement.
Dans le main, vous ne désallouez rien, ce n'est pas gênant car vous quittez le programme juste après, certes, mais autant faire les choses bien :)
 
Bonne continuation !


 
Effectivement,c'etait là où se trouver mon erreur (sur la taille de mon allocation, (n+1) au lieu de n), du coup ,j'ai pu faire Ma fonction multiplication.
 
J'ai aussi pris en compte vos modifs, j'ai allouer seulement les octets d'un seul polynome (les octets correspondant aux type polynomes) . Par contre, si j'avais desallouer U, j'allais perdre les données de  U  non ?!


---------------
Mohamed ABDEREMANE
Reply

Marsh Posté le 27-10-2013 à 09:01:09    

Oui, vous allez les perdre, mais cela aurait été une bonne chose de le faire dans le main, après l'avoir affiché, avant de quitter le programme, pour avoir du code propre (même si le système d'exploitation libère tout à la fin de l'exécutable), autant prendre de bonnes habitudes, même en codant un petit programme de test.
 
Bonne continuation !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed