第八周项目三(2):分数类中的运算符重载:升级版
2015-04-25 19:30
417 查看
问题及代码:
运行结果:
学习心得:
在上一篇博客的基础上,这篇加了些内容,因为要实现在分数类中的对象和整数型的四则运算,所以就用了友元函数,bool型函数中用类的对象和整数比较也使用了友元函数。
/* *Copyright (c)2014,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称: 分数类中的运算符重载 .cpp *作 者:白云飞 *完成日期:2015年4月25日 *版 本 号:v1.0 * *问题描述:实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、比较(6种关系)的运算。实现分数类中的对象和整型数的四则运算。分数类中的对象可以和整型数进行四则运算,且运算符合交换律。 *程序输入:分子和分母 *程序输出:分数的各个形式 */ #include <iostream> #include<cmath> #include<cstdlib> using namespace std; int gcd(int m, int n); class CFraction { private: int nume; // 分子 int deno; // 分母 public: CFraction(int nu=0,int de=1); //构造函数,初始化用 CFraction operator+( CFraction &c); CFraction operator-( CFraction &c); CFraction operator*( CFraction &c); CFraction operator/( CFraction &c); friend CFraction operator+(const CFraction &c, int i); friend CFraction operator+(int i, const CFraction &c ); friend CFraction operator-(const CFraction &c, int i); friend CFraction operator-(int i, const CFraction &c ); friend CFraction operator*(const CFraction &c, int i); friend CFraction operator*(int i, const CFraction &c ); friend CFraction operator/(const CFraction &c, int i); friend CFraction operator/(int i, const CFraction &c ); bool operator>(CFraction &c); bool operator<(CFraction &c); bool operator>=(CFraction &c); bool operator<=(CFraction &c); bool operator==(CFraction &c); bool operator!=(CFraction &c); friend bool operator>(const CFraction &c, int i); friend bool operator>(int i, const CFraction &c); friend bool operator<(const CFraction &c, int i); friend bool operator<(int i, const CFraction &c); friend bool operator==(const CFraction &c, int i); friend bool operator==(int i, const CFraction &c); friend bool operator!=(const CFraction &c, int i); friend bool operator!=(int i, const CFraction &c); friend bool operator>=(const CFraction &c, int i); friend bool operator>=(int i, const CFraction &c); friend bool operator<=(const CFraction &c, int i); friend bool operator<=(int i, const CFraction &c); void input(); //按照"nu/de"的格式,如"5/2"的形式输入 void simplify(); //化简(使分子分母没有公因子) void output(); }; CFraction::CFraction(int nu,int de) { if(de!=0) { nume=nu; deno=de; } else { cerr<<"输入错误!"; exit(0); } } CFraction CFraction::operator+( CFraction &c) { CFraction t; t.nume=nume*c.deno+c.nume*deno; t.deno=deno*c.deno; t.simplify(); return t; } CFraction CFraction::operator-( CFraction &c) { CFraction t; t.nume=nume*c.deno-c.nume*deno; t.deno=deno*c.deno; t.simplify(); return t; } CFraction CFraction::operator*( CFraction &c) { CFraction t; t.nume=nume*c.nume; t.deno=deno*c.deno; t.simplify(); return t; } CFraction CFraction::operator/( CFraction &c) { CFraction t; t.nume=nume*c.deno; t.deno=deno*c.nume; t.simplify(); return t; } CFraction operator+(const CFraction &c, int i) { CFraction t; t.nume=i*c.deno+c.nume; t.deno=c.deno; t.simplify(); return t; } CFraction operator+(int i, const CFraction &c ) { CFraction t; t.nume=i*c.deno+c.nume; t.deno=c.deno; t.simplify(); return t; } CFraction operator-(const CFraction &c, int i) { CFraction t; t.nume=c.nume-i*c.deno; t.deno=c.deno; t.simplify(); return t; } CFraction operator-(int i, const CFraction &c ) { CFraction t; t.nume=i*c.deno-c.nume; t.deno=c.deno; t.simplify(); return t; } CFraction operator*(const CFraction &c, int i) { CFraction t; t.nume=i*c.nume; t.deno=c.deno; t.simplify(); return t; } CFraction operator*(int i, const CFraction &c ) { CFraction t; t.nume=i*c.nume; t.deno=c.deno; t.simplify(); return t; } CFraction operator/(const CFraction &c, int i) { CFraction t; t.nume=c.nume; t.deno=i*c.deno; t.simplify(); return t; } CFraction operator/(int i, const CFraction &c ) { CFraction t; t.nume=i*c.deno; t.deno=c.nume; t.simplify(); return t; } bool CFraction::operator>(CFraction &c) { int nume1,nume2; nume1=nume*c.deno; nume2=c.nume*deno; if(nume1-nume2>0) return true; else return false; } bool CFraction::operator<(CFraction &c) { int nume1,nume2; nume1=nume*c.deno; nume2=c.nume*deno; if(nume1-nume2<0) return true; else return false; } bool CFraction::operator>=(CFraction &c) { return !(*this<c); } bool CFraction::operator<=(CFraction &c) { return !(*this>c); } bool CFraction::operator==(CFraction &c) { if(*this!=c) return false; else return true; } bool CFraction::operator!=(CFraction &c) { if(*this>c||*this<c) return true; else return false; } bool operator>(const CFraction &c, int i) { if(c.nume>i*c.deno)return true; else return false; } bool operator>(int i, const CFraction &c) { if(i*c.deno>c.nume)return true; else return false; } bool operator<(const CFraction &c, int i) { if(c.nume<i*c.deno)return true; else return false; } bool operator<(int i, const CFraction &c) { if(i*c.deno<c.nume)return true; else return false; } bool operator==(const CFraction &c, int i) { return c.nume==(i*c.deno); } bool operator==(int i, const CFraction &c) { return c.nume==(i*c.deno); } bool operator!=(const CFraction &c, int i) { return c.nume!=(i*c.deno); } bool operator!=(int i, const CFraction &c) { return c.nume!=(i*c.deno); } bool operator>=(const CFraction &c, int i) { return !(c<i); } bool operator>=(int i, const CFraction &c) { return !(c>i); } bool operator<=(const CFraction &c, int i) { return !(c>i); } bool operator<=(int i, const CFraction &c) { return !(c<i); } void CFraction::input() { int nu,de; char m; cout<<"请输入b分数(分子/分母):"; cin>>nu>>m>>de; if(m!='/') cout<<"输入格式错误"; else if(de==0) cout<<"分母为零,输入错误."; else { nume=nu; deno=de; } } void CFraction::simplify() { int n=gcd(deno, nume); deno/=n; // 化简 nume/=n; } int gcd(int m, int n) //这个函数可以定义为类的成员函数,也可以为一般函数 { int r; if (m<n) { r=m; m=n; n=r; } while(r=m%n) // 求m,n的最大公约数 { m=n; n=r; } return n; } void CFraction::output() { cout<<"("<<nume<<"/"<<deno<<")"<<endl; } int main() { CFraction a(10,12),b,c; cout<<"a=10/12 "<<endl; b.input(); if (a>b) cout<<"a>b"<<endl; if (a<b) cout<<"a<b"<<endl; if (a>=b) cout<<"a>=b"<<endl; if (a<=b) cout<<"a<=b"<<endl; if (a==b) cout<<"a=b"<<endl; if (a!=b) cout<<"a!=b"<<endl; c=a+b; cout<<"a+b="; c.output(); c=a-b; cout<<"a-b="; c.output(); c=a*b; cout<<"a*b="; c.output(); c=a/b; cout<<"a/b="; c.output(); c=a+1; cout<<"a+1="; c.output(); c=1+a; cout<<"1+a="; c.output(); c=a-1; cout<<"a-1="; c.output(); c=1-a; cout<<"1-a="; c.output(); c=a*2; cout<<"a*2="; c.output(); c=2*a; cout<<"2*a="; c.output(); c=a/2; cout<<"a/2="; c.output(); c=2/a; cout<<"2/a="; c.output(); if (a>2) cout<<"a>2"<<endl; if (a<2) cout<<"a<2"<<endl; if (a>=2) cout<<"a>=2"<<endl; if (a<=2) cout<<"a<=2"<<endl; if (a==2) cout<<"a=2"<<endl; if (a!=2) cout<<"a!=2"<<endl; return 0; }
运行结果:
学习心得:
在上一篇博客的基础上,这篇加了些内容,因为要实现在分数类中的对象和整数型的四则运算,所以就用了友元函数,bool型函数中用类的对象和整数比较也使用了友元函数。
相关文章推荐
- 八周 项目3 分数类中的运算符重载
- 第八周【项目3-分数类中的运算符重载】改进
- 第八周上机时间项目3-分数类中的运算符重载
- 第九周项目三分数类中的运算符重载(续)(2)
- 第九周项目三 分数类中的运算符重载(续)
- 第9周项目3-分数类中的运算符重载(续)
- 第8周项目3-分数类中的运算符重载
- 第十三周项目-项目1-分数类中的运算符重载
- 第十三周项目-项目1-(3)分数类中的运算符重载
- C++ 第十三周 多态性 项目1【项目1-分数类中的运算符重载】
- 第13周实践项目1分数类中的运算符重载(1)
- 项目1-分数类中的运算符重载2
- 第十三周项目二:分数类中的运算符重载(4)
- 15第八周项目三——分数类中的运算符重载(2)
- 第七周项目 3 分数类中的运算符重载(2)
- 第八周 课后实践:项目三——分数类中的运算符重载(1)
- 第8周项目三-分数类中的运算符重载 .
- 八周 项目1 实现复数中的运算符重载
- 第8周-项目3-分数类中的运算符重载(续)-++、--、>>、<<
- 第八周项目3-分数类中的运算符重载