编写程序,完成以下功能:
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>。