/*
* Copyright (c) 2013, 烟台大学计算机学院
* All rights reserved.
* 文件名称:test.cpp
* 作者:邱学伟
* 完成日期:2013 年 5 月 4 日
* 版本号:v1.0
* 输入描述:无
* 问题描述:分数和整型数的运算符重载“+ - * /等”
* 程序输出:
* 问题分析:
* 算法设计:略
*/
#include <iostream>
#include <cmath>
using namespace std;
class CFraction
{
private:
int nume;//分子
int deno;//分母
public:
CFraction(int nu=0,int de=1):nume(nu),deno(de){}//构造函数定义,de=1分母不能为0!
void simplify();//化简分数
void display();//展示分数
friend CFraction operator+(const CFraction &c1,const CFraction &c2);//分数之间的加减乘除,友元函数实现
friend CFraction operator-(const CFraction &c1,const CFraction &c2);
friend CFraction operator*(const CFraction &c1,const CFraction &c2);
friend CFraction operator/(const CFraction &c1,const CFraction &c2);
friend CFraction operator+(const CFraction &c,const int i);//分数和整数的加减乘除
friend CFraction operator+(const int i,const CFraction &c);
friend CFraction operator-(const CFraction &c,const int i);
friend CFraction operator-(const int i,const CFraction &c);
friend CFraction operator*(const CFraction &c,const int i);
friend CFraction operator*(const int i,const CFraction &c);
friend CFraction operator/(const CFraction &c,const int i);
friend CFraction operator/(const int i,const CFraction &c);
friend bool operator==(const CFraction &c1,const CFraction &c2);
friend bool operator!=(const CFraction &c1,const CFraction &c2);
friend bool operator<=(const CFraction &c1,const CFraction &c2);
friend bool operator>=(const CFraction &c1,const CFraction &c2);
friend bool operator>(const CFraction &c1,const CFraction &c2); //比较大小
friend bool operator<(const CFraction &c1,const CFraction &c2);
CFraction operator+();//取正
CFraction operator-();//取反
};
//分数的化简
void CFraction::simplify()
{
int d,n,r;
d=fabs(deno);//分母 “fabs()” 的作用求浮点数x的绝对值。
n=fabs(nume);//分子
if(d<n)
{
r=d;
d=n;
n=r;
}
while(r=d%n)
{
d=n;
n=r;
}
deno=deno/n;
nume=nume/n;
//将分母转化成正数
if(deno<0)
{
deno=-deno;
nume=-nume;
}
}
//展示分数
void CFraction::display()
{
cout<<"("<<nume<<"/"<<deno<<")"<<endl;
}
//分数相加
CFraction operator+(const CFraction &c1,const CFraction &c2)
{
CFraction c;
c.nume=c1.nume*c2.deno+c2.nume*c1.deno;
c.deno=c1.deno*c2.deno;
c.simplify();
return c;
}
//分数相减
CFraction operator-(const CFraction &c1,const CFraction &c2)
{
CFraction c;
c.nume=c1.nume*c2.deno-c2.nume*c1.deno;
c.deno=c1.deno*c2.deno;
c.simplify();
return c;
}
//分数相乘
CFraction operator*(const CFraction &c1,const CFraction &c2)
{
CFraction c;
c.nume=c1.nume*c2.nume;
c.deno=c1.deno*c2.deno;
c.simplify();
return c;
}
//分数相除
CFraction operator/(const CFraction &c1,const CFraction &c2)
{
CFraction c;
c.nume=c1.nume*c2.deno;
c.deno=c1.deno*c2.nume;
c.simplify();
return c;
}
//分数和整数的加法
CFraction operator+(const CFraction &c,const int i)
{
CFraction c0;
c0.nume=c.nume+i*c.deno;
c0.deno=c.deno;
c0.simplify();
return c0;
}
CFraction operator+(const int i,const CFraction &c)
{
CFraction c0;
c0.nume=c.nume+i*c.deno;
c0.deno=c.deno;
c0.simplify();
return c0;
}
//分数和整数的减法
CFraction operator-(const CFraction &c,const int i)
{
CFraction c0;
c0.nume=c.nume-i*c.deno;
c0.deno=c.deno;
c0.simplify();
return c0;
}
CFraction operator-(const int i,const CFraction &c)
{
CFraction c0;
c0.nume=i*c.deno-c.nume;
c0.deno=c.deno;
c0.simplify();
return c0;
}
//分数和整数的乘法
CFraction operator*(const CFraction &c,const int i)
{
CFraction c0;
c0.nume=c.nume*i;
c0.deno=c.deno;
c0.simplify();
return c0;
}
CFraction operator*(const int i,const CFraction &c)
{
CFraction c0;
c0.nume=c.nume*i;
c0.deno=c.deno;
c0.simplify();
return c0;
}
//分数和整数的除法
CFraction operator/(const CFraction &c,const int i)
{
CFraction c0;
c0.nume=c.nume;
c0.deno=c.deno*i;
c0.simplify();
return c0;
}
CFraction operator/(const int i,const CFraction &c)
{
CFraction c0;
c0.nume=c.deno*i;
c0.deno=c.nume;
c0.simplify();
return c0;
}
//分数取正
CFraction CFraction::operator +()
{
return *this;
}
//分数取负号
CFraction CFraction::operator -()
{
CFraction c;
c.deno=-deno;
c.nume=-nume;
return c;
}
//比较两个分数的大小
bool operator>(const CFraction &c1,const CFraction &c2)
{
double t1,t2;
t1=c1.nume*c2.deno;
t2=c2.nume*c1.deno;
if(t1>t2)
return true;
else
return false;
}
bool operator<(const CFraction &c1,const CFraction &c2)
{
double t1,t2;
t1=c1.nume*c2.deno;
t2=c2.nume*c1.deno;
if(t1<t2)
return true;
else
return false;
}
bool operator >=(const CFraction &c1,const CFraction &c2)
{
double t1,t2;
t1=c1.nume*c2.deno;
t2=c2.nume*c1.deno;
if(t1<t2)
return false;
else
return true;
}
bool operator <=(const CFraction &c1,const CFraction &c2)
{
double t1,t2;
t1=c1.nume*c2.deno;
t2=c2.nume*c1.deno;
if(t1>t2)
return false;
else
return true;
}
bool operator ==(const CFraction &c1,const CFraction &c2)
{
if(c1!=c2)
return false;
else
return true;
}
bool operator!=(const CFraction &c1,const CFraction &c2)
{
if(c1>c2 || c1<c2 )
return true;
else
return false;
}
int main()
{
CFraction x(1,3),y(-5,10),s;
cout<<"分数x=1/3 y=-5/10"<<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;
CFraction c1(5,3),c2;
//以下建议在调试环境中完成测试,
c2=c1+5;
c2=5+c1;
c2=c1-5;
c2=5-c1;
c2=c1*5;
c2=5*c1;
c2=c1/5;
c2=5/c1;
bool b;
b=(c1>2);
b=(2>c1);
return 0;
}
【上篇】Asp.Net MVC 3 【URLs, Routing,and Areas】
【下篇】Delphi中,indy控件实现收发邮件的几点学习记录( 可以考虑加入多线程,用多个邮箱做一个邮箱群发器)
【下篇】Delphi中,indy控件实现收发邮件的几点学习记录( 可以考虑加入多线程,用多个邮箱做一个邮箱群发器)