Thinkers'Studio
JavaとC言語の自習ツール
うるう年判定のプログラム例(C言語版)
 漠然と「うるう年は4年に一度」と思っていますが、誤差を調整するために特別なルールがあるようです。

うるう年判定のルール

 グレゴリオ暦では、現在以下の規則になっています。
  (1) 西暦の年が 4 で割り切れる年は原則として「うるう年
  (2) ただし、100で割り切れたら「平年」とする
  (3) しかし、400で割り切れるなら「うるう年」とする      (参考 : 国立天文台のページ

うるう年判定のプログラム例( C言語版 ) 】
#include <stdio.h>
#include <stdlib.h>
main()
{
    int     year;

    printf( "うるう年判定:西暦年は> " );
    if( scanf( "%d", &year ) != 1 ) exit( 1 );

    if( year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ) {
        printf( "%d年はうるう年です\n", year );
    } else {
        printf( "%d年は平年です\n", year );
    }
}
 上の規則に当てはめると、次のようになります。
  • 2011年は、平年 (4で割り切れません)
  • 2012年は、うるう年 (4で割り切れ、100では割り切れません)
  • 2000年は、うるう年 (4で割り切れ、100で割り切れますが、400で割り切れます)
  • 2100年は、平年 (4で割り切れ、100で割り切れ、400では割り切れません)

条件をつなぐ演算子と評価順

 なお、次の3つの条件はどこも ( ) で囲む必要はありません。
  if( year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ) 
 なぜだろう? と思った方は、勉強になるので考えてみるとよいと思います。
   (答えは、次回のC言語の Tips で ・・・)
前回のクイズの答え:  前置と後置の結果が異なるのは、(2) と (3) です。  (前回の問題を見る
(2) 前置は、n を 1増やしてから 60 を割り(60/6)、後置は割ってから n を増やしています(60/5)。
(3) (++n) や (n++) のようにカッコで囲んでも関係ありません。前置と後置の違いが出ます。
(1) は 1文で ++ しているので前置と後置の結果は同じです。繰り返し中に n を参照しても同じです。