Structure et pow

Structure et pow - C - Programmation

Marsh Posté le 18-01-2011 à 02:52:18    

Bonjour,
 
Je viens de finir mon programme et au moment fatidique de la compilation j'ai évidemment eu droit à des erreurs, dont 3 qui me causent quelques soucis.
 
Les erreurs :
In function `eval_pol':|
157|error: incompatible types in assignment|
In function `prim':|
386|error: incompatible types in assignment|
392|error: invalid operands to binary -|
||=== Build finished: 3 errors, 0 warnings ===|
 
Le fichier.c:

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include "main.h"
  5. int main(void)
  6. {
  7.     int choix1, choix2;
  8. do
  9. {
  10.      affiche_menu('g');
  11.      scanf("%d",&choix1);
  12.      switch(choix1)
  13. {
  14.      case 1:
  15.      saisie_pol();
  16.      break;
  17.      case 2:
  18.      affiche_menu('o');
  19.      scanf("%d",&choix2);
  20.      switch(choix1)
  21.      {
  22.          case 1:
  23.          eval_pol();
  24.          break;
  25.          case 2:
  26.          add_pol();
  27.          break;
  28.          case 3:
  29.          sous_pol();
  30.          break;
  31.          case 4:
  32.          deriv();
  33.          break;
  34.          case 5:
  35.          prim();
  36.          break;
  37.          case 6:
  38.          prod();
  39.          break;
  40.          case 7:
  41.          liste_poly();
  42.          break;
  43.          case 0:
  44.          return 0;
  45.          break;
  46.          default :
  47.          continue;
  48.          break;
  49.      }
  50.      default:
  51.      continue;
  52.      break;
  53. }
  54. }
  55. while(1);
  56. return 0;
  57. }
  58. void saisie_pol()//fonction permettant la saisie du polynome
  59. {
  60.     Polynome pol_temp;
  61.     char chaine[TAILLE_MAX]={0};
  62.     int i = 0, j, cas ;
  63.     scanf("%s",chaine);
  64.     for (j=0; chaine[i]!='\0'; j++)
  65.     {
  66.         cas = 0;
  67.         if (chaine[i]=='-')
  68.         pol_temp.monome[j].num *= -1;
  69.         for (; chaine[i]!='+' && chaine[i]!='\0' && chaine[i]!='-'; i++)
  70.         {
  71.             if (chaine[i]=='x')
  72.             {
  73.                 continue;
  74.             }
  75.             if (chaine[i]=='/')
  76.             {
  77.                 cas=1;
  78.                 continue;
  79.             }
  80.             if (chaine[i]=='^')
  81.             {
  82.                 cas=2;
  83.                 continue;
  84.             }
  85.             if (cas==0) //pour gérer num, den et degre
  86.             {
  87.                 pol_temp.monome[j].num = atoi(&chaine[i]) +pol_temp.monome[j].num*10;
  88.             }
  89.             else if (cas==1)
  90.                 pol_temp.monome[j].den = atoi(&chaine[i])+pol_temp.monome[j].den*10;
  91.             else if (cas==2)
  92.                 pol_temp.monome[j].degre = atoi(&chaine[i])+pol_temp.monome[j].degre*10;
  93.             if (pol_temp.monome[j].num == 0 )
  94.                 pol_temp.monome[j].num = 1;
  95.             if (pol_temp.monome[j].den == 0 )
  96.                 pol_temp.monome[j].den = 1;
  97.             }
  98.         }
  99.         pol_temp.nbmo=j+1;
  100.         save_pol(pol_temp);
  101. }
  102. void affiche_poly(Polynome polynome)// permet d'afficher un polynome
  103. {
  104.     int j;
  105.     if(polynome.monome[j].den!=1 && polynome.monome[j].degre ==0)
  106.     printf("%d/%d",polynome.monome[j].num, polynome.monome[j].den);
  107.     else if(polynome.monome[j].den==1 && polynome.monome[j].degre!=0)
  108.     printf("%dx^%d",polynome.monome[j].num, polynome.monome[j].degre);
  109.     else if(polynome.monome[j].den==1 && polynome.monome[j].degre==0)
  110.     printf("%d",polynome.monome[j].num);
  111.     else if(polynome.monome[j].num==1 && polynome.monome[j].den==1)
  112.     printf("x^%d",polynome.monome[j].degre);
  113.     else
  114.     {
  115.     printf("%d/%dx^%d",polynome.monome[j].num, polynome.monome[j].den, polynome.monome[j].degre);
  116.     }
  117.     printf("\n" );
  118. }
  119. void affiche_menu(char mode)// permet d'afficher le menu
  120. {
  121.     if(mode == 'g')
  122.     {
  123.     printf("\n\n*** MENU PRINCIPAL ***\n" );
  124.     printf("1. Creer un polynome\n2. Effectuer une operation\n3.Afficher les polynômes" );
  125.     printf("\n4. Quitter\n" );
  126.     }
  127.     else if(mode == 'o')
  128.     {
  129.         printf("\n\n*** MENU OPERATIONS ***\n" );
  130.         printf("1. Evaluer le polynome en un x donne\n2. Additionner deux polynomes\n" );
  131.         printf("3. Soustraire deux polynomes\n\t4. Deriver un polynome\n5. Primitive s'annulant en un point donne\n\t6. Multiplier deux polynomes" );
  132.         printf("\n7. Afficher les polynomes sauvegardes\n0. Quitter sans rien faire\n" );
  133.         printf("8.Revenir au menu precedant\n" );
  134.     }
  135. }
  136. void eval_pol()// permet de donné la valeur du polynome en fonction de x
  137. {
  138.     int j, x;
  139.     int choix;
  140.     Polynome poly_eval;
  141.     Polynome *ppoly_eval = &poly_eval;
  142.     printf("Polynome a evaluer :\n" );
  143.     load(ppoly_eval);
  144.     printf("Quelle valeur affecter a x ?\n" );
  145.     scanf("%d", &x);
  146.     for(j=0;j<poly_eval.nbmo;j++)
  147.     {
  148.     poly_eval = (poly_eval.monome[j].num / poly_eval.monome[j].den) * pow(x, poly_eval.monome[j].degre);
  149.     }
  150.     affiche_poly(poly_eval);
  151.     do
  152.     {
  153.     printf("Voulez-vous sauvegarder ce polynome ?\n1.Oui\n2.Non\n" );
  154.     scanf("%d", &choix);
  155.     switch(choix)
  156.     {
  157.         case 1:
  158.         save_pol(poly_eval);
  159.         break;
  160.         default:
  161.         break;
  162.     }
  163.     }
  164.     while(choix != 1 && choix != 2);
  165. }
  166. void liste_poly()
  167. {
  168.     printf("A :" );
  169.     affiche_poly(A);
  170.     printf("\n" );
  171.     printf("B :" );
  172.     affiche_poly(B);
  173.     printf("\n" );
  174.     printf("C :" );
  175.     affiche_poly(C);
  176.     printf("\n" );
  177.     printf("D :" );
  178.     affiche_poly(D);
  179.     printf("\n" );
  180.     printf("E :" );
  181.     affiche_poly(E);
  182.     printf("\n" );
  183.     printf("F :" );
  184.     affiche_poly(F);
  185.     printf("\n" );
  186.     printf("G :" );
  187.     affiche_poly(G);
  188.     printf("\n" );
  189.     printf("H :" );
  190.     affiche_poly(H);
  191.     printf("\n" );
  192.     printf("I :" );
  193.     affiche_poly(I);
  194.     printf("\n" );
  195.     printf("J :" );
  196.     affiche_poly(J);
  197.     printf("\n" );
  198. }
  199. void save_pol(Polynome poly_save)// permet de sauvegarder un polynome
  200. {
  201.     char slot;
  202.      do
  203.      {
  204.      printf("Dans quel slot voulez-vous sauvegarder ce polynome (A à J) ?" );
  205.      scanf("%c", &slot);
  206.      switch(slot)
  207.     {
  208.         case 'A':
  209.         A = poly_save;
  210.         break;
  211.         case 'B':
  212.         B = poly_save;
  213.         break;
  214.         case 'C':
  215.         C = poly_save;
  216.         break;
  217.         case 'D':
  218.         D = poly_save;
  219.         break;
  220.         case 'E':
  221.         E = poly_save;
  222.         break;
  223.         case 'F':
  224.         F = poly_save;
  225.         break;
  226.         case 'H':
  227.         H = poly_save;
  228.         break;
  229.         case 'I':
  230.         I = poly_save;
  231.         break;
  232.         case 'J':
  233.         J = poly_save;
  234.         break;
  235.         default:
  236.         break;
  237.     }
  238.      }
  239.      while(slot != 'A' && slot != 'B' && slot != 'C' && slot != 'D' && slot != 'E' && slot != 'F' && slot != 'G' && slot != 'H' && slot != 'I' && slot != 'J');
  240.      }
  241. void add_pol ()// permet d'additionner deux polynomes
  242. {
  243.     int i, j;
  244.     int choix;
  245.     Polynome poly_res, poly_add2;
  246.     Polynome *ppoly_res = &poly_res;
  247.     Polynome *ppoly_add2 = &poly_add2;
  248.     printf("Premier polynome a additionner :\n" );
  249.     load(ppoly_res);
  250.     printf("Second polynome a additionner :\n" );
  251.     load(ppoly_add2);
  252.     for(i=0;i<poly_res.nbmo;i++)
  253.     {
  254.         for(j=0; j<poly_add2.nbmo;j++)
  255.         {
  256.             if(poly_res.monome[i].degre==poly_add2.monome[j].degre)
  257.             {
  258.                 poly_res.monome[i].num=poly_res.monome[i].num + poly_add2.monome[j].num;
  259.                 poly_res.monome[i].den=poly_res.monome[i].den + poly_add2.monome[j].den;
  260.             }
  261.         }
  262.     }
  263.     affiche_poly(poly_res);
  264.     do
  265.     {
  266.     printf("Voulez-vous sauvegarder ce polynome ?\n1.Oui\n2.Non\n" );
  267.     scanf("%d", &choix);
  268.     switch(choix)
  269.     {
  270.         case 1:
  271.         save_pol(poly_res);
  272.         break;
  273.         default:
  274.         break;
  275.     }
  276.     }
  277.     while(choix != 1 && choix != 2);
  278. }
  279. void sous_pol()// permet de soustraire deux polynomes
  280. {
  281.     int i, j;
  282.     int choix;
  283.     Polynome poly_res, poly_sous2;
  284.     Polynome *ppoly_res=&poly_res;
  285.     Polynome *ppoly_sous2=&poly_sous2;
  286.     printf("Soustraire le polyome :\n" );
  287.     load(ppoly_res);
  288.     printf("Par le polynome :\n" );
  289.     load(ppoly_sous2);
  290.     for(i=0;i<poly_res.nbmo;i++)
  291.     {
  292.         for(j=0; j<poly_sous2.nbmo;j++)
  293.         {
  294.             if(poly_res.monome[i].degre==poly_sous2.monome[j].degre)
  295.             {
  296.                 poly_res.monome[i].num=poly_res.monome[i].num - poly_sous2.monome[j].num;
  297.                 poly_res.monome[i].den=poly_res.monome[i].den - poly_sous2.monome[j].den;
  298.             }
  299.         }
  300.     }
  301.     affiche_poly(poly_res);
  302.     do
  303.     {
  304.     printf("Voulez-vous sauvegarder ce polynome ?\n1.Oui\n2.Non\n" );
  305.     scanf("%d", &choix);
  306.     switch(choix)
  307.     {
  308.         case 1:
  309.         save_pol(poly_res);
  310.         break;
  311.         default:
  312.         break;
  313.     }
  314.     }
  315.     while(choix != 1 && choix != 2);
  316. }
  317. void deriv()// permet de deriver un polynome
  318. {
  319.     int j;
  320.     int choix;
  321.     Polynome poly_deriv;
  322.     Polynome *ppoly_deriv = &poly_deriv;
  323.     printf("Polynome a deriver :\n" );
  324.     load(ppoly_deriv);
  325.     for(j=0;j<poly_deriv.nbmo;j++)
  326.     {
  327.     if(poly_deriv.monome[j].degre ==0)
  328.     {
  329.     poly_deriv.monome[j].num=0;
  330.     poly_deriv.monome[j].den=0;
  331.     }
  332.     else
  333.     {
  334.     poly_deriv.monome[j].num=poly_deriv.monome[j].num*poly_deriv.monome[j].degre;
  335.     poly_deriv.monome[j].degre=poly_deriv.monome[j].degre-1;
  336.     }
  337.     }
  338.         do
  339.     {
  340.     printf("Voulez-vous sauvegarder ce polynome ?\n1.Oui\n2.Non\n" );
  341.     scanf("%d", &choix);
  342.     switch(choix)
  343.     {
  344.         case 1:
  345.         save_pol(poly_deriv);
  346.         break;
  347.         default:
  348.         break;
  349.     }
  350.     }
  351.     while(choix != 1 && choix != 2);
  352. }
  353. void prim()// permet d'integrer
  354. {
  355.     Polynome poly_prim, poly_eval;
  356.     Polynome *ppoly_prim = &poly_prim;
  357.     int l, k, j, x;
  358.     int choix;
  359.     printf("Polynome a integrer :\n" );
  360.     load(ppoly_prim);
  361.     if(poly_prim.monome[j].degre==0)
  362.     poly_prim.monome[j].degre=1;
  363.     else
  364.     {
  365.     poly_prim.monome[j].den=poly_prim.monome[j].den*(poly_prim.monome[j].degre+1);
  366.     poly_prim.monome[j].degre=poly_prim.monome[j].degre+1;
  367.     }
  368.     printf("S'annule pour x = :\n" );
  369.     scanf("%d", &x);
  370.     poly_eval = poly_prim;
  371.     poly_eval=(poly_eval.monome[j].num/poly_eval.monome[j].den)*pow(x, poly_eval.monome[j].degre);
  372.     for(j=0;j<poly_prim.nbmo;j++)
  373.     {
  374.     l = -(poly_eval.monome[j].num/poly_eval.monome[j].den);
  375.     k=k + l;
  376.     }
  377.     poly_prim=poly_prim - k;
  378.      do
  379.     {
  380.     printf("Voulez-vous sauvegarder ce polynome ?\n1.Oui\n2.Non\n" );
  381.     scanf("%d", &choix);
  382.     switch(choix)
  383.     {
  384.         case 1:
  385.         save_pol(poly_prim);
  386.         break;
  387.         default:
  388.         break;
  389.     }
  390.     }
  391.     while(choix != 1 && choix != 2);
  392. }
  393. void prod()// permet de multiplier deux polynomes
  394. {
  395.     int i, j, k;
  396.     int choix;
  397.     Polynome poly_prod, poly_prod2, poly_res;
  398.     Polynome *ppoly_prod=&poly_prod;
  399.     Polynome *ppoly_prod2=&poly_prod2;
  400.     printf("Multiplier le polynome :\n" );
  401.     load(ppoly_prod);
  402.     printf("Par le polynome :\n" );
  403.     load(ppoly_prod2);
  404.     for(i=0;i<poly_prod.nbmo;i++)
  405.     {
  406.         for(j=0;j<poly_prod2.nbmo;j++)
  407.         {
  408.             poly_res.monome[k].num=poly_prod.monome[i].num * poly_prod2.monome[j].num;
  409.             poly_res.monome[k].den=poly_prod.monome[i].den * poly_prod2.monome[j].den;
  410.             poly_res.monome[k].degre=poly_prod.monome[i].degre +poly_prod2.monome[j].degre;
  411.             k++;
  412.         }
  413.     }
  414.         affiche_poly(poly_res);
  415.     do
  416.     {
  417.     printf("Voulez-vous sauvegarder ce polynome ?\n1.Oui\n2.Non\n" );
  418.     scanf("%d", &choix);
  419.     switch(choix)
  420.     {
  421.         case 1:
  422.         save_pol(poly_res);
  423.         break;
  424.         default:
  425.         break;
  426.     }
  427.     }
  428.     while(choix != 1 && choix != 2);
  429. }
  430. void load(Polynome *load_pol)// permet de charger un polynome
  431. {
  432.     char slot;
  433.     do
  434.      {
  435.      scanf("%c", &slot);
  436.      switch(slot)
  437.     {
  438.         case 'A':
  439.         *load_pol = A;
  440.         break;
  441.         case 'B':
  442.         *load_pol = B;
  443.         break;
  444.         case 'C':
  445.         *load_pol = C;
  446.         break;
  447.         case 'D':
  448.         *load_pol = D;
  449.         break;
  450.         case 'E':
  451.         *load_pol = E;
  452.         break;
  453.         case 'F':
  454.         *load_pol = F;
  455.         break;
  456.         case 'G':
  457.         *load_pol = G;
  458.         break;
  459.         case 'H':
  460.         *load_pol = H;
  461.         break;
  462.         case 'I':
  463.         *load_pol = I;
  464.         break;
  465.         case 'J':
  466.         *load_pol = J;
  467.         default:
  468.         break;
  469.     }
  470.      }
  471.         while(slot != 'A' && slot != 'B' && slot != 'C' && slot != 'D' && slot != 'E' && slot != 'F' && slot != 'G' && slot != 'H' && slot != 'I' && slot != 'J');
  472. }


