1.3. 数値計算編#

ネコがしゃべり、ペンギンが飛ぼうとする Scratch の世界ですが、今回はちょっとだけ真面目に数字と向き合ってみましょう。この節では、Scratch を使ってシンプルな計算を行う方法を見ていきましょう。

1.3.1. 偶奇判定#

割り切れない想い、分け合えない時間。クラスの人数が奇数で、ひとりだけペアが組めなかった日。そんな余りある青春を思い出しながら、ある数が偶数か奇数かを確かめるプログラムを作ってみましょう。

プログラムを作る上で、まず与えられた数値そのものを保存するための変数と、判定の結果を記録するための変数の 2 つを用意する必要があります。変数カテゴリーから「変数を作る」ボタンをクリックして変数を作ります。1 つ目の変数に入力値、2 つ目に判定結果と名前をつけて作成してください。

準備ができたら、プログラムを組み立てていきましょう。基本的な考え方は、「入力された数を 2 で割り、その余りが 0 であれば偶数、そうでなければ奇数」と判定する、というものです。その判定結果を判定結果変数に保存し、最後にネコがその結果をしゃべる、という流れになります。

まずは、全体の構造を作ります。使うブロックは次の 5 つです。(旗)が押されたとき入力値を 0 にする判定結果を 0 にするもし<>ならーでなければ、そしてこんにちは!と言うです。これらを順番にスクリプトエリアに並べてください。なお、入力値を 0 にする判定結果を 0 にするが見つからない場合は、my variable 0 にするというブロックの中の変数名を変更することで対応できます。

../_images/scratch-n01-001.png

次に、入力値を 0 にするブロックの 0 の部分に、試したい任意の整数を入力してみてください。たとえば、2、3、10、15 などです。

続いて、もし<>ならブロックの条件部分を作っていきます。まず、演算カテゴリーから = 50ブロックを取り出して、<>の場所に入れます。次に、同じく演算カテゴリーから で割った余りブロックを使い、 = 50 ブロックの左側のの部分に入れましょう。そして、そのブロックの最初の 入力値、2 つ目の 2 と入力してください。さらに、 = 50ブロックの 50 の部分は 0 に変更します。これで、「入力値を 2 で割った余りが 0 であるかどうか」を判定する条件が完成します。

../_images/scratch-n01-002.png

次に、判定結果を記録する処理を追加します。もし<>ならおよびでなければの内側に、判定結果を 0 にするブロックを入れてください。そして、前者の判定結果を 0 にするブロックにある 0偶数、後者の 0奇数に書き換えてください。

最後に、こんにちは!と言うブロックのこんにちは!の部分を判定結果変数に変更しましょう。これには、変数カテゴリーにある判定結果ブロックをドラッグして入れ込むだけです。これでプログラムは完成です。

../_images/scratch-n01-003.png

開始ボタンをクリックして動作を確認してみてください。入力値を変えるたびに、ネコが「偶数」または「奇数」と正しく言ってくれるはずです。入力値を何度か書き換えて試して、条件の動作を確かめてみましょう。

数字を見つめ、ネコは今日も静かに語り続ける。奇数か偶数か。

1.3.2. 合計値計算#

希望の朝に生まれ、静かな夜の終わりに残される。なにかを記録し、なにかを忘れ、ひとつ、またひとつと積み重なっていく数字たち。そんな数たちを呼び寄せて、私たちはいったい何を見つけるのだろうか。ええ、ただの合計です。では、さっそく、あらかじめ与えられた複数の数値の合計を計算するプログラムを作ってみましょう。

合計を計算するプログラムには、入力値の記録と結果の保存のための変数が必要です。

  • 合計の対象となる複数の数字をまとめて保存するリスト(数字箱)。

  • 加算した結果(合計値)を保持する変数(合計値)。

はじめにこれらの変数を用意しましょう。変数カテゴリーを開き、「リストを作る」ボタンをクリックします。リストの名前を「数字箱」として、「OK」をクリックします。この操作により、ステージにリスト「数字箱」が表示されます。

../_images/scratch-n02-001.png

ステージにある「数字箱」枠の左下にある「+」ボタンをクリックして、いくつか数値を追加してみましょう。たとえば、10、20、30、40、50 の 5 つの数値を追加します。

../_images/scratch-n02-002.png

次に、「変数を作る」をクリックして、変数「合計値」を作成します。これで、合計を求めるための準備が整いました。

合計を計算するプログラムを作ってみましょう。考え方はとてもシンプルで、「数字箱」というリストに入っている数字を一つずつ取り出して、それらを順番に合計していくだけです。

まず最初に、プログラムの基本的な骨組みを作りましょう。最初に(旗)が押されたときブロックをスクリプトエリアに置き、その下に合計値を 0 にするブロックを 6 個並べてください。そして一番下にこんにちは!と言うブロックを繋げます。これで、プログラムの土台ができあがります。なお、合計値を 0 にするのようなブロックが見つからない場合は、my variable 0 にするブロックを使い、変数名の部分を合計値に変更すれば対応できます。

../_images/scratch-n02-003.png

続けて、2 番目の合計値を 0 にするブロックに、リスト「数字箱」にある数字を一つずつ取り出して足していく処理に変更します。このブロックの 0 の部分には、演算カテゴリーの + ブロックを使って、足し算の式を作ります。最初のには合計値、2 つ目のには数字箱の 1 番目を指定します。

