公历年份是4的倍数的,一般都是闰年(leap year)。但公历年份是整百数的,必须是400的倍数才是闰年。要判断某一年是不是闰年,一般方法是用4或400去除这一年的年份数,如果除得的商是整数而没有余数,那么这一年是闰年;如果有余数,那么这一年是平年。
程序分析:
先根据输入的月份确定从年初到当前月份之前的总天数,再加上当前月份的天数即可。之后判断年份是否为闰年,若是闰年且输入月份大于3时,需多加一天。
以2022年3月24日为例,输入月份大于3,则先确定3月之前的总天数,然后再加上24天,即位本年的第几天。
代码实现:
使用Switch()函数确定当前月份之前的总天数。
使用if判断是不是闰年,区分年份为整百数时(year % 400 == 0 )或非整百数时(year % 4 == 0 && year % 100 != 0),如下所示:
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
源代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int day, month, year, sum=0, leap; //定义日、月、年、总天数、闰年参数
printf("请输入年、月、日,格式为:年 月 日\n");
scanf("%d %d %d", &year, &month, &day); //输入年,,月,日
switch (month) // 根据月份确定之前月份的总天数
{
case 1:sum = 0; break;
case 2:sum = 31; break;
case 3:sum = 59; break;
case 4:sum = 90; break;
case 5:sum = 120; break;
case 6:sum = 151; break;
case 7:sum = 181; break;
case 8:sum = 212; break;
case 9:sum = 243; break;
case 10:sum = 273; break;
case 11:sum = 304; break;
case 12:sum = 334; break;
default:printf("data error"); break;
}
sum += day; // 加上当前月份的天数
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) // 判断是否为闰年
leap = 1;
else
leap = 0;
if (leap == 1 && month > 2) //若是闰年且月份大于2,总天数应该加一天
sum++;
printf("这一天是这一年的第 %d 天。\n", sum);
return 0;
}
运行结果:
输入年份为平年时:
请输入年、月、日,格式为:年 月 日
2022 3 24
这一天是这一年的第 83 天。
1月份31天,2月份28天,本月24天,共83天。
输入年份为闰年时:
请输入年、月、日,格式为:年 月 日
2020 3 24
这一天是这一年的第 84 天。
1月份31天,2月份29天,本月24天,共84天,符合题目要求 。