对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;        }


总结:

对于要求并不明确的函数,可以根据题目的要求,或者是规定的数据结构进行分析,然后在考虑究竟该怎么写这段函数体。

对于类中的运算符重载在算是比较简单的,根据题目中的要求,以及相关的知识,便可以正确的进行重载。

但是在敲代码的同时,也需要考虑到不同情况下,代码会出现什么不足的地方,以便于在之后进行扩充。




0 0