输入一个日期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("input year:");
scanf("%d", &startDate.year);
printf("input month:");
scanf("%d", &startDate.month);
printf("input day:");
scanf("%d", &startDate.day);
// 输入要添加的天数
printf("input added days:");
scanf("%d", &days);
// 计算结束日期
endDate = calculateEndDate(startDate, days);
// 输出结果
printf("start date:%d year %d month %d day", startDate.year, startDate.month, startDate.day);
printf("end date:%d year %d month %d day", endDate.year, endDate.month, endDate.day);
return 0;
}