【プログラミング】4.1 閏年

プログラミング

これまでは、プログラムを作成する上での基本となる事項を見てきました。言ってみればいろいろなパーツを揃えている状態です。これらのパーツを組み合わせて、自分の意図した処理をするプログラムを作っていくことがプログラミングです。
と言ってもいきなり難しいことを始めるのは大変ですから、簡単な例題から扱っていきましょう。

例題

突然ですが、閏年ってありますよね?
そう、2月が29日まである年のことです。4年に1回やってくるというイメージが強いと思いますが、正確には次のようなもう少し細かい条件があります。

西暦の年が4で割り切れる年は閏年とする
ただし、年が100で割り切れる年は平年とする(閏年ではない)
ただし、年が400で割り切れる年は閏年とする

現在の私たちの暦は太陽の動きを基準としているため、整数で割りきれない端数分をこうして処理しているんですね。

なお、閏年であるかの判定は西暦の年で~と書きましたが、正確には日本では法律により皇紀(初代天皇が即位した年を基準とする年の考え方)の年によって判定することになっています。結果的には、西暦での計算方法と同じ結果となるようになっています。

設計

さて、これをプログラムで実装してみましょう。
といっても、いきなりプログラムを書くのではなく、まずは状況をを整理してプログラムの構成を考えてみましょう。これは設計と呼ばれる段階になります。

プログラムで行いたいことを、入力、内部処理、出力の3つに分けて考えてみましょう。

入力:

調べたい西暦の年が与えられる。

内部処理:

その年が閏年であるかを判定する。

出力:

閏年である、あるいは平年であることを画面に表示する。

入力は以前に取り扱った input() を使えばできそうですね。
そして内部処理ですが、先ほどの閏年の条件に従って条件分岐で実装できそうです。
出力もこれまでに使っていた print() でできますね。

それでは、ここまでの処理の流れを図にしてみましょう。ちなみにこれはフローチャートと呼ばれる書き方で、処理の流れにそって四角形や矢印などの記号と言葉で示していくものです。
フローチャートにすることで、処理の流れがわかりやすくなります。その一方で、こうしたフローチャートなどを作らずに設計・実装する手法もありますので、これは設計をする上での1つの方法としてとらえて頂ければと思います。

図 閏年を判定するフローチャート

実装

それでは、実際にプログラムを作っていきましょう。

まずはプログラムの先頭部分ですが、こちらは毎回お決まりの内容ですね。プログラム名などをコメントとして残しておきましょう。

#!python
#coding:utf-8

# 閏年を判定するプログラム

リスト1 プログラムの先頭部分

次は、判定対象となる年を利用者に入力してもらい、それを受け取って変数に格納する部分です。
入力は以前にやったように input() を使いましょう。ただし、input() は文字列型として受け取るので、そのままでは数値にならないものでしたね。そこで、int() を使って整数型に変換します。

# 入力された年を受け取り、文字列から整数に変換する
year = input("年を入力してください")
year = int(year)

リスト2 入力値の受け取り

さて、ここからが閏年判定の核心部分です。
まずは入力された年が400で割り切れるかの判定です。
割り切れるということは割り算の余りが0であるということ、つまり余りを求める%演算子とif文を使えばよいですね。年を400で割った余りが0であれば、閏年であると表示します。

if year % 400 == 0:
    print(year, "年は、閏年です")

リスト3 400で割り切れるかの判定

次に、年が400で割り切れなかった場合は、さらに100で割り切れるかの判定を行います。
ただし、if文をそのまま並べるだけではありません。
リスト4のようにした場合、1900年は正しく平年と判定できますが、2000年は閏年でもあり平年であると判定されてしまいます。

if year % 400 == 0:
    print(year, "年は、閏年です")
if year % 100 == 0:
    print(year, "年は、平年です")

リスト4 100で割り切れれば平年とする処理(?)

正しくは、400で割り切れるかのif文において偽となった場合、つまりelse節において100で割り切れるかの判定を行うべきですね。
else節にif文を連ねていく場合には、elif文を使うのが便利です。
これで期待した判定ができるようになります。

if year % 400 == 0:
    print(year, "年は、閏年です")
elif year % 100 == 0:
    print(year, "年は、平年です")

リスト5 100で割り切れれば平年とする処理

あとは同じように4で割り切れる場合を閏年とする処理です。
そして、これらのいずれにも当てはまらない場合には平年とします。

これらをすべて実装したものがリスト6です。

#!python
#coding:utf-8

# 閏年を判定するプログラム
# 入力された年を受け取り、文字列から整数に変換する

year = input("年を入力してください")
year = int(year)

if year % 400 == 0:
    print(year, "年は、閏年です")
elif year % 100 == 0:
    print(year, "年は、平年です")
elif year % 4 == 0:
    print(year, "年は、閏年です")
else:
    print(year, "年は、平年です")

リスト6 閏年を判定するプログラム

確認

それでは実装したプログラムを動かしてみましょう。
実行すると年を聞かれるので、数値で入力しましょう。

図1 実行したところ

試しに2022年を入力すると、平年と判定されます。

図2 判定結果が表示されたところ

全部のルートを通るように、以下の年で試してみましょう。
全て期待通りの結果になっていればよいでしょう。

2000年

閏年

1900年

平年

2020年

閏年

2021年

平年

なお、プログラムの内部構造を知った上で全ルートが実行できるようなテスト用入力データを準備する方法の他にも、プログラムの外部仕様からテスト用入力データを決める方法もあります。

 

まとめ

今回は、プログラムの内容そのものは簡単なものですが、解きたい問題から設計、実装を経て確認するまでの流れもたどってみました。少しでも参考になれば幸いです。

 

 

コメント

タイトルとURLをコピーしました