/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称:
* 作 者: 姜雅明
* 完成日期: 2012 年 04 月 10 日
* 版 本 号: 1.0
* 对任务及求解方法的描述部分
* 输入描述: 分数
* 问题描述: 运算符重载,分数的计算和比较
* 程序输出: 计算后的分数
* 程序头部的注释结束
*/
#include<iostream>
using namespace std;
class CFraction
{private:
int nume; // 分子
int deno; // 分母
public:
CFraction(int nu=0,int de=1); //构造函数,初始化用
void Set(int nu=0,int de=1); //置值,改变值时用
void input(); //按照"nu/de"的格式,如"5/2"的形式输入
void Simplify(); //化简(使分子分母没有公因子)
CFraction operator + (CFraction &f);
CFraction operator - (CFraction &f);
CFraction operator * (CFraction &f);
CFraction operator / (CFraction &f);
CFraction operator - ();
bool operator > (CFraction &f);
bool operator < (CFraction &f);
bool operator >= (CFraction &f);
bool operator <= (CFraction &f);
bool operator == (CFraction &f);
bool operator != (CFraction &f);
void output(int style=0); //输出:以8/6为例,style为0时,输出8/6;
//style为1时,输出4/3;
//style为2时,输出1(1/3),表示一又三分之一;
//不给出参数和非1、2,认为是方式0
};
CFraction:: CFraction(int nu,int de): nume(nu), deno(de){}
void CFraction:: Set(int nu,int de)
{
nume = nu;
deno = de;
}
void CFraction:: input()
{
char ch = '/';
cout << "请输入分数值(nu/de):";
cin >> nume >> ch >> deno;
while(1)
{
if (ch != '/')
{
cout << "格式错误,请重新输入:";
cin >> nume >> ch >> deno;
}
else
{
break;
}
}
}
void CFraction:: Simplify()
{
int i, j;
for (i = 2; i <= nume; ++i)
{
for(j = 2; j <= deno; ++j)
{
if (nume % j == 0 && deno % j == 0)
{
nume = nume / j;
deno = deno / j;
}
}
}
}
CFraction CFraction:: operator + (CFraction &f)
{
CFraction f1;
f1.deno = f.deno * deno;
f1.nume = f.deno * nume + f.nume * deno;
return f1;
}
CFraction CFraction:: operator - (CFraction &f)
{
CFraction f1;
f1.deno = f.deno * deno;
f1.nume = f.deno * nume - f.nume * deno;
return f1;
}
CFraction CFraction:: operator * (CFraction &f)
{
CFraction f1;
f1.deno = f.deno * deno;
f1.nume = f.nume * nume;
return f1;
}
CFraction CFraction:: operator / (CFraction &f)
{
CFraction f1;
f1.nume = f.deno * nume;
f1.deno = f.nume * deno;
return f1;
}
CFraction CFraction:: operator - ()
{
CFraction f1;
f1.deno = deno;
f1.nume = -nume;
return f1;
}
bool CFraction:: operator > (CFraction &f)
{
nume = nume * f.deno;
f.nume = f.nume * deno;
if(nume > f.nume)
return true;
else
return false;
}
bool CFraction:: operator < (CFraction &f)
{
nume = nume * f.deno;
f.nume = f.nume * deno;
if(nume < f.nume)
return true;
else
return false;
}
bool CFraction:: operator >= (CFraction &f)
{
nume = nume * f.deno;
f.nume = f.nume * deno;
if(nume > f.nume || nume == f.nume)
return true;
else
return false;
}
bool CFraction:: operator <= (CFraction &f)
{
nume = nume * f.deno;
f.nume = f.nume * deno;
if(nume < f.nume || nume == f.nume)
return true;
else
return false;
}
bool CFraction:: operator == (CFraction &f)
{
nume = nume * f.deno;
f.nume = f.nume * deno;
if(nume == f.nume)
return true;
else
return false;
}
bool CFraction:: operator != (CFraction &f)
{
nume = nume * f.deno;
f.nume = f.nume * deno;
if(nume != f.nume)
return true;
else
return false;
}
void CFraction:: output(int style)
{
int i;
if (style == 0)
{
cout << nume << "/" << deno << endl;
}
else if (style == 1)
{
Simplify();
if(nume % deno == 0)
{
cout << nume;
cout << endl;
}
else
{
cout << nume << "/" << deno << endl;
}
}
else
{
if (nume > deno)
{
while(nume > deno)
{
if(nume % deno == 0)
{
cout << nume;
cout << endl;
break;
}
else
{
i = nume % deno;
nume = nume /deno;
++i;
cout << i - 1 << "(" <<nume << "/" << deno << ")" << endl;
}
}
}
else
{
cout << nume << "/" << deno << endl;
}
}
}
void main()
{
CFraction cf1;
CFraction cf2;
cf2.Set(8, 6);
cout << "cf2=";
cf2.output(1);
CFraction cf3;
cf3.Set(2,3);
cout << "cf3=";
cf3.output(1);
cf1 = cf2 + cf3;
cout << "cf2+cf3=";
cf1.output(1);
cf1 = cf2 - cf3;
cout << "cf2-cf3=";
cf1.output(1);
cf1 = cf2 * cf3;
cout << "cf2*cf3=";
cf1.output(1);
cf1 = cf2 / cf3;
cout << "cf2/cf3=";
cf1.output(1);
cf1 = cf2;
cf1 = -cf1;
cout << "-cf2=";
cf1.output(1);
if (cf2>cf3) cout<<"cf2>cf3"<<endl;
if (cf2<cf3) cout<<"cf2<cf3"<<endl;
if (cf2==cf3) cout<<"cf2=cf3"<<endl;
if (cf2!=cf3) cout<<"cf2≠cf3"<<endl;
if (cf2>=cf3) cout<<"cf2≥cf3"<<endl;
if (cf2<=cf3) cout<<"cf2≤cf3"<<endl;
system("PAUSE");
}