2017-05-16 5 views
-3

私は今年の閏年かどうかを調べる作業をしています。閏年であるかどうかによって、(1-366)私はうるう年を入力するとdisplayDate(日)が2回実行され、2回印刷されますが、コピー、それは非常に単純なものであればそうCプログラムの印刷を2回実行する

それが簡単にしてください取る
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

また、私はCに新しいです。..してくださいそれと間違っているものを私に教えてくれ、私のコードを貼り付け、自分自身でそれを試してみてくださいあなたのためにbreak文を持っていけません

switch (LeapOrNot) 
{ 
    case 1 : 

だから、ケース0の実行になります。同様のコードを、あなたの教師を感動したい場合は、代替(leapOrNot.c)として彼にこのわずかに短いバリアントを提示する可能性が二回

+0

うわー..信じられないほど..それで何が間違っているかを見つけようとしていて、あなたはちょうどそのように見つけました、多くの人がそれを感謝します! –

0

displayDateを呼び出す:

#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. 関数が値を返さないので、私はvoidintからdisplayDate()の戻り値の型を変更しました。私は少し前に、Cコンパイラがこれについて警告しなかったことに驚いています。 (私はコンパイラが警告レベルを上げるためにレベルを上げなければならなかったかもしれません)

  4. main()の機能では、return 0;が省略されている可能性があります。 (これはCの標準では奇妙な例外の1つです)。しかし、通常は明示的に「より良いスタイル」と見なされます。

+0

@AliSoujod私は何をしたのか、理由を説明するためにいくつかのノートを追加しました。 – Scheff

関連する問題