【问题标题】:What is the problem with my code here? problems with if statements and switch cases我的代码在这里有什么问题? if 语句和 switch case 的问题
【发布时间】:2021-03-23 20:48:50
【问题描述】:

对于这个问题:

编写一个 C 程序,确定作为输入数据提供的日期在一年中的天数(1 到 366)。例如,1994 年 1 月 1 日是第 1 天。1993 年 12 月 31 日是第 365 天。1996 年 12 月 31 日是第 366 天,因为 1996 年是闰年。如果一年可以被 4 整除,那么一年就是闰年,但任何能被 100 整除的年份只有在能被 400 整除时才是闰年。您的程序应该接受月、日和年作为整数。包含一个函数leap,如果用闰年调用则返回1,否则返回0。

运行代码示例:

请输入日期 [1=31]、月份 [1-12] 和年份 [e.g. 2020] 作为整数:

2021 年 12 月 2 日

输出:

天数:43

我编写了这段代码,但每当我运行它并输入日、月和年值时,它都会返回空白。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int leap_year(int year);
int main()
{
   int day,month,year;
   printf("Enter the date:(DD MM YYYY)\n");
   scanf("%d%d%d",&day,&month,&year);
   if ((day>31 || day<1) || (month<1 || month>12))
       printf("Error! Invalid day or month.\n");

   else
   {
        switch(month)
       {
       case '1':
           printf("Day Number: %d.\n",day);
           break;
       case '2':
           if ((leap_year(day)==1 && day>29)|| (leap_year(day)==0 && day>28))
               printf("Error! Invalid day.\n");
           else
           printf("Day Number: %d.\n",day+31);
           break;
       case '3':
           if (leap_year(year)==1)
           printf("Day Number: %d.\n",day+60);
           else if (leap_year(year)==0)
           printf("Day Number: %d.\n",day+59);
           break;
       case '4':
           if (day>30)
           printf("Error! Invalid day.\n");
           else if (leap_year(year)==1)
           printf("Day Number: %d.\n",day+91);
           else if (leap_year(year)==0)
           printf("Day Number: %d.\n",day+90);
           break;
       case '5':
           if (leap_year(year)==1)
           printf("Day Number: %d.\n",day+121);
           else if (leap_year(year)==0)
           printf("Day Number: %d.\n",day+120);
           break;
       case '6':
           if (day>30)
           printf("Error! Invalid day.\n");
           else if (leap_year(year)==1)
           printf("Day Number: %d.\n",day+152);
           else if (leap_year(year)==0)
           printf("Day Number: %d.\n",day+151);
           break;
       case '7':
           if (leap_year(year)==1)
           printf("Day Number: %d.\n",day+182);
           else if (leap_year(year)==0)
           printf("Day Number: %d.\n",day+181);
           break;
       case '8':
           if (leap_year(year)==1)
           printf("Day Number: %d.\n",day+213);
           else if (leap_year(year)==0)
           printf("Day Number: %d.\n",day+212);
       case '9':
           if (day>30)
           printf("Error! Invalid day.\n");
           else if (leap_year(year)==1)
           printf("Day Number: %d.\n",day+244);
           else if (leap_year(year)==0)
           printf("Day Number: %d.\n",day+243);
           break;
       case '10':
            if (leap_year(year)==1)
            printf("Day Number: %d.\n",day+274);
            else if (leap_year(year)==0)
            printf("Day Number: %d.\n",day+273);
            break;
       case '11':
            if (day>30)
            printf("Error! Invalid day.\n");
            else if (leap_year(year)==1)
            printf("Day Number: %d.\n",day+305);
            else if (leap_year(year)==0)
            printf("Day Number: %d.\n",day+304);
            break;
       case '12':
            if (leap_year(year)==1)
            printf("Day Number: %d.\n",day+335);
            else if (leap_year(year)==0)
            printf("Day Number: %d.\n",day+334);
            break;
       }

   }


}

int leap_year(int year)
{
   int leap_day;
   if
   (year%100==0 && year%400==0)
   {leap_day=1;
   return leap_day;}

   else if(year%4==0)
       {leap_day=1;
   return leap_day;}

   else
       leap_day=0;
   return leap_day;
}

知道为什么吗?

【问题讨论】:

  • “除了能被 100 整除的年份,只有能被 400 整除的年份才是闰年”,“能被 4 整除”不满足这个条件吗?听起来过于复杂。
  • @nico_c 不,这正是条件。 1800 和 1900 不是闰年,但 2000 是。
  • @dbush 很有趣。每天学习新东西!

标签: c console


【解决方案1】:

您在案例中使用字符而不是数字:

case '1':

这是寻找字符 '1' 的编码值,在 ASCII 中是 48。你想要:

case 1:

对于其他情况也是如此。

此外,请检查闰年的逻辑是否能被 100 整除但不能被 400 整除。

另一方面,您在整个代码中散布着很多的幻数。实现这一点的更好方法是颠倒用例和用例失败的顺序,以增加前一个月的天数。这样一来,您就可以得到每种情况下每个月的天数,而闰年检查只留到 2 月。

【讨论】:

  • 感谢您的帮助,它现在可以正常工作了。您能否详细说明失败以及如何以更好、更有效的方式编写此代码?我只是 C 编程的初学者,最近学习了 if 语句和 switch case。
  • @OJScofield A case 在下一个案例之前不必有 break。这将导致代码继续运行下一个case
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
相关资源
最近更新 更多