編寫程序,完成以下功能:
1)定義表示金額的類Money,有私有成員yuan、jiao、fen,分別代表元、角、分的值;
2)將+、-、*、/四個運算符重載為普通函數,然后聲明為Money類的友元;
3)編寫main函數,測試Money。
代碼如下:
1 #include<iostream> 2 using namespace std; 3 #include<string> 4 class Money //創建Money類 5 {public: 6 Money(int y=0,int j=0,int f=0); 7 friend Money operator+(Money a,Money b); //重載+運算符 8 friend Money operator-(Money a,Money b); //重載-運算符 9 friend Money operator*(Money a,Money b); //重載*運算符 10 friend Money operator/(Money a,Money b); //重載/運算符 11 void Display(string); //聲明輸出函數 12 private: 13 int yuan,jiao,fen; //定義私有成員元、角、分 14 void Optimize(); 15 }; 16 17 void Money::Optimize() //Money調整函數 18 { 19 if(fen>=10) { jiao++; fen-=10; } 20 else if(fen<0){ jiao--; fen+=10; } 21 if(jiao>=10) { yuan++; jiao-=10; } 22 else if(jiao<0){ yuan--; jiao+=10; } 23 } 24 25 26 Money::Money(int y,int j,int f) 27 { yuan=y; jiao=j; fen=f; Optimize(); } 28 29 Money operator+(Money a,Money b) // + 運算符重載的類外定義 30 { 31 Money t; 32 t.yuan=a.yuan+b.yuan; 33 t.fen=a.fen+b.fen; 34 t.jiao=a.jiao+b.jiao; 35 t.Optimize(); 36 return t; 37 } 38 39 Money operator-(Money a,Money b) // - 運算符重載的類外定義 40 { 41 Money t; 42 t.yuan=a.yuan-b.yuan; 43 t.fen=a.fen-b.fen; 44 t.jiao=a.jiao-b.jiao; 45 t.Optimize(); 46 return t; 47 } 48 49 Money operator*(Money a,Money b) // * 運算符重載的類外定義 50 { 51 Money t; 52 t.yuan=a.yuan*b.yuan; 53 t.fen=a.fen*b.fen; 54 t.jiao=a.jiao*b.jiao; 55 t.Optimize(); 56 return t; 57 } 58 59 Money operator/(Money a,Money b) // /運算符重載的類外定義 60 { 61 Money t; 62 t.yuan = a.yuan/b.yuan; 63 t.fen=a.fen/b.fen; 64 t.jiao=a.jiao/b.jiao; 65 t.Optimize(); 66 return t; 67 } 68 69 void Money::Display(string str) 70 { cout<<str<<"="<<yuan<<"."<<jiao<<fen<<"¥"<<endl; } 71 72 int main() 73 { 74 Money cost1(300,5,6),cost2(105,7,6),total1,total2,total3,total4; 75 total1=cost1+cost2; 76 total2=cost1-cost2; 77 total3=cost1*cost2; 78 total4=cost1/cost2; 79 total1.Display("total1=cost1+cost2"); 80 total2.Display("total2=cost1-cost2"); 81 total3.Display("total3=cost1*cost2"); 82 total4.Display("total4=cost1/cost2"); 83 84 getchar();getchar(); 85 return 0; 86 }
運行結果:
一開始我的Money調整函數是這樣的:
void Money::Optimize() { if(fen>=10) { jiao++; fen-=10; } if(jiao>=10) { yuan++; jiao-=10; } }
運行結果:
結果的第二行”角“居然出現了負數-20!什么原因導致的呢?讓我們回到代碼分析。
主函數賦值中cost1(300,5,6)和cost2(105,7,6),發現5”角“<7”角“;再看給出的調整函數比較的是 if(fen>=10)和if(jiao>=10),發現問題:調整函數未考慮0<fen<10和0<jiao<10的情況。
怎么解決呢?低位不夠就往高位借唄。計算過程是沒問題的,而且我們要的是結果,所以可以根據結果來修正。在原調整函數添加:
else if(fen<0){ jiao--; fen+=10; }
//輸出結果”分“為負數時,向”角“借一位,”角“減1,分加10。
同理:
else if(jiao<0){ yuan--; jiao+=10; }
//輸出結果”角“為負數時,向”元“借一位,”元“減1,角加10。
另外:
dev c++及VC++2005以上編譯器運行結果正確,而VC++6.0下會報錯:
原因:
VC++6.0編譯系統沒有完全實現C++標准,它所提供的不帶后綴".h"的頭文件不支持把雙目運算符重載為友元函數。但是它提供的帶后綴".h"的頭文件可以支持此功能。
解決方法:
法一:使用dev c++及VC++2005以上編譯器。
法二:將頭文件改為#include<iostream.h>。