对C++运算符重载的作业分析
来源:互联网 发布:氟硝西泮片淘宝店 编辑:程序博客网 时间:2024/05/01 19:01
首先,让我们看看这道题目:
(1)私有数据成员三个分别为:元、角、分;
(2)公有成员函数如下:
(1)CRMB(int y=0,int j=0,int f=0) //带默认值的有参构造函数
(2)void StandRMB() //将人民币标准化
(3) CRMB operator+(const CRMB &rmb) //人民币加人民币运算符重载
(4)CRMB operator-(const CRMB &rmb) //人民币减人民币运算符重载
(5)void display() //以元角分的形式输出人民币
(3)设计测试类,完成上述函数的测试。
然后是自己写的代码:
#include <iostream>using namespace std;class CRMB{ int Yuan,Jiao,Fen; public: CRMB(int y=0,int j=0,int f=0) { Yuan=y; Jiao=j; Fen=f; } void StandRMB() { if(Jiao>9||Fen>9||Jiao>9) // 对数据进行标准化处理 { if(Fen>9) { while(Fen>9) { Fen=Fen-10; Jiao=Jiao+1; } } while(Jiao>9) { Jiao=Jiao-10; Yuan=Yuan+1; } } } void Juage() { } CRMB operator+(const CRMB &rmb) { CRMB temp; temp.Yuan=Yuan+rmb.Yuan; temp.Jiao=Jiao+rmb.Jiao; temp.Fen=Fen+rmb.Fen; return temp; } CRMB operator-(const CRMB &rmb) { CRMB temp; temp.Yuan=Yuan-rmb.Yuan; temp.Jiao=Jiao-rmb.Jiao; temp.Fen=Fen-rmb.Fen; if(temp.Yuan>0) { if(temp.Jiao<0) //出现例如13.20-12.30后,进行相关运算,以便于运算更加精确。 { if(temp.Fen<0) { temp.Fen+temp.Fen+10; } temp.Jiao=temp.Jiao+9; temp.Yuan=temp.Yuan-1; } else { if(temp.Fen<0) { temp.Jiao=temp.Jiao-1; temp.Fen=temp.Fen+10; } } } return temp; } void display() { if(Yuan>=0&&Jiao>=0&&Fen>=0) { cout<<Yuan<<"元"<<Jiao<<"角"<<Fen<<"分"<<endl; } else { cout<<"ERROR NUMBER!"<<endl; } } };int main(){ CRMB r(12,2,2),r1(13,2,10),r2(1,23,4),r3,r4; r.StandRMB(); r1.StandRMB(); r2.StandRMB(); r3.StandRMB(); r1.display(); r.display(); r2.display(); r3=r+r1; r3.StandRMB(); r3.display(); r4=r1-r; r4.StandRMB(); r4.display(); return 0;}
题目分析:
首先,这道题目的思路很简单,而且所要求的点并没有什么太大的难度,甚至说是大学C++考试中的送分题。但是,在StandRMB()这个要求上,可能会有许多疑惑。
刚开始接触到这道题目的时候,我认为是直接将元角分换算为X.XX元。但是在题目中给定的构造函数CRMB(int y=0,int j=0,int j=0)很快把我这个想法否定了。int类型转换为double类型的知识点并不常见(至少从我刚学C++到现在还不到一年的时间里,只有一次使用到这个知识点。)。
接着,display()中的要求让我知道了所谓的“标准人民币格式”是怎么一回事:假设输入数字为13,20,3.那么经过StandRMB的转换后,应该变成14元0角3分。
既然要求都明白了,那么接下来便十分简单了。对于StandRMB函数,直接使用简单的while语句判断相关的输入变量是否需要转换。
这道题目中最让人头疼的是对于符号构造中的减法判断。
例如13.20-12.50。按照正常的换算,可以知道这个算法是可以执行的。但是在要求中,明显没有特别说明,挖个坑给你跳。
所以在运算符重载的时候,对于这种想法,也顺便加入了进去:
CRMB operator-(const CRMB &rmb) { CRMB temp; temp.Yuan=Yuan-rmb.Yuan; temp.Jiao=Jiao-rmb.Jiao; temp.Fen=Fen-rmb.Fen; if(temp.Yuan>0)//如果两个数相减,元数大于0,那么这两个钱数必然可以得到一个大于零的值,所以在这里进行考虑。(小于零就没啥可判断的了) { if(temp.Jiao<0)//进一步进行判断,这段是用来判断角小于0时候,对于分的考虑。 { if(temp.Fen<0) { temp.Fen+temp.Fen+10; } temp.Jiao=temp.Jiao+9;//这点特别要注意!因为在分数借去一个数后,Jiao这个数据便减少了一个数,所以这里只可以进行+9的运算。 temp.Yuan=temp.Yuan-1; } else { if(temp.Fen<0) { temp.Jiao=temp.Jiao-1; temp.Fen=temp.Fen+10; } } } return temp; }
总结:
对于要求并不明确的函数,可以根据题目的要求,或者是规定的数据结构进行分析,然后在考虑究竟该怎么写这段函数体。
对于类中的运算符重载在算是比较简单的,根据题目中的要求,以及相关的知识,便可以正确的进行重载。
但是在敲代码的同时,也需要考虑到不同情况下,代码会出现什么不足的地方,以便于在之后进行扩充。
- 对C++运算符重载的作业分析
- c++-运算符的重载
- C++--运算符的重载
- ACM-C+作业复数运算符重载(+与<<)
- 课后作业运算符重载
- 对复数进行的+-*/运算符重载
- [C/C++]运算符的重载
- 类的运算符重载问题分析
- 运算符重载参数的顺序对运算是否有影响
- C++-运算符重载
- [C++]重载运算符
- C#:运算符重载
- c++-++运算符重载
- C++:重载运算符
- 运算符重载(C++)
- [c++]运算符重载
- 【C++】运算符重载
- C++--------------------------------------------运算符重载
- 学习jQuery EasyUI知识点(1)
- GetLastError函数使用及返回代码对照
- 【笔记】JunitTest的运行流程
- Android开发教程--关于onActivityResult没有回调的问题
- ObjectC 类的一些问题解析
- 对C++运算符重载的作业分析
- Spark计算过程分析
- Sql 更改表名,SQL2000批量更改表所有者 的方式
- 最长下降序列——中高级
- DPM(Deformable part model)模型结构初解
- 微软100题(35)矩阵的最大子矩阵
- IOS-UISlider的详细使用
- Struts2、SpringMVC、Servlet(Jsp)性能对比 测试
- AFN的 基本使用