题目描述
定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。
输入格式
年月日
输出格式
当年第几天
样例输入
2000 12 31
样例输出
366
判断闰年的规则
- 如果年份能够被4整除,但不能被100整除,则是闰年。
- 如果年份能够被400整除,则是闰年。
题目解析
-
首先,定义了一个
date
结构体,用于存储日期信息,包括年(year)、月(month)和日(day)。struct date { int year; int month; int day; };
-
接下来,定义了一个名为
count
的函数,该函数接收一个date
类型的参数arr
。这个函数的目的是计算并返回从公元元年1月1日到给定日期arr
之间的天数总和。int count(struct date arr)
-
在
count
函数内部,首先定义了一个整数变量sum
,用于累加天数,初始值为0。然后定义了一个整数数组month_day
,用于存储每个月的天数。数组的大小为13,因为一年有12个月加上一个用于错误月份判断的额外空间。int sum = 0; int month_day[13] = {0};
-
接下来,使用了一个条件判断来检查给定的年份
arr.year
是否为闰年。根据闰年的定义,如果年份能被400整除,或者能被4整除但不能被100整除,则该年是闰年。if ((arr.year % 400 == 0) || (arr.year % 4 == 0 && arr.year % 100 != 0))
-
如果是闰年,那么从1月到给定月份之前的所有月份的天数将被计算出来。使用一个for循环,从1开始遍历到给定的月份
arr.month
。- 如果当前月份是1月、3月、5月、7月、8月、10月或12月,则这些月份都有31天,所以
month_day
数组对应的位置被设置为31。 - 如果当前月份是2月,因为是闰年,所以2月有29天,
month_day
数组对应的位置被设置为29。 - 对于其他月份,即4月、6月、9月和11月,它们都有30天,所以
month_day
数组对应的位置被设置为30。 - 每设置好一个月的天数后,就将其加到
sum
变量上。if (arr.month > 1) { for (int i = 1; i < arr.month; i++) { if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12) month_day[i] = 31; else if (i == 2) month_day[i] = 29; else month_day[i] = 30; sum += month_day[i]; } } sum += arr.day;
- 如果当前月份是1月、3月、5月、7月、8月、10月或12月,则这些月份都有31天,所以
-
如果不是闰年,那么计算方法类似,只是在2月时只有28天。
else if (i == 2) month_day[i] = 28;
-
在计算完所有月份的天数后,还需要加上给定日期的天数
arr.day
。sum += arr.day;
-
最后,
count
函数返回累加的天数sum
。return sum;
-
在
main
函数中,首先定义了一个date
类型的变量now
,用于存储用户输入的当前日期。struct date now;
-
使用
scanf
函数读取用户输入的年、月、日,并存储在now
变量中。scanf("%d%d%d", &now.year,&now.month,&now.day);
-
调用
count
函数,并将now
作为参数传递,计算出结果。count(now)
-
使用
printf
函数输出计算结果。printf("%d\n", count(now));
源代码
#include <stdio.h>
struct date
{
int year;
int month;
int day;
};
int count(struct date arr)
{
int sum = 0;
int month_day[13] = {0};
if ((arr.year % 400 == 0) || (arr.year % 4 == 0 && arr.year % 100 != 0))
{
if (arr.month > 1)
{
for (int i = 1; i < arr.month; i++)
{
if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)
month_day[i] = 31;
else if (i == 2)
month_day[i] = 29;
else
month_day[i] = 30;
sum += month_day[i];
}
}
sum += arr.day;
}
else
{
if (arr.month > 1)
{
for (int i = 1; i < arr.month; i++)
{
if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)
month_day[i] = 31;
else if (i == 2)
month_day[i] = 28;
else
month_day[i] = 30;
sum += month_day[i];
}
}
sum += arr.day;
}
return sum;
}
int main(void)
{
struct date now;
scanf("%d%d%d", &now.year,&now.month,&now.day);
printf("%d\n", count(now));
return 0;
}