m0_63989703 2022-03-16 19:21 采纳率: 87.5%
浏览 134
已结题

用c++类实现日期的基本运算

课上布置了一个很难的实验:
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;
}

```

  • 写回答

1条回答 默认 最新

  • hfhua 2022-03-16 20:03
    关注

    我这边有挺多个源码的,但都是很早之前写的,可能比较乱,但是当时都有注释,需要可以找我

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月23日
  • 已采纳回答 3月23日
  • 创建了问题 3月16日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改