Hello,一只爱学习的鱼
大学学习C++运算符重载的时候,老师出了一道“运算符重载+类”的综合练习题,让我们来一起看看吧!
题目:
设计一个日期类Date,包括年、月、日等私有成员;
要求实现基本运算:如一个日期加上天数,一个日期减去天数、两个日期相差天数。
基本设计思路及要求:
1.在Date类中设计如下重载运算符函数:
Date operator+(int days); 返回一个日期加上一个天数得到的日期;
Date operator-(int days); 返回一个日期减去一个天数得到的日期;
int operator-(Date &b); 返回两日期相差的天数。
2.在实现这些重载运算符函数调用以下私有成员函数:
leap(int); 判断指定的年份是否为闰年;
transDate(Date &); 将指定日期转换为从0年0月0日起的天数;
transDay(int); 将指定的0年0月0日起的天数转换为对应的日期。
3.在main( )中,实现日期的基本运算:
(1).闰年与非闰年的判断,以及各月的天数的获得问题,解决办法可设置并引用二维数组;
(2).日期基本问题的实现问题,解决办法是在Date类中设计重载运算符函数:Date operator+(int days)、Date operator-(int days)、int operator-(Date &b),同时调用以下私有成员函数leap(int)、transDate (Date &)、transDay (int)得以实现;
(3).如何使输入的日期有效,如2011 13 34为无效日期,解决办法是在input()中设置判断条件if(month>12||month<1||day>day_tab[leap(year)][month-1]||year<=0),判断日期是否为有效日期。
流程图:
根据要求先写出类:
1 #include2 using namespace std; 3 bool datetime(int, int, int); //使用自定义函数datetime判断输入的日期是否合法,合法返回1,不合法返回0 4 class Date { 5 public: 6 void input(); 7 void output(); 8 Date operator+(int days); 9 Date operator-(int days); 10 int operator-(Date& b); 11 private: 12 int leap(int); 13 int transDate(Date&); 14 int year, month, day; 15 };
然后,完整代码,我写了317行。鉴于篇幅,我讲解重载运算符函数Date operator+(int days),获取完整代码请关注我的公众号(一只爱学习的鲤鱼),回复:1207运算符重载,即可。
1 Date Date::operator+(int days) { 2 int y = this->year, m = this->month, d = this->day; 3 while ((leap(y) == 1 && transDate(*this) + days > 366 && days > 366) || (leap(!y) == 1 && transDate(*this) + days > 365) && days > 365) //简化运算,当days>=365天,直接操作年份,没必要操作月份 4 { 5 y++; 6 if (leap(y) == 1) 7 days = days - 366; 8 else if (!leap(y) == 1) 9 days = days - 365; 10 } 11 continue_: while (((m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) && (days > 31)) //使用了goto语句,当days<365天,操作月份,每轮对月份运算一次,直至days小于当月天数 12 || ((m == 4 || m == 6 || m == 9 || m == 11) && (days > 30)) 13 || (m == 2 && days > 29 && leap(y)) || (m == 2 && days > 28 && !leap(y))) { 14 if (m == 1) { 15 m = 2; days = days - 31; //月份自增,days减去当月的天数 16 goto continue_; 17 } 18 if (m == 2) { 19 if (leap(y)) { m = 3; days = days - 29; } 20 else { m = 3; days = days - 28; } 21 goto continue_; 22 } 23 if (m == 3) { 24 m = 4; days = days - 31; 25 goto continue_; 26 } 27 if (m == 4) { 28 m = 5; days = days - 30; 29 goto continue_; 30 } 31 if (m == 5) { 32 m = 6; days = days - 31; 33 goto continue_; 34 } 35 if (m == 6) { 36 m = 7; days = days - 30; 37 goto continue_; 38 } 39 if (m == 7) { 40 m = 8; days = days - 31; 41 goto continue_; 42 } 43 if (m == 8) { 44 m = 9; days = days - 31; 45 goto continue_; 46 } 47 if (m == 9) { 48 m = 10; days = days - 30; 49 goto continue_; 50 } 51 if (m == 10) { 52 m = 11; days = days - 31; 53 goto continue_; 54 } 55 if (m == 11) { 56 m = 12; days = days - 30; 57 goto continue_; 58 } 59 if (m == 12) { 60 y++; m = 1; days = days - 31; 61 goto continue_; 62 } 63 } 64 if (m == 1 && d + days > 31) { m = 2; d = d + days - 31; } //最后,操作号数 65 else if (m == 2 && d + days > 29 && leap(y)) { m = 3; d = d + days - 29; } 66 else if (m == 2 && d + days > 28 && !leap(y)) { m = 3; d = d + days - 28; } 67 else if (m == 3 && d + days > 31) { m = 4; d = d + days - 31; } 68 else if (m == 4 && d + days > 30) { m = 5; d = d + days - 30; } 69 else if (m == 5 && d + days > 31) { m = 6; d = d + days - 31; } 70 else if (m == 6 && d + days > 30) { m = 7; d = d + days - 30; } 71 else if (m == 7 && d + days > 31) { m = 8; d = d + days - 31; } 72 else if (m == 8 && d + days > 31) { m = 9; d = d + days - 31; } 73 else if (m == 9 && d + days > 30) { m = 10; d = d + days - 30; } 74 else if (m == 10 && d + days > 31) { m = 11; d = d + days - 31; } 75 else if (m == 11 && d + days > 30) { m = 12; d = d + days - 30; } 76 else if (m == 12 && d + days > 31) { y++; m = 1; d = d + days - 31; } //注意!this->day加days超过了31,年份要自增 77 else d = d + days; 78 this->month = m; 79 this->year = y; 80 this->day = d; 81 return *this; //返回this对象 82 }
代码注释,写明我的编程思路和在编程中遇到的坑。(附:养成写代码注释,也是一种好习惯哦!)
下面是我在Visual Studio 2019的运行结果:
关注我的公众号(一只爱学习的鲤鱼)
回复:1207运算符重载。即可得到运算符重载+日期类Date.cpp文件
最后,也欢迎C++大佬,在评论区或公众号提出其他的解题思路,我们下期再见。