我这里的代码有什么问题? if 语句和 switch 案例的问题
What is the problem with my code here? problems with if statements and switch cases
对于这个问题:
编写一个 C 程序,确定作为输入数据提供的日期在一年中的天数(1 到 366)。例如,1994 年 1 月 1 日是第 1 天。1993 年 12 月 31 日是第 365 天。1996 年 12 月 31 日是第 366 天,因为 1996 年是闰年。如果年份能被 4 整除,则该年为闰年,但任何能被 100 整除的年份只有能被 400 整除时才是闰年。您的程序应该接受月、日和年作为整数。包含一个函数 leap returns 如果在闰年调用则为 1,否则为 0。
示例 运行 代码:
请输入日 [1=31]、月 [1-12] 和年 [例如2020] 作为整数:
12 2 2021
输出:
天数:43
我写了这段代码,但每当我 运行 它并输入日、月和年值时,它 returns 空白。
#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;
}
知道为什么吗?
您使用的是字符而不是数字:
case '1':
这是在寻找字符 '1'
的编码值,在 ASCII 中是 48。您想要:
case 1:
其他情况也类似。
另外,检查你的闰年逻辑是否可以被 100 整除但不能被 400 整除。
换句话说,您有 很多 幻数散布在整个代码中。实现这一点的更好方法是颠倒案例和用例失败的顺序,以增加每个前一个月的天数。在每种情况下,这只剩下每个月的天数,并将闰年检查留给二月。
对于这个问题:
编写一个 C 程序,确定作为输入数据提供的日期在一年中的天数(1 到 366)。例如,1994 年 1 月 1 日是第 1 天。1993 年 12 月 31 日是第 365 天。1996 年 12 月 31 日是第 366 天,因为 1996 年是闰年。如果年份能被 4 整除,则该年为闰年,但任何能被 100 整除的年份只有能被 400 整除时才是闰年。您的程序应该接受月、日和年作为整数。包含一个函数 leap returns 如果在闰年调用则为 1,否则为 0。
示例 运行 代码:
请输入日 [1=31]、月 [1-12] 和年 [例如2020] 作为整数:
12 2 2021
输出:
天数:43
我写了这段代码,但每当我 运行 它并输入日、月和年值时,它 returns 空白。
#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;
}
知道为什么吗?
您使用的是字符而不是数字:
case '1':
这是在寻找字符 '1'
的编码值,在 ASCII 中是 48。您想要:
case 1:
其他情况也类似。
另外,检查你的闰年逻辑是否可以被 100 整除但不能被 400 整除。
换句话说,您有 很多 幻数散布在整个代码中。实现这一点的更好方法是颠倒案例和用例失败的顺序,以增加每个前一个月的天数。在每种情况下,这只剩下每个月的天数,并将闰年检查留给二月。