Scratch 3.0で小銭計算:800円は、500円玉何枚? 100円玉は?

800円のものを買うとき、どんな風に小銭を出しますか? 全部の硬貨がお財布にあれば、500円玉を 1枚と 100円玉を 3枚出しますよね。ではこれ、私達は頭の中でどんな風に考えて、どの小銭を出すかを判断しているのでしょう。プログラムに自動的にやらせるとしたら、どんなプログラムになるのでしょう。

ここでは、そんなプログラムを Scratchを使って開発してみましょう

Scratchの準備をしよう

Scratchを起動したら「作る」メニューをクリックします。スクラッチキャットが表示された状態から始まるので、まずは「○○ときいてまつ」のブロックをコードエリアに配置して、「いくらですか?」と質問を書き換えましょう。

すると、ユーザーが入力できるエリアが表示されるので、ここに好きな値段を入力します。この「○○ときいてまつ」ブロックで入力された値は、すぐ下にある「こたえ」というブロックに自動的に格納されます。左にあるチェックボックスにチェックをすれば、ステージ上にも表示されるのでこれを表示しておくと良いでしょう。

500円玉を出すには

例えば、値段が 600円だった場合は 500円玉を 1枚出します。400円なら出せないですよね(ここではおつりをもらう事は考えないこととします)。つまり、値段が 500円よりも上だった場合は 1枚だし、そうでなければ出さないという考え方になります。

そのため、次のような考え方でプログラムが組み立てられます。

もしも、値段が 500円よりも上だったら 500円を 1枚出す

これでプログラムが作れます。では、100円玉も同様に考えましょう。

100円玉の場合、120円なら 1枚で 80円なら 0枚ですが、例えば 240円だった場合は「2枚」出す事になります。これを例えば、「400よりも上なら 4枚、300よりも上なら 3枚・・」と考えてしまうと効率が悪いので、次のように考えるとどうでしょう。

値段が、100円よりも下になるまで、100円を 1枚ずつ出す

これで、100円玉を出す事ができます。また実は、これは 500円玉や 50円玉にも応用できます。1つの考え方で、いろいろなプログラムを作れた方が効率が良くなるため、次のような考え方にしましょう。

高額な硬貨から順番に考え、その金額よりも下になるまで、その硬貨を出し続ける

これをプログラムにしていきましょう。

変数を作ろう

各硬貨を何枚出すかは、「へんすう」に入れておきたいと思います。へんすうグループで「新しいへんすうを作る」をクリックしましょう。

そして「500円」という変数を作ります。同様に、100円、50円、10円、5円、1円も作っておきましょう。

また、「こたえ」という変数に入った値段を変更しやすくするために「残り」という変数を作って、ここに入力された値段を入れておきます。これで、変更しやすくなります。

それでは、実際に500円玉を出していきましょう。次のようなプログラムになります。

これで、例えば「600円」と入力すれば、500円が 1枚となり、残りが 100円となります。プログラムの実行時に、変数を 0にしておく必要があるので気をつけましょう(どんどん足されていってしまいます)

次に 100円を出してみましょう。ブロックを複製して、値段部分だけ変更すれば良いでしょう。次のようになります。

これで、各硬貨のプログラムを作れば完成です。

より効率のよいプログラムにしよう

さて、これでプログラムとしては完成ですが、実はこれはあまり効率がよくありません。400円を出すために、4回プログラムを繰り返さなければなりません。もっと効率よく「400円なら 4枚」と割り出せないでしょうか? 計算式を使えば簡単です。

例えば、600円を考えてみましょう。600円から 500円が 1枚である事は、これを割り算すると求められます。

600 ÷ 500 = 1.2

これを「切り捨て」して「1」にします。これを Scratchで実現するには、次のようになります。

そして、残りの金額を出すには「割り算の余り」を使います。これを「剰余算(じょうよざん)」といい、プログラムの世界ではよく使われる計算式です。次のようなプログラムになります。

すると、600と 500の割り算の余りは 100なので、残りは 100円となり、これを 100で割れば、100円が 1枚であることが分かります。こうして、各硬貨の枚数を求めることができます。

これで完成です。同じように正しく動作することが確認できます。

今回は、小銭を計算するプログラムを作成してみました。プログラムというのは、同じ動きをするものでも、いろいろな作り方があります。効率の良さや、拡張のしやすさ、プログラムの分かりやすさなどで、どのような作り方がベストであるかは一概には言えませんが、一度完成したプログラムであっても、よりよいプログラムの書き方はないかを考えてみるのも、良い練習になるでしょう。