课上布置了一个很难的实验:
1、设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,如某日期加上天数、某日期减去天数、两日期相差的天数等。
2、设计如下的私有成员函数:
(1) leap(int):判断指定的年份是否为闰年。
(2) dton(Date &):将指定日期转换成从公元元年1月1日起的天数(假设公元元年1月1日为整数0)。
(3) ntod(int):将指定的公元元年1月1日起的天数转换成对应的日期。
3、在Date类中设计如下重载运算符函数:
(1) Date operator+(int days):返回某日期加上天数得到的日期
(2) Date operator-(int days):返回某日期减去天数得到的日期
(3) int operator-(Date&b):返回两日期相差的天数
4、利用定义好的Date类,完成下面的任务:
(1) 输入两个日期、计算它们之间差的天数,并输出。
(2) 输入一个日期和天数n(正整数),计算该日期后推n天和前推n天的新日期,并输出。
我只会在源程序中手动修改日期,并且数字过大就会出错,怎么才能实现以上功能?如有源码可否在每个函数加简短注释?这对我很重要,感谢
```c++
#include<iostream>
using namespace std;
class Date {
private:
int year, month, day;
public:
Date(int y = 0, int m = 0, int d = 0) {
year = y;
month = m;
day = d;
}
void Print();
Date operator-(const Date &c);
Date operator+(const Date &c);
Date operator++();
Date operator--();
};
void Date::Print() {
cout << "DATE£º"<<year<<"/"<<month<<"/"<<day<< endl;
}
Date Date::operator-(const Date &c) {
int temp = 0,day_y=0;
if (c.year - year >= 1) {
for (int n = year; n < c.year; n++) {
if ((n % 4 == 0 && n % 100 != 0) || n % 400 == 0) { day_y = day_y + 366; }
else { day_y = day_y + 365; }
}
}
for (int i = 1; i < month; i++) {
switch (i) {
case 1: temp += 31; break;
case 2: if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { temp += 29; break; }
else { temp += 28; break; }
case 3: temp += 31; break;
case 4: temp += 30; break;
case 5: temp += 31; break;
case 6: temp += 30; break;
case 7: temp += 31; break;
case 8: temp += 31; break;
case 9: temp += 30; break;
case 10:temp += 31; break;
case 11:temp += 30; break;
case 12:temp += 31; break;
}
}
int sum1 = temp;
temp = 0;
for (int i = 1; i < c.month; i++) {
switch (i) {
case 1: temp += 31; break;
case 2: if ((c.year % 4 == 0 && c.year % 100 != 0) || c.year % 400 == 0) { temp += 29; break; }
else { temp += 28; break; }
case 3: temp += 31; break;
case 4: temp += 30; break;
case 5: temp += 31; break;
case 6: temp += 30; break;
case 7: temp += 31; break;
case 8: temp += 31; break;
case 9: temp += 30; break;
case 10:temp += 31; break;
case 11:temp += 30; break;
case 12:temp += 31; break;
}
}
int sum2 = temp;
day_y = day_y - sum1 + sum2+c.day-day;
cout << "Ïà¸ôÌìÊý"<<day_y<< endl;
return (0, 0, 0);
};
Date Date::operator+(const Date &c) {
int sumday = 0,temp=0,j=0,k=0;
for (int i = 1; i < month; i++) {
switch (i) {
case 1: temp += 31; break;
case 2: if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { temp += 29; break; }
else { temp += 28; break; }
case 3: temp += 31; break;
case 4: temp += 30; break;
case 5: temp += 31; break;
case 6: temp += 30; break;
case 7: temp += 31; break;
case 8: temp += 31; break;
case 9: temp += 30; break;
case 10:temp += 31; break;
case 11:temp += 30; break;
case 12:temp += 31; break;
}
}
sumday = temp + c.day+day;
for( k= year; sumday > 365; k++) {
if ((k % 4 == 0 && k % 100 != 0) || k % 400 == 0) { sumday = sumday - 366; }
else(sumday = sumday - 365);
}
year = k;
for (j = 1; sumday >28; j++) {
switch (j) {
case 1: temp = 31; break;
case 2: if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { temp = 29; break; }
else { temp = 28; break; }
case 3: temp = 31; break;
case 4: temp = 30; break;
case 5: temp = 31; break;
case 6: temp = 30; break;
case 7: temp = 31; break;
case 8: temp = 31; break;
case 9: temp = 30; break;
case 10:temp = 31; break;
case 11:temp = 30; break;
case 12:temp = 31; break;
}
sumday = sumday - temp;
}
return Date(year,j,sumday);
};
Date Date::operator++() {
int temp = 0,i=month;
switch (i) {
case 1: temp += 31; break;
case 2: if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { temp += 29; break; }
else { temp += 28; break; }
case 3: temp += 31; break;
case 4: temp += 30; break;
case 5: temp += 31; break;
case 6: temp += 30; break;
case 7: temp += 31; break;
case 8: temp += 31; break;
case 9: temp += 30; break;
case 10:temp += 31; break;
case 11:temp += 30; break;
case 12:temp += 31; break;
}
if (temp == day&&month!=12) {
month++;
day = 1;
}
else if (temp == day && month == 12) {
year++;
month = 1;
day = 1;
}
else {
day++;
}
return *this;
}
Date Date::operator--() {
int temp = 0, i = month-1;
switch (i) {
case 0:break;
case 1: temp += 31; break;
case 2: if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { temp += 29; break; }
else { temp += 28; break; }
case 3: temp += 31; break;
case 4: temp += 30; break;
case 5: temp += 31; break;
case 6: temp += 30; break;
case 7: temp += 31; break;
case 8: temp += 31; break;
case 9: temp += 30; break;
case 10:temp += 31; break;
case 11:temp += 30; break;
}
if (day==1&& month != 1) {
month--;
day = temp;
}
else if (day ==1&& month == 1) {
year--;
month = 12;
day = 31;
}
else {
day--;
}
return *this;
}
int main() {
Date d1(2004, 12,31), d2(2018, 10, 15);
d1.Print();
d2.Print();
d1-d2;
cout << endl;
Date d3(2004, 1, 1), d4(0, 0,1928),d5;
d5 = d3 + d4;
d5.Print();
cout<<endl<<"ÈÕÆÚ×ÔÔö¡ý"<<endl;
d1.Print();
++d1 ;
d1.Print();
cout << endl << "ÈÕÆÚ×Ô¼õ" << endl;
d1.Print();
--d1;
d1.Print();
system("pause");
return 0;
}
```