一个c++运算符重载问题,希望得到完整代码

问题描述

一个c++运算符重载问题,希望得到完整代码

题目如下:
已知一个有理数类zrf_Ratio,包含私有数据成员:分子num和分母den, 以及公有函数成员

friend ostream& operator<<(ostream& ostr, const zrf_Ratio& r)

{ return ostr << r.num << "/" << r.den;}

请补充该类的构造函数,并实现如下的操作符重载形式:

friend zrf_Ratio operator-(const zrf_Ratio&);

friend zrf_Ratio operator+(const zrf_Ratio&, const zrf_Ratio&);

friend zrf_Ratio operator-(const zrf_Ratio&, const zrf_Ratio&);

friend zrf_Ratio operator*(const zrf_Ratio&, const zrf_Ratio&);

friend zrf_Ratio operator/(const zrf_Ratio&, const zrf_Ratio&);

解决方案

先计算最大公约数和最小公倍数,剩下的都是数学问题了吧~

解决方案二:

看来又是作业题了
建议你还是自己去做,有具体的问题再来

解决方案三:

先把自己的答案拿出来看看。

解决方案四:

楼下旁观者,求做题思路啊 ~~~~(>_<)~~~~

解决方案五:

自己写的,求指出不足,谢谢~

#include<iostream>
#define p(x)    cout<<#x "="<<x<<endl;
using namespace std;
int min_divisor(int x,int y)    {
    while(x%y!=0)   {
        int c=y;
        y=x%y;
        x=c;
    }
    return y;
}
class zrf_Ratio {
    int num,den;
    void isLegal()const {//判断有理数是否合法
        if(den==0)  { cout<<"分母不能为零!"<<endl;    exit(1); }
    }
public:
    zrf_Ratio(int _num=1,int _den=1):num(_num),den(_den)
    { isLegal(); }
    friend ostream& operator<<(ostream& ostr, const zrf_Ratio& r)
    { return ostr << r.num << "/" << r.den; }
    friend zrf_Ratio operator-(const zrf_Ratio& z)  {
        z.isLegal();
        return zrf_Ratio(-z.num,z.den);
    }
    friend zrf_Ratio operator+(const zrf_Ratio& l, const zrf_Ratio& r)  {
        l.isLegal(); r.isLegal();
        int d=min_divisor(l.den,r.den);
        int new_num=(l.num*r.den+r.num*l.den)/d;
        int new_den=l.den*r.den/d;
        return zrf_Ratio(new_num,new_den);
    }
    friend zrf_Ratio operator-(const zrf_Ratio& l, const zrf_Ratio& r)  {
        l.isLegal(); r.isLegal();
        int d=min_divisor(l.den,r.den);
        int new_num=(l.num*r.den-r.num*l.den)/d;
        int new_den=l.den*r.den/d;
        return zrf_Ratio(new_num,new_den);
    }
    friend zrf_Ratio operator*(const zrf_Ratio& l, const zrf_Ratio& r)  {
        l.isLegal(); r.isLegal();
        int new_num=l.num*r.num, new_den=l.den*r.den;
        int d=min_divisor(new_num,new_den);
        while(d!=1)
        { new_num/=d; new_den/=d;d=min_divisor(new_num,new_den); }
        return zrf_Ratio(new_num,new_den);
    }
    friend zrf_Ratio operator/(const zrf_Ratio& l, const zrf_Ratio& r)
    { return l*(zrf_Ratio(r.den,r.num));}
};
int main()
{
    zrf_Ratio a(1,18);
    zrf_Ratio b(11,24);
    p(-a);
    p(a+b);
    p(a-b);
    p(a*b);
    p(a/b);
    zrf_Ratio e(0,1);
    p(a/e);
}

解决方案六:

先把自己的答案拿出来看看。

时间: 2024-10-27 02:40:48

一个c++运算符重载问题,希望得到完整代码的相关文章

link中什么是运算符重载的局限性?局限性具体表现在哪些地方?

问题描述 link中什么是运算符重载的局限性?局限性具体表现在哪些地方? 什么是link中运算符重载的局限性?这个局限性从什么地方体现出来? 解决方案 运算符重载首先不是所有的运算符都能重载,另一个,运算符重载必须依附于类型,和C++不同,你不能在类定义的外部重载运算符.也就是说你不能改变已有类型的运算符的功能.

关于C++加法运算符重载的一个超简单问题

问题描述 关于C++加法运算符重载的一个超简单问题 以下代码: #include using namespace std; class num { public: num(){n=1;cout<<"构造函数执行 ";} num(int i){n=i;cout<<"带一个参数的构造函数执行 ";} num(const num&s){this->n=s.n;cout<<"复制构造函数执行 ";} ~n

一个简单的输入运算符重载

问题描述 一个简单的输入运算符重载 #include#includeusing namespace std;class complex{private: int real; int imag;public: complex(int r=0int i=0) :real(i)imag(i){} ~complex(){} complex operator +(complex&x) { real=real+x.real; imag=imag+x.real; return *this; } complex

关于C++后置运算符重载一个超简单问题

问题描述 关于C++后置运算符重载一个超简单问题 以下代码 #include using namespace std; class num { public: num(){n=1;cout<<"构造函数执行 ";} num(int i){n=i;cout<<"带一个参数的构造函数执行 ";} num(const num&s){this->n=s.n;cout<<"复制构造函数执行 ";} ~num

C++中利用构造函数与无名对象简化运算符重载函数

在完整描述思想之前,我们先看一下如下的例子,这个例子中的加运算符重载是以非成员函数的方式出现的: //程序作者:管宁//站点:www.cndev-lab.com//所有稿件均有版权,如要转载,请务必著名出处和作者 #include <iostream>using namespace std; class Test{ public: Test(int a) { Test::a = a; } friend Test operator + (Test&,int); public: int a

C#——运算符重载和索引器

       一.什么是运算符?        所谓运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型.自定义类的赋值运算符重载函数的作用与内置赋值运算符的作用类似,但是要要注意的是,它与拷贝构造函数与析构函数一样,要注意深拷贝浅拷贝的问题,在没有深拷贝浅拷贝的情况下,如果没有指定默认的赋值运算符重载函数,那么系统将会自动提供一个赋值运算符重载函数.        下面是个小例子: namespace 运算符重载 { class Program { static

hashtable-关于C++中运算符重载的问题

问题描述 关于C++中运算符重载的问题 template HashTable&HashTable::Insert(const E&e) { //散列表插入 K k=e; //抽取key值 int b=hSearch(k); //检查是否能完成插入 if(empty[b]) { empty[b]=false; ht[b]=e; return *this; } 散列表中的插入操作,要往Insert()中传的e是string类型的,然后下面的K k=e中的K是int,想要把"=&quo

《C++语言基础》实践项目——运算符重载(一)

返回:贺老师课程教学链接 [项目1-实现复数类中的运算符重载](1)请用类的成员函数,定义复数类重载运算符+.-.*./,使之能用于复数的加减乘除 class Complex { public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r; imag=i;} Complex operator+(const Complex &c2); Complex operator-(const Complex &c2); Com

2013级C++第8周(春)项目——运算符重载

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目1]实现复数类中的运算符重载(1)请用类的成员函数,定义复数类重载运算符+.-.*./,使之能用于复数的加减乘除 class Complex { public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r; imag=i;} Complex operator+(C