1. 题目
输入某年某月某日,判断这一天是这一年的第几天?
2. 分析
步骤1
:得先判断年份是否是闰年,是的话,当月份大于3时,需多加一天;
步骤2
:还需根据输入月份,判断输入天数是否合理,如当是4月份时,输入31天就是不对的;
步骤3
:以3月15日为例,把前两个月的天数加起来,然后再加上15天即本年的第几天。
如:2024年12月12日
:则是当年的347
天,即
31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, +12
3. 实例代码
#include <stdio.h>
// 定义用于存储月份的数组
const int daysInMonth[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int main() {
int day, month, year, sum;
printf("\n请输入年、月、日,格式为:年,月,日(2024,12,23)\n");
if (scanf("%d,%d,%d", &year, &month, &day) != 3 || month < 1 || month > 12 || day < 1 || day > 31) {
printf("输入数据错误\n");
return 1;
}
// 当该月份正常天数小于输入天数时,提示
if (daysInMonth[month-1] < day)
{
printf("输入数据错误\n");
return 1;
}
// 计算输入月份之前的总天数
sum = 0;
for (int i = 0; i < month - 1; i++) {
sum += daysInMonth[i];
}
sum += day;
// 判断是否为闰年
int leap = (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
// 如果是闰年且月份大于2, 总天数加一天
if (leap && month > 2) {
sum++;
}
printf("这是这一年的第 %d 天。\n", sum);
return 0;
}
4. 实例代码2之使用switch穿透
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
// 定义用于存储月份的数组
const int daysInMonth[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int year,month,day,nLeapYear=0;
printf("\n请输入年、月、日,格式为:年,月,日(2024,12,23)\n");
scanf("%d,%d,%d",&year,&month,&day);
// 判断输入是否合法
if (month < 1 || month > 12 || day < 1 || day > 31) {
printf("输入数据错误\n");
return 1;
}
// 当该月份正常天数小于输入天数时,提示
if (daysInMonth[month-1] < day)
{
printf("输入数据错误\n");
return 1;
}
int nTotal=0;
if((year%4==0 && year%100!=0) || year%400==0)
nLeapYear=1;
switch(month-1)
{
case 11:nTotal=nTotal+daysInMonth[10];
case 10:nTotal=nTotal+daysInMonth[9];
case 9:nTotal=nTotal+daysInMonth[8];
case 8:nTotal=nTotal+daysInMonth[7];
case 7:nTotal=nTotal+daysInMonth[6];
case 6:nTotal=nTotal+daysInMonth[5];
case 5:nTotal=nTotal+daysInMonth[4];
case 4:nTotal=nTotal+daysInMonth[3];
case 3:nTotal=nTotal+daysInMonth[2];
case 2:nTotal=nTotal+(+daysInMonth[1];+nLeapYear);
case 1:nTotal=nTotal+daysInMonth[0];
}
nTotal=nTotal+day;
printf("year:%d\nmonth:%d\nday:%d\nnTotal:%d\n",year,month,day,nTotal);
}