C++走向远洋——53(项目一1、分数类的重载、加减乘除、比较)
- */
- * Copyright (c) 2016,烟台大学计算机与控制工程学院
- * All rights reserved.
- * 文件名:text.cpp
- * 作者:常轩
- * 微信公众号:Worldhello
- * 完成日期:2016年5月25日
- * 版本号:V1.0
- * 问题描述:分数类的重载
- * 程序输入:无
- * 程序输出:见运行结果
- */
- #include<iostream>
- #include<Cmath>
- using namespace std;
- class CFraction{
- private:
- int nume; //分子
- int deno; //分母
- public:
- CFraction(int nu=0,int de=0);
- CFraction operator+(const CFraction &n); //分数相加
- CFraction operator-(const CFraction &n); //分数相减
- CFraction operator*(const CFraction &n); //分数相乘
- CFraction operator/(const CFraction &n); //分数相除
- void display(); //输出分数
- void simplify(); //分数化简
- 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);
- };
- CFraction::CFraction(int nu,int de) //构造函数
- {
- nume=nu;
- deno=de;
- }
- void CFraction::display() //输出函数
- {
- cout<<nume<<"/"<<deno<<endl;
- }
- void CFraction::simplify() //分数化简
- {
- int m,n,r;
- n=fabs(deno);
- m=fabs(nume);
- if(nume==0)
- deno=0;
- else{
- while(r=m%n) // 求m,n的最大公约数
- {
- m=n;
- n=r;
- }
- deno/=n; // 化简
- nume/=n;
- if (deno<0) // 将分母转化为正数
- {
- deno=-deno;
- nume=-nume;
- }
- }
- }
- CFraction CFraction::operator +(const CFraction &n) //定义分数相加
- {
- CFraction t;
- t.deno=this->deno*n.deno;
- t.nume=this->nume*n.deno+n.nume*this->deno;
- t.simplify();//化简
- return t;
- }
- CFraction CFraction::operator -(const CFraction &n) //定义分数相减
- {
- CFraction t;
- t.deno=this->deno*n.deno;
- t.nume=this->nume*n.deno-n.nume*this->deno;
- t.simplify();//化简
- return t;
- }
- CFraction CFraction::operator *(const CFraction &n) //定义分数相乘
- {
- CFraction t;
- t.deno=n.deno*this->deno;
- t.nume=n.nume*this->nume;
- t.simplify();//化简
- return t;
- }
- CFraction CFraction::operator /(const CFraction &n) //定义分数相除
- {
- CFraction t;
- t.deno=n.nume*this->deno;
- t.nume=n.deno*this->nume;
- t.simplify();//化简
- return t;
- }
- //比较运算符重载
- 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) 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(2,3),b(1,3);
- CFraction c;
- c=a+b;
- cout<<"c=";
- c.display();
- c=a*b;
- cout<<"c=";
- c.display();
- c=a-b;
- cout<<"c=";
- c.display();
- c=a/b;
- cout<<"c=";
- c.display();
- if(a>b)
- cout<<"a>b";
- return 0;
- }
运行结果:
心得:
这次感觉有必要写一下了,这个程序一开始思路错了,化简过程弄得复杂了,最终无路可走后看了一下参考答案后豁然开朗
附原始代码:
- #include<iostream>
- using namespace std;
- class CFraction{
- private:
- int nume; //分子
- int deno; //分母
- public:
- CFraction(int nu=0,int de=0);
- CFraction operator+(const CFraction &n);
- CFraction operator%(const CFraction &n);
- void display();
- friend int gcd(CFraction &,CFraction &); //构造函数及运算符重载的函数声明
- friend int Zxg(CFraction &,CFraction &);
- };
- CFraction CFraction::operator %(CFraction &n)
- {
- int fenmu;
- fenmu=this->deno%n.deno;
- CFraction t(this->nume,fenmu);
- return t;
- }
- int gcd(CFraction &a,CFraction &b)
- {
- if(a.deno<=b.deno)
- {
- if(b.deno%a.deno==0)
- return b.deno;
- else
- return(gcd(a,b%a));
- }
- else
- return gcd(b,a);
- }
- int Zxg(CFraction a,CFraction b)
- {
- return a.deno*b.deno/gcd(a.deno,b.deno);
- }
- CFraction::CFraction(int nu,int de)
- {
- nume=nu;
- deno=de;
- }
- CFraction CFraction::operator +(CFraction &n)
- {
- int fenzi,fenmu;int l;
- if(this.deno==n.deno)
- {
- fenzi=n.nume+this->nume;
- fenmu=this->deno;
- }
- else
- {
- fenmu=Zxg(this,n.deno);
- fenzi=fenmu/n.deno*n.nume+fenmu/this->deno*this->nume;
- }
- CFraction t(fenzi,fenmu);
- return t;
- }
- void CFraction::display()
- {
- cout<<nume<<"/"<<deno;
- }
- int main()
- {
- CFraction a(1,3),b(1,3);
- CFraction c;
- c=a+b;
- c.display();
- return 0;
- }
可以看到一开始的思路比较混乱,想到哪就写哪,最终导致补不上了原来的大洞,以后写的时候要进行整体考虑后再下手也不迟。另外this指针好用也不能乱用,辨别清楚什么时候该用局部变量什么时候该用全局变量,写着这个程序实在挺累的,实现完每一个重载函数后也不想补全测试函数了,不过重载的应该都对了,明天接着做
C++走向远洋——53(项目一1、分数类的重载、加减乘除、比较)的更多相关文章
- C++走向远洋——55(项目一3、分数类的重载、>>
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++走向远洋——54(项目一2、分数类的重载、取倒数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++走向远洋——(项目二、存储班长信息的学生类、派生)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- 连分数(分数类模板) uva6875
//连分数(分数类模板) uva6875 // 题意:告诉你连分数的定义.求连分数,并逆向表示出来 // 思路:直接上分数类模板.要注意ai可以小于0 #include <iostream> ...
- OC2_分数类
// // Fraction.h // OC2_分数类 // // Created by zhangxueming on 15/6/10. // Copyright (c) 2015年 zhangxu ...
- 第十七周oj刷题——Problem B: 分数类的四则运算【C++】
Description 编写分数类Fraction,实现两个分数的加.减.乘和除四则运算.主函数已给定. Input 每行四个数,分别表示两个分数的分子和分母,以0 0 0 0 表示结束. Outpu ...
- Problem F: 分数类的类型转换
Description 封装一个分数类Fract,用来处理分数功能和运算,支持以下操作: 1. 构造:传入两个参数n和m,表示n/m:分数在构造时立即转化成最简分数. 2. show()函数:分数 ...
- Problem E: 分数类的输出
Problem E: 分数类的输出 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 2699 Solved: 1227[Submit][Status][ ...
- java的分数类
概述 分数类在算法中非常重要, 而在java中不那么重要,java基础类库提供 了biginteger了,提供类似方式, package 组合数学; public class Fraction { p ...
随机推荐
- 吴裕雄--天生自然 PYTHON3开发学习:网络编程
# 导入 socket.sys 模块 import socket import sys # 创建 socket 对象 serversocket = socket.socket( socket.AF_I ...
- 统计学中比较重要的分布及python中使用方法
比较重要的四种分布:正态分布.卡方分布.F分布.t分布 卡方分布概率密度曲线 t分布概率密度曲线 F分布概率密度曲线 参考资料: 统计学中四个概率分布 重要抽样分布
- 4412开发板QtE系统下MT6620-wifi的测试
基于iTOP4412系统烧写并启动之后,使用如下命令.wpa_passphrase XXX "YYY " >> /etc/wpa_supplicant.conf其中 X ...
- scala编程(八)——函数和闭包
当程序变得庞大时,你需要一些方法把它们分割成更小的,更易管理的片段.为了分割控制流,Scala 提供了所有有经验的程序员都熟悉的方式:把代码分割成函数.实际上,Scala 提供了许多 Java 中没有 ...
- scala编程(六)——函数式对象
Rational 的式样书 分数:rational number 是一种可以表达为比率 d n 的数字,这里的 n 和 d 是数字,其中 d 不能为零.n 被称作是分子:numerator,d 被称作 ...
- idea出现 Unable to open debugger port (127.0.0.1:xxxx): java.net.SocketException "socket closed" 解决方案
第一种:重启电脑,太费劲: 第二种: 1)根据端口号找到进程pid netstat -aon|findstr "1099" 2)杀掉进程pid即可 netstat -aon|fin ...
- Factual question|具体特殊
Factual question:答案一定出于文章,不是总结 流程:找定位词做连连看,找对定位词,先看此句,然后看选项回文对照.如果找不到找上下两句话. 为了缩小范围,定位词是具体特殊,不要抽象词,可 ...
- RNA sequence单分子直测技术
生命组学 按照功能分类遗传物质,可能的分类有系统流.操作流.平衡流等等.下面是使用该理论解释DNA与RNA的关系: DNA和RNA有很大不同,DNA存储遗传信息,作为生命活动的最内核物质,如同操作系统 ...
- <luogu1347>排序
本来打算当打了个拓扑的板子 后来发现并不只是个板子 差不多 管他呢 #include<cstdio> #include<cstring> #include<iostrea ...
- drf三大认证
源码分析 """ 1)APIView的dispath(self, request, *args, **kwargs) 2)dispath方法内 self.initial( ...