/*
* 程序的版权和版本声明部分
* Copyright (c)2013, 烟台大学计算机学院学生
* All rightsreserved
* 文件名称:score.cpp
* 作 者:赵兰
* 完成日期: 2013年 5月8 日
* 版本号: v1.0
* 输入描述:略
* 问题描述:实现分数类中的运算符重载, 在分数类中可以完成分数的加减乘除(运算后再化简)、求反、 比较(6种关系)的运算。可以从第5周项目2的代码开始工作。
* 输出:如下
*/
// c.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <cmath>
using namespace std;
class CFraction
{
private:
int nume; // 分子
int deno; // 分母
public:
CFraction(int nu=0,int de=1); //置值,改变值时用
CFraction simplify(); //化简(使分子分母没有公因子)
//比较运算符(二目)的重载
bool operator>(CFraction&t);
bool operator<(CFraction&t);
bool operator==(CFraction&t);
//二目运算符的重载
CFraction operator+(CFraction &n);
CFraction operator-(CFraction &n);
CFraction operator*(CFraction &n);
CFraction operator/(CFraction &n);
friend istream &operator >>(istream &cin,CFraction &e);
friend ostream &operator << (ostream &cout,CFraction &e);
};
CFraction::CFraction(int nu,int de) //置值
{
nume=nu;
deno=de;
}
CFraction CFraction::simplify()
{
CFraction n;
n.nume=nume;n.deno=deno;
int i;
if(nume%deno==0){
n.deno=1;
n.nume=nume/deno;}
else
{
if(nume>deno){
for(i=2;i<n.deno;i++){
if(nume%i==0&&deno%i==0){
n.nume=n.nume/i;
n.deno=n.deno/i;
}
}
}else{
for(i=2;i<=n.nume;i++){
if(n.nume%i==0&&n.deno%i==0){
n.nume=n.nume/i;
n.deno=n.deno/i;
}
}
}
}
return n;
}
bool CFraction::operator>(CFraction &t)
{
if(nume>t.nume||(nume==t.nume&&deno>t.deno)){
return true;}
else{return false;}
}
bool CFraction::operator<(CFraction &t)
{
if(nume<t.nume||(nume==t.nume&&deno<t.deno)){
return true;}
else{return false;
}
}
bool CFraction::operator==(CFraction &t)
{
if(nume==t.nume&&deno==t.deno){
return true;
}else{
return false;
}
}
//二目运算符的重载
CFraction CFraction::operator+(CFraction &n)
{
CFraction t;
t.deno=deno*n.deno;
t.nume=(n.nume)*deno+nume*(n.deno);
return t.simplify();
}
CFraction CFraction::operator-(CFraction &n)
{
CFraction t;
t.deno=deno*n.deno;
t.nume=nume*n.deno-n.nume*deno;
return t.simplify();
}
CFraction CFraction::operator*(CFraction &n)
{
CFraction t;
t.deno=deno*n.deno;
t.nume=nume*n.nume;
return t.simplify();
}
CFraction CFraction::operator/(CFraction &n)
{
CFraction t;
t.deno=deno*n.nume;
t.nume=nume*n.deno;
return t.simplify();
}
istream &operator >>(istream &cin,CFraction &e)
{
cout<<"请输入分数的分子与分母"<<endl;
cin>>e.nume>>e.deno;
e.simplify();
return cin;
}
ostream &operator << (ostream &cout,CFraction &e)
{
if(e.deno==1){
cout<<e.nume<<endl;
}else{
cout<<e.nume<<"/"<<e.deno<<endl;
}
return cout;
}
int main()
{
CFraction n1,n2,n; //构造函数,初始化用
cin>>n1>>n2;
cout<<"n1为:"<<n1;
cout<<"n2为:"<<n2;
cout<<"下面比较两个时间大小:\n";
if(n1>n2)cout<<"n1>n2"<<endl;
if(n1<n2)cout<<"n1<n2"<<endl;
if(n1==n2)cout<<"n1=n2"<<endl;
cout<<endl;
//下面自行设计对其他运算符的重载的测试
n=n1+n2;
cout<<"n1+n2="<<n;
n=n1-n2;
cout<<"n1-n2="<<n;
n=n1*n2;
cout<<"n1*n2="<<n;
n=n1/n2;
cout<<"n1/n2="<<n;
return 0;
}