您的位置:首页 > 移动开发 > IOS开发

第八周任务3:实现分数类中的运算符重载

2012-04-11 18:03 351 查看
/* (程序头部注释开始)

* 程序的版权和版本声明部分

* Copyright (c) 2011, 烟台大学计算机学院学生

* All rights reserved.

* 文件名称:定义一个复数类重载运算符+、-、*、/,使之能用于复数的加减乘除。

* 作 者: 杨建和

* 完成日期: 2012 年 04 月 11 日

* 版 本 号: V1.0

* 对任务及求解方法的描述部分

* 输入描述:

* 问题描述:

* 程序输出:

* 程序头部的注释结束

*/
#include <iostream >
using namespace std;
int gcd(int,int);
class CFraction
{private:
int nume;  // 分子
int deno;  // 分母
public:
CFraction(int nu=0,int de=1);   //构造函数,初始化用
void input();               //按照"nu/de"的格式,如"5/2"的形式输入
void simplify();            //化简(使分子分母没有公因子)
void amplify(int n);            //放大n倍,如2/3放大5倍为10/3
void display();       //输出:以8/6为例,style为0时,输出8/6;
//style为1时,输出4/3;
//style为2时,输出1(1/3),表示一又三分之一;
//不给出参数和非1、2,认为是方式0
CFraction operator+(const CFraction &c);
CFraction operator-(const CFraction &c);
CFraction operator*(const CFraction &c);
CFraction operator/(const CFraction &c);
CFraction operator-();  //取反一目运算
bool operator>(const CFraction &c);
bool operator<(const CFraction &c);
bool operator==(const CFraction &c);
bool operator!=(const CFraction &c);
bool operator>=(const CFraction &c);
bool operator<=(const CFraction &c);

};

//构造函数,初始化用
CFraction::CFraction(int nu,int de)
{
if(de!=0)
{
nume = nu;
deno = de;
}
else
{
cout << "分母不能为零!";
exit(0);
}
}

//按照"nu/de"的格式,如"5/2"的形式输入
void CFraction::input()
{
char c;
while(1)
{
cin >> nume >> c >> deno;
if(c !='/')
cout << "格式不正确,请重新输入!";
else if(deno = 0)
cout << "分母不能为零";
else
break;
}
}
//化简(使分子分母没有公因子)
void CFraction::simplify()
{
int n ;
n = gcd(nume,deno);
nume = nume/n;
deno = deno/n;
}
//求最大公约数的函数
int gcd(int x,int y)
{
int r;
while(y!=0)
{
r = x%y;
x = y;
y = r;
}
return x;
}

void CFraction::display()
{
cout<<"("<<nume<<"/"<<deno<<")"<<endl;
}
CFraction CFraction::operator+(const CFraction &c)
{
CFraction s;
s.deno = deno*c.deno;
s.nume = nume*c.deno+deno*c.nume;
s.simplify();

return s;
}
CFraction CFraction::operator-(const CFraction &c)
{
CFraction s;
s.deno = deno*c.deno;
s.nume = nume*c.deno+deno*c.nume;
s.simplify();

return s;
}

CFraction CFraction::operator*(const CFraction &c)
{
CFraction s;
s.deno = deno*c.deno;
s.nume = nume*c.nume;
s.simplify();

return s;
}

CFraction CFraction::operator/(const CFraction &c)
{
CFraction s;
s.deno = deno*c.nume;
s.nume = nume*c.deno;
s.simplify();

return s;
}
//取反一目运算
CFraction CFraction::operator-()
{
CFraction s;
s.deno=-deno;
s.nume=nume;
s.simplify();
return s;
}
// 分数比较大小
bool CFraction::operator>(const CFraction &c)
{
int this_nume,c_nume,common_deno;
this_nume=nume*c.deno;        // 计算分数通分后的分子,同分母为deno*c.deno
c_nume=c.nume*deno;
common_deno=deno*c.deno;
if (this_nume>c_nume&&common_deno>0||this_nume<c_nume&&common_deno<0)  // 将通分后的分子比较大小
return true;
else
return false;
}

// 分数比较大小
bool CFraction::operator<(const CFraction &c)
{
int this_nume,c_nume,common_deno;
this_nume=nume*c.deno;
c_nume=c.nume*deno;
common_deno=deno*c.deno;
if ((this_nume-c_nume)*common_deno<0)
return true;
else
return false;
}

bool CFraction::operator==(const CFraction &c)
{
if(*this>c||*this<c)
return false;
else
return true;
}
bool CFraction::operator!=(const CFraction &c)
{
if(*this<c||*this>c)
return false;
else
return true;
}
bool CFraction::operator>=(const CFraction &c)
{
if(*this<c)
return false;
else
return true;
}
bool CFraction::operator<=(const CFraction &c)
{
if(*this>c)
return false;
else
return true;
}

int main()
{
CFraction x(2,5),y(-3,9),s;
cout<<"分数x=2/5     y=-3/9"<<endl;
s=x+y;
cout<<"x+y=";
s.display();
s=x-y;
cout<<"x-y=";
s.display();
s=x*y;
cout<<"x*y=";
s.display();
s=x/y;
cout<<"x/y=";
s.display();
s=-x+y;
cout<<"-x+y=";
s.display();

x.display();
if (x>y) cout<<"大于"<<endl;
if (x<y) cout<<"小于"<<endl;
if (x==y) cout<<"等于"<<endl;
y.display();
cout<<endl;
system("pause");
return 0;
}




感言:上机的任务不算太难。。老师 我有一个问题请教你:比较大小的时侯能不能采取 对“—”的重载运算符。这样就可以与0比较大小从而进行判断了啊。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