所以我有一个程序,我正在检查这一年是否是闰年,然后取决于它是否是一个飞跃我将从(1-366)给出年份的日期数...我得到了这个代码我已经工作到目前为止,当我输入一个非闰年我得到一个正常的答案,但当我输入闰年我得到displayDate(天)运行两次并打印两次,复制粘贴我的代码请亲自尝试一下,请告诉我它有什么问题。我也是C的新手,所以如果它很简单请放轻松
int main ()
{
int day ,month , year, LeapOrNot, date ;
printf("PLease enter a date in the following format Month/day/year: ");
scanf("%d/%d/%d" , &month , &day , &year );
LeapOrNot = isLeap(year);
switch (LeapOrNot)
{
case 1 :
switch (month)
{
case 1:
date = day;
break;
case 2:
date = 31 + day;
break;
case 3 :
date = 60 + day;
break;
case 4 :
date = 91 + day;
break;
case 5 :
date = 121 + day;
break;
case 6:
date = 152 + day;
break;
case 7:
date = 182 + day;
break;
case 8 :
date = 213 + day;
break;
case 9 :
date = 244 + day;
break;
case 10:
date = 274 + day;
break;
case 11 :
date = 305 + day;
break;
case 12 :
date = 335 + day;
break;
}
displayDate(date);
case 0 :
switch (month)
{
case 1:
date = day;
break;
case 2:
date = 31 + day;
break;
case 3 :
date = 59 + day;
break;
case 4 :
date = 90 + day;
break;
case 5 :
date = 120 + day;
break;
case 6:
date = 151 + day;
break;
case 7:
date = 181 + day;
break;
case 8 :
date = 212 + day;
break;
case 9 :
date = 243 + day;
break;
case 10:
date = 273 + day;
break;
case 11 :
date = 304 + day;
break;
case 12 :
date = 334 + day;
break;
}
displayDate(date);
}
}
int isLeap(int year)
{
int LeapOrNot;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 ==0)
LeapOrNot = 1 ;
else
LeapOrNot = 0 ;
return LeapOrNot;
}
int displayDate(int date )
{
printf("the day for that year is %d", date);
}
答案 0 :(得分:4)
你没有
的中断声明switch (LeapOrNot)
{
case 1 :
因此它将继续执行案例0:代码并且两次调用displayDate
答案 1 :(得分:0)
如果你想给你的老师留下深刻的印象,你可以把这个略短的变种作为替代(leapOrNot.c
)给他:
#include <stdio.h>
int isLeap(int year);
void displayDate(int date);
int main()
{
int day, month, year, leapOrNot, date;
int dates[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
printf("PLease enter a date in the following format Month/day/year: ");
scanf("%d/%d/%d", &month, &day, &year);
date = dates[month - 1] + day + (month >= 3) * isLeap(year);
displayDate(date);
return 0;
}
int isLeap(int year)
{
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}
void displayDate(int date)
{
printf("The day for that year is %d.\n", date);
}
测试:
$ gcc -std=c11 -o leapOrNot leapOrNot.c
$ ./leapOrNot
PLease enter a date in the following format Month/day/year: 3/1/2016
The day for that year is 61.
$ ./leapOrNot
PLease enter a date in the following format Month/day/year: 3/1/2017
The day for that year is 60.
$ ./leapOrNot
PLease enter a date in the following format Month/day/year: 12/31/2016
The day for that year is 366.
$ ./leapOrNot
PLease enter a date in the following format Month/day/year: 12/31/2017
The day for that year is 365.
$
尽管如此,使用switch
可能是一项任务,而且这项实施没有任何......
注意:
而不是使用switch
语句,偏移量(取决于month
)存储在数组中。
(month >= 3) * isLeap(year)
是典型的C编程
(month >= 3)
如果为真,则产生1,否则为0
isLeap()
也会产生1或0
将两个值相乘再次产生1或0
因此,可以简单地添加结果
C程序员对效率非常敏感。因此,乘法被认为是if
的更快替代。
我将displayDate()
的返回类型从int
更改为void
,因为该函数未返回任何值。我有点惊讶的是,在我做之前,C编译器没有对此发出警告。 (可能是,我必须提高编译器警告级别才能得到一个。)
在main()
函数中,return 0;
可能会被遗漏。 (这是C标准中的一个奇怪的例外。)但是,它通常被认为是“更好的风格”来明确表示它。