/*
实验内容:实现分数的运算符重载
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称: 实现分数的运算符重载
* 作 者: 薛广晨
* 完成日期: 2012 年 4 月 7 日
* 版 本号: x1.0
*/
//【任务4】在任务3的基础上拓展。分数类中的对象可以和整型数进行四则运算,且运算符合交换律。例如:CFraction a(1,3),b; int i=2; 可以完成b=a+i;。同样,可以完成i+a, 45+a, a*27, 5/a等各种运算。
#include<iostream>
using namespace std;
class CFraction
{
private:
int nume; // 分子
int deno; // 分母
public:
CFraction(int nu = 0, int de = 1) : nume(nu), deno(de){}; //构造函数,初始化用
void output();
void output1();
CFraction operator+(CFraction &c1);
friend CFraction operator+(CFraction &c1, int &a);
friend CFraction operator+(int &a, CFraction &c1);
CFraction operator-(CFraction &c1);
friend CFraction operator-(CFraction &c1, int &a);
friend CFraction operator-(int &a, CFraction &c1);
CFraction operator*(CFraction &c1);
friend CFraction operator*(CFraction &c1, int &a);
friend CFraction operator*(int &a, CFraction &c1);
CFraction operator/(CFraction &c1);
friend CFraction operator/(CFraction &c1, int &a);
friend CFraction operator/(int &a, CFraction &c1);
CFraction operator-();//取反
//比较运算符(二目)的重载
bool operator > (CFraction &c1);
bool operator < (CFraction &c1);
bool operator >= (CFraction &c1);
bool operator <= (CFraction &c1);
bool operator == (CFraction &c1);
bool operator != (CFraction &c1);
};
CFraction CFraction :: operator+(CFraction &c1)
{
CFraction c2;
c2.deno = deno * c1.deno;
c2.nume = nume * c1.deno + c1.nume * deno;
return c2;
}
CFraction operator+(CFraction &c1, int &a)
{
CFraction c2;
c2.deno = c1.deno;
c2.nume = c1.nume + a * c1.deno;
return c2;
}
CFraction operator+(int &a, CFraction &c1)
{
CFraction c2;
c2.deno = c1.deno;
c2.nume = c1.nume + a * c1.deno;
return c2;
}
CFraction CFraction :: operator-(CFraction &c1)
{
CFraction c2;
c2.deno = deno * c1.deno;
c2.nume = nume * c1.deno - c1.nume * deno;
return c2;
}
CFraction operator-(CFraction &c1, int &a)
{
CFraction c2;
c2.deno = c1.deno;
c2.nume = c1.nume - a * c1.deno;
return c2;
}
CFraction operator-(int &a, CFraction &c1)
{
CFraction c2;
c2.deno = c1.deno;
c2.nume = c1.nume - a * c1.deno;
return c2;
}
CFraction CFraction :: operator*(CFraction &c1)
{
CFraction c2;
c2.deno = deno * c1.deno;
c2.nume = nume * c1.nume;
return c2;
}
CFraction operator*(CFraction &c1, int &a)
{
CFraction c2;
c2.deno = c1.deno;
c2.nume = c1.nume * a;
return c2;
}
CFraction operator*(int &a, CFraction &c1)
{
CFraction c2;
c2.deno = c1.deno;
c2.nume = c1.nume * a;
return c2;
}
CFraction CFraction :: operator/(CFraction &c1)
{
CFraction c2;
c2.deno = deno * c1.nume;
c2.nume = nume * c1.deno;
return c2;
}
CFraction operator/(CFraction &c1, int &a)
{
CFraction c2;
c2.deno = c1.deno * a;
c2.nume = c1.nume;
return c2;
}
CFraction operator/(int &a, CFraction &c1)
{
CFraction c2;
c2.deno = c1.nume;
c2.nume = c2.deno * a;
return c2;
}
CFraction CFraction :: operator-()//取反
{
CFraction c2;
c2.nume = -nume;
c2.deno = deno;
return c2;
}
void CFraction :: output()
{
int i;
if(deno == 0)
cout<<"error"<<endl;
if(nume >= 0)
{
if(deno < nume)i = deno;
else i = nume;
for(; i > 0; --i)
{
if(nume % i == 0 && deno % i == 0)
{
nume = nume / i;
deno = deno / i;
break;
}
}
cout << nume << "/" << deno << endl;
}
else
{
nume = -nume;
if(deno < nume)i = deno;
else i = nume;
for(; i > 0; --i)
{
if(nume % i == 0 && deno % i == 0)
{
nume = nume / i;
deno = deno / i;
break;
}
}
cout << -nume << "/" << deno << endl;
}
}
void CFraction :: output1()
{
cout << nume << "/" << deno << endl;
}
//比较运算符(二目)的重载
bool CFraction :: operator > (CFraction &c1)
{
CFraction c2, c3;
c2.nume = nume * c1.deno;
c3.nume = c1.nume * deno;
if(c2.nume > c3.nume)return true;
else return false;
}
bool CFraction :: operator < (CFraction &c1)
{
CFraction c2, c3;
c2.nume = nume * c1.deno;
c3.nume = c1.nume * deno;
if(c2.nume < c3.nume)return true;
else return false;
}
bool CFraction :: operator >= (CFraction &c1)
{
CFraction c2, c3;
c2.nume = nume * c1.deno;
c3.nume = c1.nume * deno;
if(c2.nume < c3.nume)return false;
else return true;
}
bool CFraction :: operator <= (CFraction &c1)
{
CFraction c2, c3;
c2.nume = nume * c1.deno;
c3.nume = c1.nume * deno;
if(c2.nume > c3.nume)return false;
else return true;
}
bool CFraction :: operator == (CFraction &c1)
{
CFraction c2, c3;
c2.nume = nume * c1.deno;
c3.nume = c1.nume * deno;
if((c2.nume >= c3.nume) && (c2.nume <= c3.nume))return true;
else return false;
}
bool CFraction :: operator != (CFraction &c1)
{
CFraction c2, c3;
c2.nume = nume * c1.deno;
c3.nume = c1.nume * deno;
if((c2.nume > c3.nume) || (c2.nume < c3.nume))return true;
else return false;
}
void main()
{
int i = 2, m = 3 ;
CFraction c1(3, 6), c2(1,4), c3;
cout << "c1 = ";
c1.output1();
cout << "c2 = ";
c2.output1();
c3 = c1 + c2;
cout << "c1 + c2 = ";
c3.output();
c3 = c1 - c2;
cout << "c1 - c2 = ";
c3.output();
c3 = c1 * c2;
cout << "c1 * c2 = ";
c3.output();
c3 = c1 / c2;
cout << "c1 / c2 = ";
c3.output();
c3 = -c1;
cout << "-c1 = ";
c3.output();
cout << endl;
cout<<"下面比较两个分数的大小:\n";
if (c1 > c2) cout << "c1 > c2" << endl;
if (c1 < c2) cout << "c1 < c2" << endl;
if (c1 == c2) cout << "c1 = c2" << endl;
if (c1 != c2) cout << "c1 ≠ c2" << endl;
if (c1 >= c2) cout << "c1 ≥ c2" << endl;
if (c1 <= c2) cout << "c1 ≤ c2" << endl;
cout<<endl;
c3 = c1 + i;
cout << "c1 + 2 = ";
c3.output();
c3 = i + c1;
cout << "2 + c1 = ";
c3.output();
c3 = c1 - i;
cout << "c1 - 2 = ";
c3.output();
c3 = i - c1;
cout << "2 - c1 = ";
c3.output();
c3 = c1 * m;
cout << "c1 * 3 = ";
c3.output();
c3 = m * c1;
cout << "3 * c1= ";
c3.output();
c3 = c1 / m;
cout << "c1 ÷ 3 = ";
c3.output();
c3 = m / c1;
cout << "3 ÷ c1 = ";
c3.output();
system("pause");
}
上机感言:敲完这几个程序,就有种飞一般的感觉