../_images/scratch-n02-004.png

同様にして、3 番目以降の合計値を 0 にする合計値を 合計値 + 数字箱の 2 番目のように変更します。そして、最後のこんにちは!と言うブロックのこんにちは!の部分も、合計値に置き換えます。

../_images/scratch-n02-005.png

これで、簡単な合計プログラムが完成しました。試しにステージ上の開始ボタンをクリックしてみてください。すると、ネコが正しく合計値を話してくれるはずです。

数字箱の中に入っている数が 5 つ程度であれば、個別にブロックを並べる方法でも問題ありません。しかし、数字が 10 個、20 個と増えていくと、このやり方では手間がかかりすぎて現実的ではなくなります。そこで、プログラムに規則性を持たせて整理し、より柔軟で使いやすい形にしていきましょう。

たとえば、合計値を 合計値 + 数字箱の 1 番目合計値を 合計値 + 数字箱の 2 番目 といったブロックは、リストの各要素に対して同じ処理を繰り返していることに気づきます。つまり、処理対象となる「1番目」「2番目」といった部分を、1 から順に変化していく変数に置き換えれば、これらのブロックは一つにまとめることができます。

ここで、新たにいまココという変数を作り、この変数の値を毎回 1 ずつ増やすようにします。たとえばいまココを いまココ + 1 というブロックを使えば、繰り返し処理のたびにいまココが 1 つずつ増えていきます。また、その直後に、合計値を 合計値 + 数字箱の いまココ 番目というブロックを実行すれば、いまココで指定された位置の数字を順番に取り出し、合計値に加算することができます。

../_images/scratch-n02-006.png

こうして積み上げたブロックを見渡してみると、いまココを いまココ + 1合計値を 合計値 + 数字箱の いまココ 番目が交互に並び、それが 5 回繰り返されていることに気づきます。

同じ処理を何度も繰り返している場合は、制御カテゴリーにある繰り返しブロックを使えば、プログラムを簡潔にまとめることができます。プログラムを簡潔化するには、まず、ブロックの中からいまココを 0 にする合計値を 0 にするを残し、それ以降のブロックをいったん外します。そして、制御カテゴリーから10 回繰り返すブロックを取り出し、それを残したブロックの下につなげます。このブロックはデフォルトで 10 回になっていますが、ここでは数字箱に入っている数字の数だけ繰り返したいので、10 の部分に、変数カテゴリーにある数字箱の長さブロックをはめ込みます。

次に、その繰り返しブロックの内側に、いまココを いまココ + 1合計値を 合計値 + 数字箱の いまココ 番目のブロックを順に入れ込みます。これで数字箱の内容を 1 つずつ順に合計していく処理が、簡潔に繰り返し構造の中で実現できるようになります。最後に、繰り返しブロックの下に合計値と言うブロックをつなげて、合計値を表示させましょう。

../_images/scratch-n02-007.png

これで繰り返し制御を使って合計を求めるプログラムを作ることができました。

練習問題 SB3-N1

リストに入っている数の平均値を求める Scratch プログラムを作成してください。

練習問題 SB3-N2

リストの中にある奇数の個数を数える Scratch プログラムを作成してください。

1.3.3. 最大値検索#

星空を見上げれば、ひときわ輝く星に目を奪われる。教室を見渡せば、背の高いあの子がすぐに見つかる。集団の中には、いつだって「いちばん」がいるものです。けれども数字たちは黙ったまま、誰が主役なのかを教えてくれません。こちらから聞き出すしかない。そう、最大値検索の出番です。

では、複数の数値からなるリストが与えられたときに、リストの最大値を調べるプログラムを Scratch で作ってみましょう。準備として、次のような変数を用意します。

  • 検索の対象となる複数の数字をまとめて保存するリスト(数字箱)。数字箱には、あらかじめいくつかの数値を入れます。例えば、10, 21, 5, 88, 39。

  • リストのどの位置を処理しているかを記録するための変数(いまココ)。

  • 最大値を記録する変数(最大値)。

考え方としては簡単です。まず最大値数字箱の 1 番目の数字とします。続いて、数字箱中にあるすべての数値を最大値と比較し、もしもっと大きい数字が見つかれば、それで最大値を上書きしていきます。

まず、変数を初期化し、合計値計算のプログラムを参考にして、数字箱中にあるすべての値を調べるための枠組みを作ります。

../_images/scratch-n03-001.png

続いて、数字箱いまココ番目の値と最大値を比較します。もし数字箱いまココ番目の値のほうが大きければ、それを新しい最大値に更新します。

../_images/scratch-n03-002.png

これで最大値を検索するプログラムが完成しました。あとは数字箱の中に入れる数値をいろいろと変えて、プログラムが正しく動作するかどうか試してみてください。

練習問題 SB3-N3

リストの中で最大の値が、前から数えて何番目にあるかを調べる Scratch プログラムを作成してください。

練習問題 SB3-N4

リストの中で 2 番目に大きい値を調べる Scratch プログラムを作成してください。

練習問題 SB3-N5

リストに入っている数値を昇順に並べ替える Scratch プログラムを作成してください。

ペンギンが飛べず、ネコが歩みを止めない Scratch の世界ですが、実はデータサイエンスを支える重要なアルゴリズムまで実現できてしまうのです!いや、正確に言うと、読者が作れたというより、Scratch の仕様上・理論上できちゃうわけなんです。