用C语言实现:输入某年某月某日,判断这一天是这一年的第几天

问题分析1:

        因为有十二个月份,如果用if语句太过于复杂,可以使用 switch语句。在switch里面,进行一个简单的加法就可以计算出是几天了;当然我们必须考虑是否是润年,这里只要记得瑞年的判断语句,就比较简单,因为它们只相差一天,所以使用if语句就可以进行输出了,代码如下: 

#include
// 输入某年某月某日,判断这一天是这一年的第几天
int main()
{
    int year,month,day,sum;
    printf("请输入您想查询的年月日(使用英文逗号隔开):\n");
    scanf("%d,%d,%d",&year,&month,&day);
    if(month>12||day>31||month<0||day<0||year<0)
    {
        printf("您输入的日期不合法");
        return 1;
    }
    
    switch(month)
    {
        case 1: sum=day;    break;
        case 2: sum=31+day;    break; //29
        case 3: sum=60+day; break;
        case 4: sum=91+day; break;
        case 5: sum=121+day;break;
        case 6: sum=152+day;break;
        case 7: sum=182+day;break;
        case 8: sum=213+day;break;
        case 9: sum=244+day;break;
        case 10:sum=274+day;break;
        case 11:sum=305+day;break;
        case 12:sum=335+day;break;
        default: printf("请输入正确的日期");break;
     } 
     if(month<3)
     {
         printf("%d年%d月%d日是这年的第%d天",year,month,day,sum);
     }
     else if((year%4==0&&year%100!=0)||year%400==0)  //是四的公倍数,但不是100的公倍数,或者是400的公倍数 
     {
         printf("%d年%d月%d日是这年的第%d天",year,month,day,sum);
      } 
      else
      printf("%d年%d月%d日是这年的第%d天",year,month,day,sum-1);
    return 0;
 } 

 问题分析2:

有朋友在评论区指出代码有bug,因此我改进一下。增加了对输入不合法的日期判断:

1、4、6、9、11月每个月仅仅有30天,此时如果输入31天要报错;

2、二月最多29天,如果2月输入30、31天时要报错;

3、不是润年的2月输入了29天也要报错。

改进代码2:

#include
// 输入某年某月某日,判断这一天是这一年的第几天
int main()
{
	int year,month,day,sum;
	printf("请输入您想查询的日期(年月日使用英文逗号隔开):\n");
	scanf("%d,%d,%d",&year,&month,&day);

	if(month>12||day>31||month<0||day<0||year<0)
	{
		printf("您输入的日期不合法");
		return 0;
	}
	else if((month==4||month==6||month==9||month==11)&&day==31)  // 4 6 9 11 月仅有 30天 
	{
		printf("您输入的日期不合法");
		return 0;
	}
	else if(month==2&&(day==30||day==31))    // 2月最多29天 
	{
		printf("您输入的日期不合法");
		return 0;
	}
	else if(!((year%4==0&&year%100!=0)||year%400==0)&&month==2&&day==29)  //如果不是闰年 输入了 2月29号,报错 
	{
		printf("您输入的日期不合法");
		return 0;
	}


	switch(month)
	{
		case 1: sum=day;	break;
		case 2: sum=31+day;	break; //29
		case 3: sum=60+day; break;
		case 4: sum=91+day; break;
		case 5: sum=121+day;break;
		case 6: sum=152+day;break;
		case 7: sum=182+day;break;
		case 8: sum=213+day;break;
		case 9: sum=244+day;break;
		case 10:sum=274+day;break;
		case 11:sum=305+day;break;
		case 12:sum=335+day;break;
		default: printf("请输入正确的日期");break;
	}
	if(month<3)
	{
		printf("%d年%d月%d日是这年的第%d天",year,month,day,sum);
	}
	else if((year%4==0&&year%100!=0)||year%400==0) //是四的公倍数,但不是100的公倍数,或者是400的公倍数?
	{
		printf("%d年%d月%d日是这年的第%d天",year,month,day,sum);
	}
	else
		printf("%d年%d月%d日是这年的第%d天",year,month,day,sum-1);
	return 0;
}

若有写得不好的地方,请各位多多指教!

你可能感兴趣的:(编程,c语言)