カレンダーを眺めていて、どうして毎月の日数が異なるのだろうと不思議に思ったことはありませんか。しかも、年によって、2月の日数は異なるのです。暦の計算は、とても面白いものです。今回は、うるう年を計算するプログラムを作ってみましょう。

どうして、うるう年があるの?

毎年2月の日数は異なります。2月が29日まである年を『うるう年』と呼び、それ以外の年を『平年』と呼びます。

しかし、どうして、うるう年があるのでしょうか。それは、一年を365日と固定とすると、4.129年に1日の割合で、暦と季節がずれてしまうのです。そこで、私たちが利用している、グレゴリオ歴では、400年間に97回のうるう年を設けることになったのです。

それで、うるう年は、以下の規則で決定されます。

・基本的に、西暦年が、4で割り切れる年は、うるう年。
・しかし、西暦年が、100で割り切れる年は、平年。
・しかし、西暦年が、400で割り切れる年は、うるう年。

なかなか、複雑な規則です。とは言え、この規則のおかげで、一年が過ぎる毎に、季節が少しずつずれていくことを防いでいるのです。もし、うるう年の仕組みがないと、長年経つうちに、カレンダーと季節がちぐはぐになり、猛暑の1月や、極寒の8月なんていうことになってしまいます。

手書きプログラミングを楽しんでみよう

なでしこ3では、Webブラウザさえあれば、プログラムを作ることができます。スマートフォンやタブレットでも、プログラムが作れます。とは言え、プログラムを作る際に、手書きの設計図を書いてみるのも、楽しいものです。

まず、先ほど紹介した条件を、プログラムに落とし込んでいきたいのですが、「基本的に」とか「しかし」という部分は、そのままプログラムに落とすことはできません。そこで、うるう年の仕組みを、図で表してみましょう。

  • うるう年の条件を図にしてみたところ

    うるう年の条件を図にしてみたところ

次に、この図を元にして、プログラムを手書きで書いてみましょう。とは言え、最初から全ての条件をプログラムするのは難しそうです。そこで、まず、最初4で割れるかどうかだけを考慮したプログラムを方眼紙上に書いてみました。

  • 4で割れるかどうかだけ考慮したプログラム

    4で割れるかどうかだけ考慮したプログラム

プログラムを手書きして良いことは、プログラムに色をつけて強調したり、まとまりごとに線を引いたり図を加えることが出来る点です。なお、割り切れるかどうかを調べるには、なでしこの『AをBで割った余り』命令を使います。結果が0であれば、割り切れるという意味です。

さて、条件を単純にしたプログラムを作ることができたので、これに先ほどの図にある全ての条件を加えたプログラムを描いてみましょう。

  • 図をプログラムにしてみたところ

    図をプログラムにしてみたところ

条件が複雑なので、ちょっと長いですが、うるう年の計算をプログラムに落としこむことができました。

それでは、上記のプログラムを、実際になでしこ3簡易エディタに書き込んで実行してみましょう。このプログラムを書き起こすと以下のようになります。

西暦年は2019。
結果は「平年」
もし、(西暦年を4で割った余り)が0ならば
    結果は「うるう年」
    もし、(西暦年を100で割った余り)が0ならば
       結果は「平年」
       もし、(西暦年を400で割った余り)が0ならば
           結果は「うるう年」
       ここまで。
    ここまで。
ここまで。
結果を表示。

実行すると、西暦2019年は「平年」であることが分かります。

  • なでしこ3エディタで実行してみたところ

    なでしこ3エディタで実行してみたところ

次に、プログラムの一行目にある、2019を2020に変更して実行してみてください。すると「うるう年」と表示されます。また、西暦2000年は特別な年で、4で割れるが、100でも、400でも割れるため「うるう年」なのですが、正しくうるう年と表示されるか、書き換えて試してみましょう。

うるう年かどうかの一覧表を作ろう

なお、せっかく、うるう年の判定プログラムを作ったので、西暦2000年から2100年まで、うるう年かどうかの一覧表を出力するプログラムを作ってみましょう。

先ほどのプログラムを「うるう年判定」という関数にまとめれば、以下のような単純なプログラムで、一覧表を出力できます。

  • 2000年から2100年までの一覧表を出力する手書きプログラム

    2000年から2100年までの一覧表を出力する手書きプログラム

テキストに書き起こすと、以下のようになります。

西暦年を2000から2100まで繰り返す
  西暦年をうるう年判定。
ここまで
# --- 関数を定義 ---
●(西暦年を)うるう年判定とは
  結果は「平年」
  もし、(西暦年を4で割った余り)が0ならば
    結果は「うるう年」
    もし、(西暦年を100で割った余り)が0ならば
      結果は「平年」
      もし、(西暦年を400で割った余り)が0ならば
        結果は「うるう年」
      ここまで。
    ここまで。
  ここまで。
  「{西暦年}年: {結果}」を表示。
ここまで。

これを、なでしこエディタで実行してみましょう。実行すると、以下のように表示されます。

  • なでしこエディタで実行したところ

    なでしこエディタで実行したところ

このように、処理を「関数」にまとめることで、複雑な処理も気軽に記述できるようになります。

まとめ

以上、今回は、うるう年の計算プログラムを、日本語プログラミングで作ってみました。複雑な条件の処理であっても、少し考えるとプログラムに落とし込むことが分かったのではないでしょうか。また、プログラムを作れば、100年分のうるう年計算も、あっという間に解くことができました。プログラミングができると便利です。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2005年IPAスーパークリエイター認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。