第八周任务三(实现分数类中的运算符重载)
2012-04-10 20:35
381 查看
* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称: * 作 者: 冯珍珍 * 完成日期: 2012 年 4 月 10 日 * 对任务及求解方法的描述部分 * 输入描述: * 问题描述: 实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、求反、比较(6种关系)的运算。 * 程序输出: * 程序头部的注释结束 */ //实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、求反、比较(6种关系)的运算。 #include<iostream> using namespace std; class CFraction { private: int nume; // 分子 int deno; // 分母 public: //构造函数及运算符重载的函数声明 CFraction(int m=0 ,int d=0):nume(m),deno(d){}; void simplify(); void display(); CFraction operator+(const CFraction &c); //两个分数相加,结果要化简 CFraction operator-(const CFraction &c); //两个分数相减,结果要化简 CFraction operator*(const CFraction &c); //两个分数相乘,结果要化简 CFraction operator/(const CFraction &c); //两个分数相除,结果要化简 CFraction operator+(); //取正一目运算 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); }; //求最大公约数的函数 int gcd(int x,int y) { int r; while(y!=0) { r=x%y; x=y; y=r; } return x; } // 分数化简 void CFraction::simplify() //化简(使分子分母没有公因子) { int c=gcd(nume,deno); nume=nume/c; deno=deno/c; } //显示分数 void CFraction::display() { cout<<"("<<nume<<"/"<<deno<<")"<<endl; } // 分数相加 CFraction CFraction::operator+(const CFraction &c) { CFraction c1; c1.nume=nume*c.deno+c.nume*deno; //当分母不同时,进行分子分母分别相乘并相加求出分数相加后的分子 c1.deno=deno*c.deno; //求出相加后的分母 c1.simplify(); //调用simplify进行分数化简 return c1; } // 分数相减 CFraction CFraction:: operator-(const CFraction &c) { CFraction c1; c1.nume=nume*c.deno-c.nume*deno; //当分母不同时,进行分子分母分别相乘并相减求出分数相减后的分子 c1.deno=deno*c.deno; //求出相减后的分母 c1.simplify(); //调用simplify进行分数化简 return c1; } // 分数相乘 (分子分母分别相乘) CFraction CFraction:: operator*(const CFraction &c) { CFraction c1; c1.nume=nume*c.nume; c1.deno=deno*c.deno; c1.simplify(); return c1; } // 分数相除 CFraction CFraction:: operator/(const CFraction &c) { CFraction c1; if (!c.nume) return *this; c1.nume=nume*c.deno; c1.deno=deno*c.nume; c1.simplify(); return c1; } // 分数取正号 CFraction CFraction:: operator+() { return *this; } // 分数取负号 CFraction CFraction:: operator-() { CFraction c; c.nume=-nume; c.deno=deno; return c; } // 分数比较大小 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; // 将通分后的分子比较大小 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; return false; } // 分数比较大小 bool CFraction::operator==(const CFraction &c) { if (*this!=c) return false; //因已经定义了!=运算符的重载故可直接用对象来比较 return true; } // 分数比较大小 bool CFraction::operator!=(const CFraction &c) { if (*this>c || *this<c) return true; return false; } // 分数比较大小 bool CFraction::operator>=(const CFraction &c) { if (*this<c) return false; return true; } // 分数比较大小 bool CFraction::operator<=(const CFraction &c) { if (*this>c) return false; return true; } int main() { CFraction a(1,3),b(-5,10),c; // cout<<"两个分数为:a=1/3 ,b=-5/10"<<endl; cout<<"两个分数分别为:"<<endl; a.display(); b.display(); c=a+b; cout<<"分数相加为:"<<"a+b="; c.display(); c=a-b; cout<<"分数相减为:"<<"a-b="; c.display(); c=a*b; cout<<"分数相乘为:"<<"a*b="; c.display(); c=a/b; cout<<"分数相除为:"<<"a/b="; c.display(); c=-c; cout<<"c的相反数为:" ; c.display(); a.display(); b.display(); if (a>b) cout<<"a>b"<<endl; if (a<b) cout<<"a<b"<<endl; if (a==b)cout<<"a=b"<<endl; cout<<endl; system("pause"); return 0; }
小结:运算符的重载这次这周进行了大量的应用,这次任务过程中出现了一个小错误,构造函数定义时没有给变量赋初值,导致出现后面函数定义时所有的CFraction c;出现no appropriate default constructor available错误,百度结果显示(C++中,当你自己写了有参数的构造函数的时候,编译器就不会再自动提供无参数的默认构造函数,但是给参数赋值后就表示一个默认的构造函数,所以可以定义类对象)也就是说定义类对象是,类的构造函数必须有一个默认的才可以;
相关文章推荐
- 第八周实验报告任务3 实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除,求反,比较6种关系的运算。
- 第八周实验报告任务4 实现分数类中的运算符重载,分数类中的对象可以和整数型进行四则运算,且运算符合交换律。
- 第八周上机任务四--实现分数类中的运算符重载,分数类中的对象可以和整型数进行四则运算,且运算符合交换律
- 第八周任务三:实现分数类中的运算符重载
- 第八周实验任务三--实现分数类中的运算符重载并可以完成分数的加减乘除、求反、比较的运算
- 第八周任务三实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、求反、比较(6种关系)的运算。
- 第八周任务3:实现分数类中的运算符重载
- c++第八周【任务3】实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、求反、比较(6种关系)的运算。
- 第八周实验任务三--实现分数类中的运算符重载并可以完成分数的加减乘除、求反、比较的运算
- 第八周实验报告任务2 实现Time类中的运算符重载
- 《C++第九周实验报告3-1》----接第8周任务3,定义分数类中<<和>>运算符重载,实现分数的输入输出
- 2013第八周上机任务【项目1 实现复数类中的运算符重载】
- 第八周*【任务1】实现复数类中的运算符重载
- 第8周-任务3-实现分数类中的运算符重载
- 第八周任务二(实现Time类中的运算符重载)
- 第八周项目一任务三——实现复数类中的运算符重载
- 第8周-任务3-实现分数类中的运算符重载
- C++第九周【任务三】定义分数类中<<和>>运算符重载,实现分数的输入输出
- 2013第八周上机任务【项目1 实现复数类中的运算符重载(友元函数)】
- 第八周【任务2】实现Time类中的运算符重载