计算日期

发布时间 2023-09-20 21:18:30作者: 菜鸟昂

输入一个日期startdate(年、月、日)和天数days(>=1),输出自该输入日期days天后的日期enddate(即edate=startdate+days)。要求输入和输出的年份为四位整数,输入时要对输入数据的有效性进行检查,并确保得到有效的输入数据。同时需耍考虑跨月、跨年和闰年等情况,闰年用自定义函数计算,日期用自定义结构体描述。

#include <stdio.h>

// 自定义日期结构体
struct Date {
    int year;
    int month;
    int day;
};

// 判断是否为闰年的函数
int isLeapYear(int year) {
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
        return 1; // 是闰年
    } else {
        return 0; // 不是闰年
    }
}

// 计算日期加上指定天数后的日期的函数
struct Date calculateEndDate(struct Date startDate, int days) {
    struct Date endDate = startDate;
    
    while (days > 0) {
        // 计算当月的最大天数
        int maxDaysInMonth;
        switch (endDate.month) {
            case 4:
            case 6:
            case 9:
            case 11:
                maxDaysInMonth = 30;
                break;
            case 2:
                if (isLeapYear(endDate.year)) {
                    maxDaysInMonth = 29;
                } else {
                    maxDaysInMonth = 28;
                }
                break;
            default:
                maxDaysInMonth = 31;
        }
        
        // 计算剩余天数
        int daysToAdd = (days < maxDaysInMonth - endDate.day + 1) ? days : (maxDaysInMonth - endDate.day + 1);
        
        // 更新日期
        endDate.day += daysToAdd;
        days -= daysToAdd;
        
        if (endDate.day > maxDaysInMonth) {
            endDate.day = 1;
            endDate.month++;
        }
        
        if (endDate.month > 12) {
            endDate.month = 1;
            endDate.year++;
        }
    }
    
    return endDate;
}

int main() {
    struct Date startDate, endDate;
    int days;
    
    // 输入年份、月份和日期
    printf("请输入年份:");
    scanf("%d", &startDate.year);
    printf("请输入月份:");
    scanf("%d", &startDate.month);
    printf("请输入日期:");
    scanf("%d", &startDate.day);
    
    // 输入要添加的天数
    printf("请输入要添加的天数:");
    scanf("%d", &days);
    
    // 计算结束日期
    endDate = calculateEndDate(startDate, days);
    
    // 输出结果
    printf("开始日期:%d年%d月%d日\n", startDate.year, startDate.month, startDate.day);
    printf("结束日期:%d年%d月%d日\n", endDate.year, endDate.month, endDate.day);
    
    return 0;
}