對C++運算符重載的作業分析

首先,讓我們看看這道題目:

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


總結:

對於要求並不明確的函數,可以根據題目的要求,或者是規定的數據結構進行分析,然後在考慮究竟該怎麼寫這段函數體。

對於類中的運算符重載在算是比較簡單的,根據題目中的要求,以及相關的知識,便可以正確的進行重載。

但是在敲代碼的同時,也需要考慮到不同情況下,代碼會出現什麼不足的地方,以便於在之後進行擴充。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章