关于日期的结构定义如下: struct DateG{ int yy,mm,dd;}; 编写两个函数,一个计算自公元1年1月1日到指定的日期共经历了多少天。另一个是前一个函数的逆函数:由自公元1年1月1日历经指定的天数后的日期(返回年月日构成的日期)。c语言
时间: 2024-02-28 18:57:45 浏览: 84
一个进行日期的程序,计算某年月日前后一定年数(或月数、天数)的年月日
5星 · 资源好评率100%
计算自公元1年1月1日到指定日期共经历了多少天的函数可以如下实现:
```c
int daysBetween(DateG d)
{
int days = 0;
int monthDays[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
for (int i = 1; i < d.mm; i++) {
days += monthDays[i];
if (i == 2 && isLeap(d.yy)) {
days++;
}
}
days += d.dd - 1;
for (int i = 1; i < d.yy; i++) {
days += isLeap(i) ? 366 : 365;
}
return days;
}
int isLeap(int year)
{
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
```
其中,`isLeap`函数用于判断一个年份是否为闰年,闰年的定义是能被4整除但不能被100整除,或者能被400整除。
前一个函数的逆函数:由自公元1年1月1日历经指定的天数后的日期(返回年月日构成的日期)的实现方法如下:
```c
DateG dateAfter(int days)
{
int monthDays[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
DateG d;
int y = 1, m = 1, dday = 1;
while (days > 0) {
int daysInYear = isLeap(y) ? 366 : 365;
if (days >= daysInYear) {
days -= daysInYear;
y++;
} else {
int daysInMonth = monthDays[m];
if (m == 2 && isLeap(y)) {
daysInMonth++;
}
if (days >= daysInMonth) {
days -= daysInMonth;
m++;
} else {
dday += days;
days = 0;
}
}
}
d.yy = y;
d.mm = m;
d.dd = dday;
return d;
}
```
其中,我们用一个循环来不断地减去每一年和每一个月的天数,直到剩余的天数不足一天为止。最后剩余的天数就是这个日期是这一年的第几天,也就是日期的“日”部分。
阅读全文