题目:定义一个结构体变量,包括年、月、日。计算该日在本年中是第几天?
要求及提示:
(1)写一个函数days,实现上面的计算。由主函数将年、月、日传递给days函数,计算后将日子数传回主函数输出。
(2)注意闰年问题。
思路:
- 用户输入年、月、日。
- 使用一个循环累加到输入月份之前的每个月的天数。
- 加上输入的日数,得到该日期在本年中的天数。
- 如果是闰年,对天数进行修正。
- 输出用户输入的年月日以及计算得到的天数。
分析:
-
定义结构体:
struct data
定义了一个结构体,包括了年 (year
)、月 (mon
)、日 (day
)。
-
全局变量:
d1
是结构体类型的全局变量,用于存储用户输入的年月日。
-
主函数 (
main
):- 用户通过输入获取年、月、日的值。
- 使用一个数组
day_tab
存储每个月的天数,其中第一个元素为0(无效)。 - 通过一个循环累加到输入月份之前的每个月的天数,加上输入的日数,得到
days
变量。
-
闰年判断:
- 通过判断年份是否为闰年,对
days
进行修正。闰年的判断逻辑是:能被4整除但不能被100整除,或者能被400整除。
- 通过判断年份是否为闰年,对
-
输出结果:
- 输出用户输入的年月日以及计算得到的天数。
代码:
struct data
{
int year;
int mon;
int day;
}d1;
int main()
{
int i, days = 0;
int day_tab[13] = { 0,31,28,31,30,31,30,31,30,31,30,31,30 };
printf("input year,month,day:");
scanf("%d %d %d", &d1.year, &d1.mon, &d1.day);
for (i = 1; i < d1.mon; i++)
days = days + day_tab[i];
days = days + d1.day;
if (d1.year % 4 == 0 && d1.year % 100 != 0 || d1.year % 400 == 0)
days = days + 1;
printf("%d %d %d days=%d", d1.year, d1.mon, d1.day, days);
}
- 代码中并未对用户输入的月份和日期的合法性进行检查,因此用户输入无效的日期可能导致不准确的计算。
- 月份和日期的合法性检查可通过判断用户输入的值是否在合理范围内来实现。