相关文章:日期类(运算符重载应用)详细版
目录
前言
在上篇文章中(【c++】类与对象实践:日期类(运算符重载应用)详细版),我们对日期类进行一个完整的实现!
那么接下来我们可以学以致用,完成下列题目!
实践1:计算日期到天数转换
题目
计算日期到天数转换_牛客题霸_牛客网 (nowcoder.com)
方法
获取每月天数 int GetMonthDays(int year, int month) ;
判断闰年:
不能被100整除能被4整除 或 能被400整除。
平年二月28天;
闰年29天。
1 3 5 7 8 10 12 月有31天
4 6 9 11 月有30天
日期类中实现的前置++重载,Date& operator++() ;日期类中实现的工具方法,日期差值计算 int operator-(const Date& d) const ;
关键代码
cpp
int GetMonthDays(int year, int month) {
static int monthDays[13] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))
return 29;
else
return monthDays[month];
}
Date& operator++() {
*this += 1;
return *this;
}
int operator-(const Date& d) const {
Date max = *this;
Date min = d;
int flag = 1;
int cnt = 0;
if (*this < d) {
max = d;
min = *this;
flag = -1;
}
while (min != max) {
++cnt;
++min;
}
return cnt * flag;
}
int TheDayOfYear() {
return (*this - Date(_year, 1, 1)) + 1;
}
完整代码
cpp
#include <iostream>
using namespace std;
class Date {
public:
Date(int year = 0, int month = 0, int day = 0) {
_year = year;
_month = month;
_day = day;
}
bool operator>(const Date& d) const {
if (this->_year > d._year)
return true;
else if (this->_year == d._year && this->_month > d._month)
return true;
else if (this->_year == d._year && this->_month == d._month &&
this->_day > d._day)
return true;
else
return false;
}
bool operator==(const Date& d) const {
if (this->_year == d._year
&& this->_month == d._month
&& this->_day == d._day)
return true;
else
return false;
}
bool operator!=(const Date& d) const {
return !(*this == d);
}
bool operator<(const Date& d) const {
return !(*this > d || *this == d);
}
Date& operator-=(int day) {
if (day < 0) {
*this += -day;
return *this;
}
_day -= day;
while (_day <= 0) {
_month--;
if (_month == 0) {
_month = 12;
_year--;
}
_day += GetMonthDays(_year, _month);
}
return *this;
}
Date& operator+=(int day) {
if (day < 0) {
*this -= -day;
return *this;
}
_day += day;
while (_day > GetMonthDays(_year, _month)) {
_day -= GetMonthDays(_year, _month);
_month++;
if (_month == 13) {
_month = 1;
_year++;
}
}
return *this;
}
int GetMonthDays(int year, int month) {
static int monthDays[13] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))
return 29;
else
return monthDays[month];
}
Date& operator++() {
*this += 1;
return *this;
}
int operator-(const Date& d) const {
Date max = *this;
Date min = d;
int flag = 1;
int cnt = 0;
if (*this < d) {
max = d;
min = *this;
flag = -1;
}
while (min != max) {
++cnt;
++min;
}
return cnt * flag;
}
int TheDayOfYear() {
return (*this - Date(_year, 1, 1)) + 1;
}
private:
int _year;
int _month;
int _day;
};
int main() {
int year, month, day;
while (cin >> year >> month >> day) {
Date d(year, month, day);
cout << d.TheDayOfYear() << endl;
}
return 0;
}
实践2:日期差值
题目
方法
轻而易举,在日期类中,我们已经实现了对于计算日期差值的工具方法。
对于这道题目,我们可以直接套用!!
关键代码
cpp
void getDaynums(const Date& d) {
Date max = d;
Date min = *this;
if (!(max > min)) {
max = *this;
min = d;
}
int day = 0;
while (min != max) {
min++;
day++;
}
day++;
cout << day << endl;
}
完整代码
cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
class Date {
private:
int _year;
int _day;
int _month = 0;
int getMonthDay(int year, int month) {
int monthArr[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//闰年 二月不同
if (month == 2 && ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))) {
return 29;
}
return monthArr[month];
}
public:
Date(int year, int month, int day) : _year(year), _month(month), _day(day) { }
bool operator>(const Date& d) {
if (_year > d._year) {
return true;
} else if (_year == d._year && _month > d._month) {
return true;
} else if (_year == d._year && _month == d._month && _day > d._day) {
return true;
}
return false;
}
bool operator==(const Date& d) {
if (_year == d._year && _month == d._month && _day == d._day) {
return true;
}
return false;
}
Date& operator-=(int day) {
if (day < 0) {
return *this += (-day);
}
_day -= day;
while (_day < 0) {
_month--;
if (_month == 0) {
_month = 12;
_year--;
}
_day += getMonthDay(_year, _month);
}
return *this;
}
bool operator != (const Date& d) {
if (*this == d)
return false;
return true;
}
Date& operator+=(int day) {
// a+=b,a本身变化了,因此最后返回a
if (day < 0) {
return *this -= day;
}
_day += day;
while (_day > getMonthDay(_year, _month)) { //天数已经超过当前月份
_day -= getMonthDay(_year, _month);
_month++;
if (_month > 12) {
_year++;
_month = 1;
}
}
return *this;
}
Date operator++(int) {
Date temp(*this);
*this += 1;
return temp;
}
void getDaynums(const Date& d) {
Date max = d;
Date min = *this;
if (!(max > min)) {
max = *this;
min = d;
}
int day = 0;
while (min != max) {
min++;
day++;
}
day++;
cout << day << endl;
}
};
int main() {
int day1, day2, mon1, mon2, year1, year2;
scanf("%4d%2d%2d", &year1, &mon1, &day1);
scanf("%4d%2d%2d", &year2, &mon2, &day2);
Date d(year1, mon1, day1);
Date d2(year2, mon2, day2);
d.getDaynums(d2);
}
// 64 位输出请用 printf("%lld")