用C语言为编程练习10.4中设计的程序添加名为nextdate的函数,用来完成以下任务: ·接收两个参数,一个为包含当前日期的结构体 date,另一个为整数,表示要加到当前日期的天数。 ·把天数加到当前日期,并返回包含下一个正确日期的结构体。注意,下一天可能在下一月和下一年。 提示:可以直接使用10.5中的函数来完成10.7的任务。
时间: 2023-07-16 13:12:24 浏览: 172
下面是添加了nextdate函数的代码:
```c
#include <stdio.h>
struct date {
int year;
int month;
int day;
};
int isLeapYear(int year);
int getDayNum(struct date d);
struct date nextdate(struct date d, int days);
int main(void) {
struct date d = {2021, 5, 31};
int days = 10;
struct date next = nextdate(d, days);
printf("Next date: %d-%02d-%02d\n", next.year, next.month, next.day);
return 0;
}
int isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}
int getDayNum(struct date d) {
int daysPerMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (isLeapYear(d.year)) {
daysPerMonth[1] = 29;
}
int dayNum = d.day;
for (int i = 0; i < d.month - 1; i++) {
dayNum += daysPerMonth[i];
}
return dayNum;
}
struct date nextdate(struct date d, int days) {
int dayNum = getDayNum(d) + days;
int year = d.year;
int month = d.month;
int day = d.day;
while (dayNum > 365 + isLeapYear(year)) {
dayNum -= 365 + isLeapYear(year);
year++;
}
if (isLeapYear(year)) {
dayNum--;
}
while (dayNum > getDayNum((struct date){year, month, day})) {
dayNum -= getDayNum((struct date){year, month, day});
month++;
if (month > 12) {
month = 1;
year++;
}
}
day = dayNum;
return (struct date){year, month, day};
}
```
我们在原来的代码基础上添加了nextdate函数:
```c
struct date nextdate(struct date d, int days) {
int dayNum = getDayNum(d) + days;
int year = d.year;
int month = d.month;
int day = d.day;
while (dayNum > 365 + isLeapYear(year)) {
dayNum -= 365 + isLeapYear(year);
year++;
}
if (isLeapYear(year)) {
dayNum--;
}
while (dayNum > getDayNum((struct date){year, month, day})) {
dayNum -= getDayNum((struct date){year, month, day});
month++;
if (month > 12) {
month = 1;
year++;
}
}
day = dayNum;
return (struct date){year, month, day};
}
```
这个函数接收两个参数,一个为包含当前日期的结构体date,另一个为整数days,表示要加到当前日期的天数。函数首先调用getDayNum函数获取当前日期是这一年的第几天,然后加上days,得到新日期是这一年的第几天。接着,我们使用while循环,将新日期转换成正确的年月日格式。具体来说,我们先通过循环将年份加上可能跨越的年数,然后检查新年份是否为闰年,如果是,则将新日期减1。接着,我们再通过循环将月份和日数更新到正确的值。最后,我们返回包含下一个正确日期的结构体。
我们在main函数中调用nextdate函数,将当前日期设为2021年5月31日,要加的天数设为10。然后输出下一个日期。
阅读全文