入試問題を題材にプログラミングを作ろう

プログラミング

2020年度 北海道公立高校入試 数学でカレンダーの周期性に関する問題が出されました。

この問題自体は、今年の問題の中では比較的難問でした。

しかし、もしもプログラミングを習っているような子であれば、超簡単なラッキー問題だった可能性があります。

さらに、この問題はプログラミングの題材としても優秀です。

カレンダー作成はプログラミングの練習題材の一つ

実はカレンダーをプログラミングを作成するのは、プログラミング学習者にとって非常に良い題材です。

当塾でも、小学校高学年から中学生のある程度プログラミングが出来るようになった生徒には、カレンダー作成の課題を出しています。

その理由は、以下3つ。

  • 身近にある周期的な題材だから
  • 作成したプログラムがあっているかすぐ確認出来るから
  • プログラム作成難易度が平易であるから

このようにカレンダー作成は、プログラミングの学習に最適な課題なのです。

今回の入試問題は、カレンダーを作成したことのあるプログラミング履修者にとっては、おそらく簡単でしょう。

ですが、さほどプログラミングに慣れていない方にとっては、課題としてはカレンダーを作成するほど難しくなく、ほどよく数学的要素も混じっているため、プログラミングの題材として非常に最適であると考えます。

入試問題をプログラミングで解く

問題文

プログラム作成

要点整理

今回の問題の要点をまとめると、以下の2つになります。

  • 2020年~2100年までの1月1日の曜日が知りたい
  • 7の倍数日後は同じ曜日になる(例:2020/1/1の7日後の 2020/1/8も水曜日、14日後の 2020/1/15も水曜日)
  • 2020年1/1の曜日は水曜日であること

では、いったいどういうプログラムを作るか考えてみましょう。

作成するプログラム

2020年~2100年の間で指定年の1月1日の曜日を答える問題です。

そこで2020~2100年の間で好きな年を入力したら、その年の1月1日の曜日を教えてくれるプログラムを作りましょう。

今回は、プログラミング初心者や小学生がよく使う、Scratchを使用して作成してみます。

またプログラム学習の中でも割と難易度は高い方なので、今回はカレンダーすべてを作るようなこともやりません。

今回の説明の中ではScratchの設定に関する部分の話は省略させていただきます。

完成イメージ

完成のイメージとしては、↓のように呼びかけに対して、年度を入力し、内部で計算を行い、計算結果をその年の1月1日の曜日を答えるというプログラムを作ってみたいと思います。

呼びかける

呼びかけるためには、「話して待つ」ブロックを使います。

猫のキャラクタに以下のようにプログラミングしてみてください。

これで、呼びかける部分のプログラムは完成です。

動作の確認をしてみましょう。

下のように、文字と入力ボックスが表示されると成功です。

入力する

上の入力ボックスに、数字を入力してみましょう。

入力してみると、何も変化しません。

入力した数字は、「答え」ブロックに格納されています。

では答えブロックの中身を確認してみましょう。

「言う」ブロックを繋げ、「答え」ブロックを入れると、答えの中身が分かります。

2020と入れると、下のように2020と猫が話します。

内部で計算を行う(計算方法を考える)

内部計算を行う前に、少し数学的な学習をしましょう。

入力した年が2020年から数えて、何日後か分かれば曜日は簡単に分かります。

説明します。

下の事実は納得いただけるでしょうか?

2020年1月1日(水)の7日後は、2020年1月8日(水)である

2020年1月1日(水)の14日後は、2020年1月15日(水)である

当たり前ですよね?1週間後、2週間後は必ず同じ曜日ですよね?

では下は?

2020年1月1日(水)の8日後は、2020年1月9日(木)である

2020年1月1日(水)の15日後は、2020年1月16日(木)である

注目して欲しいのは、○日後の部分です。

共通点として、どちらも7で割ると、1余る数となります。

つまり、○日後の曜日は、7で割った余りで必ず決まります。

以下のような対応になります。

  • 割って余り0は、水曜日
  • 割って余り1は、木曜日
  • 割って余り2は、金曜日
  • 割って余り3は、土曜日
  • 割って余り4は、日曜日
  • 割って余り5は、月曜日
  • 割って余り6は、火曜日

例えば、100日後だと、100÷7のあまりは2になるので金曜日です。

曜日は、このようにして求めます。


次に、入力した年の1月1日が2020年1月1日から数えて、何日後か計算で求める方法を考えます。

1年は、うるう年を除くと365日なので、経過年数×365で大体の日数が求められます。

計算としては、(入力した年-2020)×365となります。

実際には、うるう年の数だけ日付が増えます。

うるう年の回数は、4年に一度訪れるので、 (入力した年-2020) ÷4の答えを切り上げた数を足した値が2020年から何日後の値となります。

内部で計算を行う(プログラミングを行う)

まずは、2020年1月1日から○日後の計算を行うプログラミングを行います。

以下のように計算すると、2020年から入力した年までの年数が計算できます。

次にこの年数を、日数に換算していきます。

まずは、年数×365日の計算をしましょう。

下のようになります。

次に、うるう年を考えた式を入れます。

(入力した年-2020) ÷4を切り上げして、足します。

下のようになります。

最後に7で割った余りを出します。この余りが曜日になります。

ここまで出来ると、内部での計算は終わりになります。

計算結果を言う

今度は、内部での計算の結果を表示していきます。

計算の結果は、まだ数字の情報で、曜日になっていません。

曜日に変えて表示するために、「もし」ブロックを使っていきます。

まずは、一つだけやってみます。

下のようになります。

ここで、ひとつ変数を使用するテクニックを使います。

計算結果を、「変数」ブロックに記憶することで、何度も計算する手間を省きます。

また、少し見やすくなります。

下のようになります。

では、全ての曜日について、「もし」ブロックを作ってこのプログラムは完成です。

下のようになります。

実際の問題の答えは、このプログラムにうるう年の年を入れて、曜日が水曜となる年が正解となります。

まとめ

今回のゴールは入試問題を多角的に解く楽しさを知って欲しいということ。

そして、その過程で周期性に強くなることが最終目的です。

念のため書いておきますが、受験本番でプログラミング作成して解いて欲しいなんてことは、微塵も思っていません。

そんなことしたら、試験時間が全く足りませんのでやめて下さいね

問い合わせ

プログラミングはこれからは、「出来たらすごい!」ではなく、「出来て当たり前」になります。

当塾のようにプログラミングと理系教科を同時に指導できる塾で、どちらも学んでみませんか?

もし、興味を持っていただけたなら、↓のLINEやお問い合わせから、初期面談希望の旨を書いていただいてから、ご連絡いただければと思います。

友だち追加

コメント

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