| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 495 人关注过本帖
标题:十万火急!!帮忙看看我重载运算符里面是不是有什么错误 啊。为什么运行跟口算 ...
只看楼主 加入收藏
lianjiecuowu
Rank: 3Rank: 3
来 自:安徽
等 级:论坛游侠
帖 子:152
专家分:107
注 册:2011-5-20
结帖率:85.71%
收藏
已结贴  问题点数:30 回复次数:4 
十万火急!!帮忙看看我重载运算符里面是不是有什么错误 啊。为什么运行跟口算 的结果不对呢,检查不出来,希望能得到实质性的解决,谢谢
#include<iostream>
using namespace std;
class RatNum
{
      private:
      int fz;
      int fm;
      public:
      RatNum(){}
      ~RatNum(){}
      RatNum(int z,int m){fz=z;fm=m;cout<<"有理数为:"<<fz<<"/"<<fm<<endl;}
      void set_Rat(int z,int m){fz=z;fm=m;}
      int get_Ratz();
      int get_Ratm();
      int common();
      RatNum& operator +(RatNum &R);
      RatNum& operator -(RatNum &R);
      RatNum& operator *(RatNum &R);
      RatNum& operator /(RatNum &R);
      
      
};
int RatNum::get_Ratz()
{  
    return fz;  
}
int  RatNum::get_Ratm()
{
     return fm;
}
int RatNum::common()
{
    int temp,a,b,i;
    if(fz<fm)
    {
         temp=fm;
         fm=fz;
         fz=temp;
    }
    a=fz;
    b=fm;
    i=fz%fm;
    while(i!=0)
    {
               fz=fm;
               fm=i;
               i=fz%fm;
    }
    cout<<"化简后的有理数分数为:"<<b/fm<<"/"<<a/fm<<endl;
    return 0;
   
}
RatNum &RatNum:: operator +(RatNum &R)
{
      
       fz=fz*(R.fm)+fm*(R.fz);
       fm=fm*(R.fm);
       return *this;   
}
RatNum &RatNum:: operator -(RatNum &R)
{
       fz=fz*R.fm-fm*R.fz;
       fm=fm*R.fm;
       return *this;  
}
RatNum &RatNum:: operator *(RatNum &R)
{
       fz=fz*R.fz;
       fm=fm*R.fm;
       return *this;
}
RatNum &RatNum:: operator /(RatNum &R)
{
      fz=fz*R.fm;
      fm=fm*R.fz;
     return *this;
      
        
}
int main()
{
    RatNum R1(3,4);
    ();
    RatNum R2(2,4);
    ();
    RatNum R3;
    R3.set_Rat(4,5);
    cout<<"有理数为:"<<R3.get_Ratz()<<"/"<<R3.get_Ratm()<<endl;
    ();
    RatNum R4(2,5);
    R4.operator+(R1);                                                                    //就是这里
    cout<<"有理数相加后的结果为:"<<R4.get_Ratz()<<"/"<<R4.get_Ratm();
    cout<<endl<<endl;
    RatNum R5(5,6);
    R5.operator-(R1);                                                                      //就是这里
    cout<<"有理数相减后的结果为:"<<R5.get_Ratz()<<"/"<<R5.get_Ratm();
    cout<<endl<<endl;
    RatNum R6(1,3);
    R6.operator*(R1);                                                               //就是这里
    cout<<"有理数相乘后的结果为:"<<R6.get_Ratz()<<"/"<<R6.get_Ratm();
    cout<<endl<<endl;
    RatNum R7(1,2);
    R7.operator/(R1);                                                               //就是这里
    cout<<"有理数相除后的结果为:"<<R7.get_Ratz()<<"/"<<R7.get_Ratm();
    cout<<endl<<endl;
   
   
   
   
     
    system("pause");
    return 0;
}
搜索更多相关主题的帖子: 有理数 private 
2011-06-12 13:16
lianjiecuowu
Rank: 3Rank: 3
来 自:安徽
等 级:论坛游侠
帖 子:152
专家分:107
注 册:2011-5-20
收藏
得分:0 
#include<iostream>
using namespace std;
class RatNum                                     //定义一个有理数类RatNum
{
      private:
      int fz;
      int fm;
      public:
      RatNum(){}     //构造函数
      ~RatNum(){}    //析构函数
      RatNum(int z,int m){fz=z;fm=m;cout<<"有理数为:"<<fz<<"/"<<fm<<endl;}//带参数的构造函数的定义,用于初始化对象成员的值
      void set_Rat(int z,int m){fz=z;fm=m;}        //对对象中的数据成员的值的设置
      int get_Ratz();                                //获取分子的值
      int get_Ratm();                               //获取分母的值
      int common();                              //最优函数的声明,用于约分有理数
      RatNum& operator +(RatNum &R);   //重载运算符函数“+”的声明;返回类型为有理数类类型;
      RatNum& operator -(RatNum &R);    //重载运算符函数“-”的声明;返回类型为有理数类类型;
      RatNum& operator *(RatNum &R);    //重载运算符函数“*”的声明;返回类型为有理数类类型;
      RatNum& operator /(RatNum &R);    //重载运算符函数“/”的声明;返回类型为有理数类类型;
      RatNum& operator ==(RatNum &R);    //重载运算符函数“==”的声明;用于判断两个有理数是否相等;
      double real();                    //转换实数函数的声明;
      
      
};
int RatNum::get_Ratz()
{  
    return fz;  
}
int  RatNum::get_Ratm()
{
     return fm;
}
int RatNum::common()    //创建的优化函数,提取最大公约数;并重新赋值给分子分母
{
    int temp,a,b,i;
    a=fm;
    b=fz;
    if(fz<fm)
    {
         temp=fm;          //定义随机变量temp,用于交换分子分母的值,当分子比分母小时。
         fm=fz;
         fz=temp;
         a=fz;
         b=fm;
    }
    i=fz%fm;
    while(i!=0)             //求取最大公约数,当i等于零时,跳出循环,返回的是fm,fm是所要的最大公约数
    {
               fz=fm;
               fm=i;
               i=fz%fm;
    }
   
    cout<<"化简后的有理数分数为:"<<b/fm<<"/"<<a/fm<<endl;
    fz=b/fm;            //分子约分的结果重新赋值给分子
    fm=a/fm;            //分母约分的结果重新赋值给分母
    return 0;
   
}
RatNum &RatNum:: operator +(RatNum &R)               
{
      
       fz=fz*R.fm+fm*R.fz;
       fm=fm*R.fm;
       return *this;       //返回this指针,用于指向成员函数,返回分子分母的值
}
RatNum &RatNum:: operator -(RatNum &R)
{
       fz=fz*R.fm-fm*R.fz;
       fm=fm*R.fm;
       return *this;  
}
RatNum &RatNum:: operator *(RatNum &R)
{
       fz=fz*R.fz;
       fm=fm*R.fm;
       return *this;
}
RatNum &RatNum:: operator /(RatNum &R)
{
      fz=fz*R.fm;
      fm=fm*R.fz;
     return *this;
      
        
}
RatNum& RatNum:: operator ==(RatNum &R)
{
        ();
        if(fz==R.fz&&fm==R.fm)
        cout<<"这两个有理数相等"<<endl;
        else
        cout<<"这两个有理数不相等"<<endl;
        return *this;
}
double RatNum::real()                        //转换实数函数real()的定义;
{
       return double(fz/fm);
}
int main()
{
    RatNum R1(3,4);                           //创建对象
    ();                             //优化函数,它的作用是使有理数约去公分母
    RatNum R2(2,4);
    ();
    RatNum R3;
    R3.set_Rat(4,5);
    cout<<"有理数为:"<<R3.get_Ratz()<<"/"<<R3.get_Ratm()<<endl;
    ();
    RatNum R4(2,5);
    R4.operator +(R1);
    cout<<"有理数相加后的结果为:"<<R4.get_Ratz()<<"/"<<R4.get_Ratm();
    ();
    cout<<endl<<endl;
    RatNum R5(5,6);
    R5.operator -(R1);
    cout<<"有理数相减后的结果为:"<<R5.get_Ratz()<<"/"<<R5.get_Ratm();
    ();
    cout<<endl<<endl;
    RatNum R6(1,3);
    R6.operator *(R1);
    cout<<"有理数相乘后的结果为:"<<R6.get_Ratz()<<"/"<<R6.get_Ratm();
    ();
    cout<<endl<<endl;
    RatNum R7(1,2);
    R7.operator /(R1);
    cout<<"有理数相除后的结果为:"<<R7.get_Ratz()<<"/"<<R7.get_Ratm();
    ();
    cout<<endl<<endl;
    RatNum R8(4,6);
    ();
    RatNum R9(2,3);
    R8.operator==(R9);
    cout<<"这两个相等的有理数为:"<<R8.get_Ratz()<<"/"<<R8.get_Ratm();
    cout<<endl<<endl;
    RatNum R10(1,6);
    RatNum R0(4,9);
    ();
    R10.operator==(R0);
    cout<<endl<<endl;
    RatNum R11(8,7);                            //定义对象并初始化分子分母,调用成员函数real()转换为实数。
    cout<<"转换为实数后为:"<<R11.real()<<endl;
    system("pause");
    return 0;
}




