Partage
  • Partager sur Facebook
  • Partager sur Twitter

Des erreurs que j'arrive pas à corriger

    3 février 2008 à 13:12:25

    Salut à toutes et à tous,

    J'ai écris un programme qui permet d'additionner, de multiplier, de diviser, de simplifier et d'inverser des rationnels. Le compilateur me fait sortir des erreurs que je ne comprends pas.

    Voilà mes fichiers :

    rationnel.h :
    1. #include<iostream>
    2. class Rationnel
    3. {
    4. private:
    5.         float num;
    6.         float deno;
    7. public:
    8.         Rationnel(float numerateur=0, float denominateur=1);
    9.         Rationnel operator+(Rationnel);
    10.         Rationnel operator-(Rationnel);
    11.         Rationnel operator*(Rationnel);
    12.         Rationnel operator/(Rationnel);
    13.         bool operator<(Rationnel);
    14.         bool operator>(Rationnel);
    15.         bool operator==(Rationnel);
    16.         bool operator!=(unsigned);
    17.         Rationnel operator^(int);
    18.         friend ostream &operator<<(ostream &, Rationnel &);
    19.         friend Rationnel operator~(Rationnel &);
    20.         Rationnel simplifier();
    21.         Rationnel inverser();
    22. };

    rationnel.cpp:
    1. #include<iostream>
    2. #include<cmath>
    3. #include"rationnel.h"
    4. using namespace std;
    5. Rationnel::Rationnel(float numerateur=0, float denominateur=1)
    6. {
    7.         num=numerateur;
    8.         deno=denominateur;
    9. }
    10. Rationnel Rationnel::operator+(Rationnel fct)
    11. {
    12.         Rationnel res;
    13.         res.deno=deno*fct.deno;
    14.         res.num=(num*fct.deno)+(fct.num*deno);
    15.         return res;
    16. }
    17. Rationnel Rationnel::operator-(Rationnel fct)
    18. {
    19.         Rationnel res;
    20.         res.deno=deno*fct.deno;
    21.         res.num=(num*fct.deno)-(fct.num*deno);
    22.         return res;
    23. }
    24. Rationnel Rationnel::operator*(Rationnel fct)
    25. {
    26.         Rationnel res;
    27.         res.deno=deno*fct.deno;
    28.         res.num=num*fct.deno;
    29.         return res;
    30. }
    31. Rationnel Rationnel::operator/(Rationnel fct)
    32. {
    33.         Rationnel res;
    34.         if(fct.num=0)
    35.         {
    36.                 fct.num=0;
    37.                 fct.deno=1;
    38.                 cout<<"division par 0 impossible"<<endl;
    39.         }
    40.         else
    41.         {
    42.                 res.deno = deno * fct.num;
    43.                 res.num = num * fct.deno;
    44.         }
    45.         return res;
    46. }
    47. Rationnel Rationnel::operator^(unsigned int ex)
    48. {
    49.         Rationnel tmp;
    50.         tmp.num=pow(num.ex);
    51.         tmp.deno=pow(deno.ex);
    52.         return tmp;
    53. }
    54. Rationnel Rationnel::operator^(int ex)
    55. {
    56.         Rationnel tmp;
    57.         tmp.num=pow(deno,-ex);
    58.         tmp.deno=pow(num,-ex);
    59.         return tmp;
    60. }
    61. Rationnel Rationnel::inverser()
    62. {
    63.         return this*^-1;
    64. }
    65. int pgcd(int a,int b)
    66. {       int p,g,t;
    67.         if(a>b) {g=a;p=b;}
    68.         else
    69.         {g=b;p=a;}
    70.         t=p;
    71.         while (t!=0)
    72.         {       if(g%t==0)
    73.                         if(p%t==0)
    74.                                 return t;
    75.                         t--;
    76.         }
    77.         return 1;
    78. }
    79. ostream &operator<<(ostream &out,Rationnel &R)
    80. {
    81.         out<<R.num <<"/"<<R.deno<<endl;
    82.         return out;
    83. }
    84. Rationnel Rationnel::simplifier()
    85.         {       int p;
    86.                 p=pgcd(num,deno);
    87.                 num/=p;
    88.                 deno/=p;
    89.                 return *this;
    90. }
    91. bool Rationnel::operator<(Rationnel t2)
    92.         {       /*
    93.                  a   c  
    94.                 - < -                   ssi ad < bc
    95.                 b   d
    96.         */
    97.                 bool resultat;
    98.                 resultat=(num*t2.deno)<(deno*t2.num);
    99.                 return resultat;       
    100.         }
    101. bool Rationnel::operator>(Rationnel t2)
    102.         {       /*             
    103.                  a   c  
    104.                 - > -                   ssi ad > bc
    105.                 b   d
    106.                 */
    107.                 bool resultat;
    108.                 resultat=(num*t2.deno)>(deno*t2.num);
    109.                 return resultat;
    110.         }
    111. bool Rationnel::operator==(Rationnel t2)
    112.         {       /*
    113.                  a   c  
    114.                 - == -                  ssi ad == bc
    115.                 b   d
    116.                 */
    117.                 bool resultat;
    118.                 resultat=(num*t2.deno)==(deno*t2.num);
    119.                 return resultat;       
    120.         }
    121. bool Rationnel::operator!=(Rationnel t2)
    122.         {       /*
    123.                 a   c  
    124.                 - != -                  ssi ad != bc
    125.                 b   d
    126.                 */
    127.                 bool resultat;
    128.                 resultat=(num*t2.deno)!=(deno*t2.num);
    129.                 return resultat;       
    130. }
    131. Rationnel operator~(Rationnel &R)
    132. {
    133.         R.num=-R.num;
    134.         return R;
    135. };

    et enfin ma main.cpp:
    1. #include "rationnel.h"
    2. #include<iostream.h>
    3. void main(){
    4. Rationnel a(2,3);
    5. Rationnel b(2,5);
    6. Rationnel c;
    7. c=a+b;
    8. cout<<c;
    9. c=a-b;
    10. cout<<c;
    11. c=a*b;
    12. cout<<c;
    13. c=a/b;
    14. cout<<c;
    15. cout<<c.simplifier();
    16. c=~a;
    17. cout<<c;
    18. c=a.inverser();
    19. cout<<c;
    20. c=b^4;
    21. cout<<c;
    22. c=b^-4;
    23. cout<<c;
    24. return 0;
    25. }


    Merci d'avance :)


    • Partager sur Facebook
    • Partager sur Twitter
      3 février 2008 à 16:46:16

      une erreur

      un operateur qui modifie l'objet lui-meme
      (comme +=,-=,%=...)

      doit renvoyer une reference (on change l'objet!)

      revoie la surcharge d'operateur dans le cours de m@théo21 ;)

      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        3 février 2008 à 18:41:38

        Donne les erreurs.

        Une chose : dans le main.cpp, tu n'inclus pas iostream, mais iostream.h (pas la même chose!). [Mais tu fais juste dans les autres, pourquoi?]
        • Partager sur Facebook
        • Partager sur Twitter
          3 février 2008 à 22:14:57

          Merci de ta réponse, voilà les erreurs :

          rationnel.h(19) : error C2143: syntax error : missing ';' before '&'
          rationnel.h(19) : error C2433: 'ostream' : 'friend' not permitted on data declarations
          rationnel.h(19) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
          rationnel.h(19) : error C2061: syntax error : identifier 'ostream'
          rationnel.h(19) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
          rationnel.h(19) : error C2805: binary 'operator <<' has too few parameters
          main.cpp(9) : error C2065: 'cout' : undeclared identifier
          main.cpp(25) : error C2562: 'main' : 'void' function returning a value
          main.cpp(4) : see declaration of 'main'

          J'ai enlevé le .h du header iostream, je me suis trompée !

          Merci encore une fois :)
          • Partager sur Facebook
          • Partager sur Twitter
            4 février 2008 à 9:42:24

            Pour les 2 dernières erreurs:

            il manque un using namespace std; et le prototype de main est:
            int main(int, char**); pas void main();

            Pour rationnel.h :
            operator~ n'existe pas http://www.siteduzero.com/forum-83-175473-1949003-les-mots-clefs.html#r1949003 mais ce n'est pas ça qui cause l'erreur.
            L'erreur vient de ton prototype de l'opérateur <<, il doit s'écrire comme ceci:
            friend std::ostream& operator<<(std::ostream &out, const Rationnel &R );
            • Partager sur Facebook
            • Partager sur Twitter
            Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
              8 mars 2008 à 22:47:06

              Merci de vos réponses :)
              Cordialement !
              • Partager sur Facebook
              • Partager sur Twitter

              Des erreurs que j'arrive pas à corriger

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown