プログラミング入門

プログラミング初心者のためのScratch(スクラッチ)入門-うるう年判定プログラム

プログラミング初心者の子供に何を教えたらいいの?とお悩みの保護者のためのScratch(スクラッチ)の入門講座。Scratchで猫の動かし方はわかったけど・・・次にどんなことをしたらいいの?という疑問にお答えするシリーズです。
今回はうるう年判定プログラムを考えてみたいと思います。
 

1. なぜうるう年判定プログラム?

突然ですが問題です。2018年はうるう年でしょうか?次のうるう年はいつでしょうか?
2月以外は意識しない「うるう年」。じつは、うるう年かどうかは計算でわかります。

うるう年の判定方法
うるう年であるかどうかは、以下の方法で判定できます。

1. 判定する年が 4 で割り切れる場合は手順 2. に進みます。割り切れない場合は手順 5. に進みます。
2. その年が 100 で割り切れる場合は手順 3. に進みます。割り切れない場合は手順 4. に進みます。
3. その年が 400 で割り切れる場合は手順 4. に進みます。割り切れない場合は手順 5. に進みます。
4. その年はうるう年です (この年は 366 日です)。
5. その年はうるう年ではありません (この年は 365 日です)。

出典:マイクロソフトサポートページ

 
実は、うるう年の判定は結構難しいのです。うるう年かどうかを判定するプログラムを考えると、かなりプログラミングの力が伸びると思います。

この判定方法をもっとわかりやすくするために図にしてみました。このようにプログラムの流れを図にしたものをフローチャートといいます。

この判定方法を使って、うるう年を判定するプログラムを作ってみましょう。
 

2. うるう年判定プログラムを作ってみよう

では、Scratchでうるう年判定プログラムを作ってみましょう。
 

2-1. 今年がうるう年かどうかを判定する

まずは今年がうるう年かどうか?を判定するプログラムです。うるう年かどうかは割り切れるかどうかなので、「●を▲で割った余り」ブロックを使いましょう。

「割り切れる」ということは「余りが0」ということなので、次のようなブロックを用いてプログラムを作っていきましょう。

まずは、4で割り切れるかどうか?割り切れなければうるう年ではないので、上のブロックの「でなければ」のところに「うるう年ではない」とスプライトが言うブロックを追加します。

次は100で割り切れるかどうか?を考えます。上の図の「もし」のところに、また「もし〜でなければ」ブロックを追加しましょう。

100で割り切れないときうるう年になるので、スプライトに「うるう年だ」と言わせるブロックを追加します。

同じような考え方で、400で割り切れるかどうか?の部分もプログラミングして完成したのがこちらです。

このプログラムを実行すると、記事執筆時点(2018年)は以下のような結果になりました。

 

2-2. いろいろな年のうるう年を調べられるようにする

先ほどは「今年がうるう年かどうか?」を判定するプログラムを作りました。ですが、これだけだとプログラムが全て正しいかどうかわかりませんね。さらに、いろいろな年のうるう年も調べられるようにしたいです。

そこで「聞いて待つ」と「答え」のブロックを使って、いろいろな年を入力できるように変えてみます。

では、このプログラムが正しいかどうかを確認してみましょう。

うるう年ではない例
この理由により、以下の年はうるう年ではありません。
1700、1800、1900、2100、2200、2300、2500、2600
これらは 100 で割り切れますが、400 では割り切れないためです。

出典:マイクロソフトサポートページ

 
「うるう年ではない例」に挙げられている1700を入力してみます。

きちんと判定できていますね。では、次はうるう年の例です。
 

うるう年の例
以下の年はうるう年です。
1600、2000、2400
これらは 100 でも 400 でも割り切れるためです。
出典:マイクロソフトサポートページ

 
上記の「うるう年の例」に挙げられている1600を入力してみます。

こちらもきちんと判定できていますね。最後に、単に4で割り切れるだけの年がうるう年かどうかも確認しておきましょう。

プログラムの判定は正確なようです。
 

3. 1行でうるう年を判定しよう

ここからは綺麗なプログラムを目指してみようと思います!
 

3-1. プログラムの重複をなくしたい

さて、先ほどのプログラムですが「●●年はうるう年だよ」「●●年はうるう年ではないよ」というブロックが2個づつあります。ちゃんと動作はしていますが・・・なんとなくすっきりしません。

同じ動作をするブロックが2個あると、セリフを変えたいときに二箇所変えないといけなくなります。そのため、プログラムはできるだけ同じ処理を書かない方が良いのです。

そこで、「●●年はうるう年だよ」「●●年はうるう年ではないよ」という部分の重複をなくすことを考えてみたいと思います。

重複をなくすために、うるう年かどうかの判定を1回だけで行えるようにします。

判定を考えるために、数の関係を図にしてみます。全ての年の中に「4で割り切れる年」その中に「100で割り切れる年」さらにその中に「400で割り切れる年」があるという関係があります。

 
この図でうるう年のところだけに色をつけてみます。うるう年となるのは、以下の赤色で塗った部分のところだけになります。
うーん・・・なんだかとっても複雑ですね。

わかりやすくするために、分けて考えてみましょう。
まずは、この部分です。これは「4で割り切れる年のうち、100で割り切れない年」ということになります。

つぎに「400で割り切れる」を条件に加える、これは「4で割り切れる年のうち、100で割り切れない年」または「400で割り切れる年」ということになります。

 

3-2. Scratchで作ろう

先ほど考えた、うるう年かどうか?の判定条件である
「4で割り切れる年のうち、100で割り切れない年」または「400で割り切れる年」
をScratchのブロックで表現してみましょう。

「4で割り切れる年のうち、100で割り切れない年」をScratchのブロックで表現すると

となります。

これを、『または「400で割り切れる年」』をさらに繋げていくと・・・

となります。この条件式こそが「うるう年かどうか」を1発で判定する式になります。
この式を使ったプログラムはこのようになります。

条件式は複雑になりましたが、「●●年はうるう年だよ」「●●年はうるう年ではないよ」という部をが1箇所だけにすることができました。
 

3. まとめ

今回は、うるう年を判定するプログラムを考えてみました。

複雑な条件ですが、基本的には一つ一つの条件を組み合わせていくだけです。小学校高学年のお子さんであれば、前半部分のプログラムが作れれば、かなりすごい!と言っていいのではないでしょうか。

後半部分の「うるう年かどうかを1回で判定する条件式」を考えるのはかなり難しいので、こういう考え方があるんだね、ぐらいで大丈夫です。プログラムを作れるかどうかということを重視するよりは、どうしてそういうプログラムにした方がいいのか?という理由を理解してもらえたら、と思っています。

伴野悠佳 / YUKA TOMONO
この記事の著者伴野悠佳 / YUKA TOMONO
教育ヲタクの1児の母。自称ニコニコキッズクリエーター。東京理科大学大学院卒。元SE。小学生の頃から教育書を読んでいた教育ヲタク。大学では、電池の素材の性質について実験とコンピューターシミュレーションを比較する研究を行っていたことがきっかけでSEになる。出産&育休後、子ども向けプログラミング教室講師、子どもたちの考える力を育てるオンライン塾の講師。