2017-05-16 179 views
-3

所以我有一个程序,我正在检查如果年份是闰年,然后取决于如果它是一个飞跃或不,我会给(1-366) ..我得到了下面的代码我工作到目前为止,当我输入一个非闰年,我得到一个正常的答案,但是当我输入一个闰年,我得到displayDate(日)运行两次,打印两次,复制粘贴我的代码,并尝试为自己,​​告诉我什么是错的,请..还有我是新的C所以慢慢来,如果它是很简单的东西,请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); 
} 
+2

尝试逐行调试程序中的代码。该计划足够小,这是可行的。一旦你这样做,你会发现问题在哪里。 –

+0

一个很好的习惯(因为你是初学者)会增加一个'default'语句。 – TheDarkKnight

+2

可以在'main()'后面实现'isLeap()'和'displayDate()'。为了更好的代码,你应该在'main()'之前插入前两个的原型。 (原型是“函数声明”,即函数的头部用';;而不是主体)。我在开始时也缺少'#include '。 – Scheff

回答

4

你不必break语句的

switch (LeapOrNot) 
{ 
    case 1 : 

因此,将继续执行的情况下0:代码以及和呼叫displayDate两次

+0

哇..令人难以置信..一直试图找到它是什么地方是错的,你只是觉得它是这样的,谢谢很多人欣赏它! –

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可能是一个任务,并执行这个来没有任何...

注:

  1. 代替使用switch语句的偏移量(取决于month)存储在阵列。

  2. (month >= 3) * isLeap(year)是典型的C编程。
    (month >= 3)如果为真,则返回1,否则返回0。
    isLeap()也产生1或0。
    将这两个值相乘再次产生1或0.
    因此,可以简单地添加结果。
    C程序员对效率非常敏感。因此,该乘法被认为是if的更快选择。

  3. 我将返回类型displayDate()int更改为void,因为该函数没有返回任何值。我有点惊讶,因为C编译器在我之前没有对此提出警告。 (可能是,我不得不提高编译器的警告级别以获得一个。)

  4. main()函数中,return 0;可能被省略。 (这是C标准中奇怪的例外之一)。然而,它通常被认为是“更好的风格”来明确表示它。

+0

@AliSoujod我添加了一些注释来更详细地解释我做了什么以及为什么。 – Scheff