Le fichier.h:

Code :
  1. /* Declaration des fonctions utilisées dans le fichier main.c ainsi que de la structure polynome et des variables globales */
  2. #define MAX 50
  3. #define TAILLE_MAX 5
  4. typedef struct mon
  5. {
  6. int degre, num, den;
  7. }Monome;
  8. typedef struct poly
  9. {
  10. Monome monome[MAX];
  11. int nbmo;
  12. } Polynome;
  13. extern Polynome A;
  14. extern Polynome B;
  15. extern Polynome C;
  16. extern Polynome D;
  17. extern Polynome E;
  18. extern Polynome F;
  19. extern Polynome G;
  20. extern Polynome H;
  21. extern Polynome I;
  22. extern Polynome J;
  23. void load(Polynome *load_pol);
  24. void saisie_pol();
  25. void affiche_poly(Polynome polynome);
  26. void affiche_menu(char mode);
  27. void eval_pol();
  28. void save_pol(Polynome poly_save);
  29. void add_pol ();
  30. void sous_pol();
  31. void deriv();
  32. void prim();
  33. void prod();
  34. void liste_poly();


 
Pour la fonction pow je pense que le problème vient du fait qu'elle n'accepte pas les structures, et pour l'autre erreur qu'une structure moins un int ne passe pas non plus.
Mais à vrai dire je ne vois pas du tout comment m'en sortir.
I need your help :euh:  
 
Au passage si quelqu'un saurait de quel manière je puisse réaliser une division euclidienne avec ce programme je suis preneur.
 
Merci d'avance.

Reply

Marsh Posté le 18-01-2011 à 02:52:18   

Reply

Marsh Posté le 18-01-2011 à 06:17:38    

pow prend un double en premier et second paramètre, toi tu lui fais passer des int. J'pense que c'est pour ça qu'il te chie à la gueule, mais c'est bizzare qu'il t'arrête la compilation plutôt qu'un warning [:transparency]


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 18-01-2011 à 09:31:47    

Comme l'erreur l'indique, l'assignement du résultat à la variable est incorrect (types incompatibles).

 

Normal : ligne 157, tu assignes le résultat d'un calcul de type "double" (division de int * pow qui retourne un double = double) à une variable de type "Polynome", une structure.
D'ailleurs, à propos de division d'entiers, tu devrais forcer le type en double en castant l'un des membres de la division, si tu ne veux pas te retrouver avec une surprise de type 3/2 = 1

 

Idem pour les lignes 386 et 392.


Message édité par Elmoricq le 18-01-2011 à 09:34:37
Reply

Sujets relatifs:

Leave a Replay

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