2017-05-16 180 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