1.RMB类
要求:
定义一个RMB类 Money,包含元、角、分三个数据成员,友元函数重载运算符‘+’(加)
和 ‘-’(减),实现货币的加减运算
例如:
请输入元、角 分:
2 3 4
请输入元、角 分:
3 7 3
和:6元0角7分
差:-1元3角9分
又例如:
请输入元、角 分:
2 3 4
请输入元、角 分:
3 0 0
和:4元6角0分
差:-0元6角6分
代码实现:
1 #include <iostream> 2 using namespace std; 3 4 class Money 5 { 6 private: 7 int yuan, jiao, fen; 8 bool flag; //标志位,0表示钱数为正,1表示钱数为负 -> 默认结果的钱数为正 9 public: 10 Money(); 11 Money(int fg, int y=0, int j=0, int f=0): yuan(y), jiao(j), fen(f), flag(fg){} 12 friend Money operator+(Money a, Money b); 13 friend Money operator-(Money a, Money b); 14 void display(); 15 16 }; 17 18 Money::Money() 19 { 20 flag = 0; 21 cout << "请输入元、角 分:" <<endl; 22 cin >> yuan >> jiao >> fen; 23 } 24 25 void Money::display() 26 { 27 if(flag==1) cout << '-'; 28 cout << yuan << "元" << jiao << "角" << fen << "分" << endl; 29 } 30 31 //请用友元函数重载加/减,并要在类Money中声明为友元 32 //TODO重载加 类外定义Money类的+重载运算 33 Money operator+(Money a, Money b) 34 { 35 Money temp(0); 36 // 将钱全部转化成分来计算 37 int money_a = a.yuan*100 + a.jiao*10 + a.fen*1; 38 int money_b = b.yuan*100 + b.jiao*10 + b.fen*1; 39 int res = money_a + money_b; 40 // 因为是相加 故应该结果是正的 所以不用判断符号 但是相减时 结果可能为负 就要判断符号 41 temp.yuan = res/100; 42 res = res % 100; 43 temp.jiao = res/10; 44 temp.fen = res % 10; 45 46 // 返回结果对象 47 return temp; 48 } 49 50 //TODO重载减 类外定义Money类的-重载运算 51 Money operator-(Money a, Money b) 52 { 53 Money temp(0); 54 // 将钱全部转化成分来计算 55 int money_a = a.yuan*100 + a.jiao*10 + a.fen*1; 56 int money_b = b.yuan*100 + b.jiao*10 + b.fen*1; 57 int res = money_a - money_b; 58 // 因为是相减时 结果可能为负 就要判断符号 59 if(res < 0) 60 { 61 temp.flag = 1; 62 res = -res; 63 } 64 temp.yuan = res/100; 65 res = res % 100; 66 temp.jiao = res/10; 67 temp.fen = res % 10; 68 69 // 返回结果对象 70 return temp; 71 } 72 73 int main() 74 { 75 Money m1, m2, m3(0), m4(0); //m3用来记录和,m4用来记录差 76 77 // + 78 m3=m1+m2; 79 cout<<"和:"; 80 m3.display(); 81 82 // - 83 m4=m1-m2; 84 cout<<"差:"; 85 m4.display(); 86 87 return 0; 88 }
2.日期类运算符重载
要求:
定义一个日期类Date,包含年、月、日三个数据成员
友元函数重载自增运算符(++),实现日期的自增。运行结果如下
例如:
请输入年、月、日:
2016 11 11
今天是:2016-11-11
明天是:2016-11-12
请完成以下程序 ,并注意特殊情况,例
输入的是2016-12-31日
输出的是2017-1- 1日
代码实现:
1 #include <iostream> 2 using namespace std; 3 4 class Date{ 5 private: 6 int year; 7 int month; 8 int day; 9 public: 10 Date(); 11 Date operator++(int); // 申明重载的操作符,这种方法是后缀++ 12 /* 13 ++和--重载注意: ++和--有前后缀之分,另外下面的int只是一个占位符用来提示编译器 14 类名 operator++(); ++前缀 -> 调用方式: ++对象名 15 类名 operator--(); --前缀 -> 调用方式: --对象名 16 类名 operator++(int); ++后缀 -> 调用方式: 对象名++ 17 类名 operator--(int); --后缀 -> 调用方式: 对象名-- 18 */ 19 void display(); 20 }; 21 22 // 判断是否是闰年 是闰年返回1 不是返回0 23 int judge(int year) 24 { 25 if(year%4==0&&year%100!=0||year%400==0) 26 return 1; //闰年 27 return 0; //非闰年 28 } 29 30 // 构造函数 31 Date::Date() 32 { 33 cout<<"请输入年、月、日: "; 34 cin>>year>>month>>day; 35 } 36 37 // 运算符重载 38 Date Date::operator++(int) 39 { 40 // 数组存储一年12个月的天数,如果对象中的年份为闰年就将2月份的天数+1 41 int month_days[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 42 if(judge(year)) 43 { 44 month_days[1]++; 45 } 46 47 // 天数刚好是这个月的最后一天 就要判断月份是否是一年的最后一个月(12月) 48 // 如果是12月 那么说明这一天是这一年的最后一天 那么年份+1 月和天均置1 49 // 如果不是12月 那么就把月份+1,天置1 50 if(day==month_days[month-1]) 51 { 52 if(month==12) 53 { 54 year++; 55 month=1; 56 day=1; 57 } 58 else 59 { 60 month++; 61 day=1; 62 } 63 } 64 // 天数不是这个月的最后一天 就直接把天数+1即可 65 else 66 { 67 day++; 68 } 69 70 // 返回计算后的对象 就是套路 凡是++和--运算符重载 都可以这样做 71 // 当然可以提前用一个temp保存*temp的值然后返回temp 也是同理 书上这两种方法都有 72 return *this; 73 } 74 75 void Date::display() 76 { 77 cout<<year<<"-"<<month<<"-"<<day<<endl; 78 } 79 80 int main() 81 { 82 Date d1; 83 cout<<"今天是:"; 84 d1.display(); 85 d1++; 86 cout<<"明天是:"; 87 d1.display(); 88 }