嘿嘿,还是得靠自己,大功告成~~~~~

Sharp your mind!
2011-06-12 15:17
linw1225
Rank: 3Rank: 3
来 自:福建
等 级:论坛游侠
帖 子:110
专家分:145
注 册:2011-4-7
收藏
得分:30 
事实上我看的时候只看了+号运算符的重载内容,把- * / 号代码内容都删了,我觉得其他都一样。所以以下所说只是 +的内容。
定义R1后,你调用了一个common函数,最后打印出来的分数结果是没错的,但是实际上的分数应该已经被修改了。
在主函数里面把 ();  这一行去掉,结果就是正确的。
我也刚学,看不懂的common函数,你可以自己分析一下。
我觉得最好的方法调用求最大公约数的函数,求分子分母的最大公约数,然后用分子分母同时除以最大公约数,这样可以避免有理数的值被改变。

Einmal ist keinmal
2011-06-12 15:20
linw1225
Rank: 3Rank: 3
来 自:福建
等 级:论坛游侠
帖 子:110
专家分:145
注 册:2011-4-7
收藏
得分:0 
原来可以了,没看到,失策。

Einmal ist keinmal
2011-06-12 15:22
lianjiecuowu
Rank: 3Rank: 3
来 自:安徽
等 级:论坛游侠
帖 子:152
专家分:107
注 册:2011-5-20
收藏
得分:0 
回复 3楼 linw1225
没关系的。换种思路也是学习的过程嘛,重在提高嘛,,十分感谢啊

Sharp your mind!
2011-06-12 15:25
快速回复:十万火急!!帮忙看看我重载运算符里面是不是有什么错误 啊。为什么运行 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012928 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved