見出し画像

「情報関係基礎」2009年の素因数分解の問題をScratchで書く

 大学入試センター試験「情報関係基礎」2009年の素因数分解の問題をScrarch で書いてみた。
 なぜ Scratch ? と思われるだろうから,それについては後述する。
 この問題を Python で書いた話を以下の note に書いた。比較しながら読まれると面白いと思われる。なお,問題の説明はこの note と重複しているのであしからず。

問題

まず,2から100までの数について,素数の判別表を作る。
初めはすべて0。

画像1

(b) 0の値に対応する番号のうち,最 も小さい番号を n とする。
 n の倍数の番号に対応する値の欄を,すべて n に書き換える。
(C) 値の欄に0がなくなるまで(b)の手順を繰り返して,判別表を完成させる。

画像2

この判別表を用いて,任意の数を素因数分解する。

プログラムは次のように区分して出題されている。
(1) 判別表の初期化
(2) 判別表の作成
(3) 判別表を用いて素数だけを印刷(表示)する。
(4) 任意の数(ここでは100)を素因数分解する。

Scratch の画面は次のようになっている。

画像3


左側のコマンドブロックを,その右にドラッグしてプログラムを書いていく。結果は右(ネコがいるところ)に表示される。

(1) 判別表の初期化

 Scratch では,配列ではなく「リスト」を使う。まず,Yakusuというリストを用意し,初期化する。リストを用意するには,左側の「変数」のタブをクリックし,(あるいはコマンド列をスクロールして)「リストを作る」をクリックし,

画像5

リストの名前を書く。

画像6

変数も同じ手続きで定義する。
リストの初期化は,問題では次のようになっている。

画像4

100 までの要素が入れられる配列がすでに用意されている前提だ。
しかし,Scratch では,初めは配列名を定義するだけなので,次のようにして作る。

画像7

いったん削除しているのは,このスプライトを何度も実行するとそのたびに「挿入」され,Yakusu の領域がどんどん増えてしまうためである。
 Python では,range() でリストを用意してから代入する。

Yakusu=list(range(101))
for i in range(100):
   Yakusu[i]=0

にあたる。
CindyScriptなら,リスト処理を使えば,次の1行でできる。

   Yakusu=apply(1..100,0)

Scratch のように考えるならば

   Yakusu=[];
     repeat(100,Yakusu=append(Yakusu,0));
​

(2) 判別表の作成

画像8

Scratch には「制御」として,forループに相当する「○回繰り返す」ブロックと,while に相当する「< > まで繰り返す」ブロックがある。したがって,問題の図2の通りに・・・・とは実はいかない。
正直なことを書くが,実はここでひっかかってしまって,時間を費やした。
多くのプログラミング言語で,while(条件,処理)は,「条件が成り立つ間」のループである。しかし,Scratch は「条件が成立するまで」なのだ。
ここに気がつかず,「動かない」となって,いろいろ試しているうちに気がついた。
問題の「j ≦ ケ の間」は,「j > ケ まで繰り返す」にしなければならない。

画像9

Pythonだと,次のコードだ

for i in range(2,101):
   if Yakusu[i]==0:
       j=i
       while j<=100:
           Yakusu[j]=i
           j=j+i

(3) 判別表を用いて素数だけを印刷(表示)する

「印刷」は,多くのプログラミング言語では print() ,Scratch では,「変数○を表示」というブロックを使う・・・ のだが,Scratch では,途中のものが逐一表示されるわけではない。「変数の値」として表示され,そこがどんどん上書きされてしまうので,途中の値はわからない。

画像10


このために,デバッグも容易ではない。途中経過の変数の値をチェックできないからだ。(もしかするとできるかもしれないが,初心者には無理だ)
印刷(表示)しても確認はできないので,このコードはパスする。

(4) 任意の数(ここでは100)を素因数分解する

これには,アルゴリズムの説明がある。

2以上の整数を素因数分解するには,商 が1になるまで,次々と約数である素数で割っていけばよい。
42ページの図2の手続きを実行した結果,配列Yakusuのそれぞれの要素には,添字の約数のうちで (ス) が 入っている。よって, この配列 Yakusu を利用すれば,素因数分解することができる。図4は,100を素因数分解する 手続きである。

画像11

素因数を,リスト prime にリストアップしていくことにする。
Python ではひっかかったわり算の商の問題はここでは発生しない。

画像12

Python では次のようになる。

prime = []
k = 28
print(k,end="=")
while k>1:
   prime.append(Yakusu[k])
   k = k // Yakusu[k]


以上,2009年の素因数分解の問題は Scratch でもできた。

なぜ Scratch なのか

 ある教科書会社の人が,新課程で使う副読本の見本を持ってきた。教科書はまだ公開できないようだ。Web 上では副読本についてもまだ掲載されていない。
 その中に,プログラミングの教材がある。なんと,Scratch と VBA であった。VBAは,MS-Office でそのまま使える,という理由だと思うが,環境依存なので,誰でも使えるわけではない。実際,筆者はMS-Officeは持っていないので,VBAは使いようがない。
 Scratch は,小中学校で使ってくる可能性が高い,ということだろうか。しかし,高校生で Scratch か,という疑問は残る。だが,やってみないとわからない。その見本本は,他の先生のところに置いてきたので,Scratchのダウンロードから実行まではWebで調べながらやった。以前やったときは,1.4 版だったが,今は 3 (3.18) となっており,だいぶ変わっていた。コマンド名などは漢字。小学校の低学年では,漢字が読めないだろうし,変数やリストの概念は小学生でも難しいだろう(もちろん,できてしまう子はいるだろうが,全員は無理)
 やってみると,実際にセンター試験の問題がプログラムできた。しかし,これは,整数と基本的な制御,リスト処理しか扱っていないものである。他の問題でも使えるだろうか。それは,これから実際に検証していく。

 やってみて,コーディングの能率がいいとはいえないというのが第一印象だ。
たとえば,「変数 i に 1 を代入する」という代入は,テキストベースのプログラミング言語なら「i = 1」だけだが,Scratch では「『変数 i を○にする』のブロックを選んでドラッグ」「○に1を書く」という2手間になる。
for 文や while 文に相当する繰り返しループを作るのは,手間としてはそれほど違わないかもしれない。具体的な数以外は,「ブロック」をドラッグしてきて組み立てる。
 もっとも,今の子どもたちがキーボードを打てない,ということを考えると,Scratch の方が速くできたりするかもしれない。しかし,高校生がそれでいいのだろうか。
 マウスドラッグでプログラミングができる,という環境でやってきた生徒は,大学生になってから,Python や C などでコーディングができない(打つだけで時間がかかる)ということになりかねない。
 とはいえ,教科書会社がそういう副読本を用意したということは,「需要がある」といういことを見越してのことだろう。必修科目「情報Ⅰ」とはいえ,就職者が多い学校では,Office の使い方が主になるだろうし,加えてやるならVBAということだろう。
 では,進学校は? 独自のテキストを作ることになるのではないだろうか。大学入学後のことを考えると,進学校に,VBAやScratch という選択肢はないと思うのだが,これについてもこれから検証していこう。

追記:「ある教科書会社」は実教出版。Webページを見てみたら,「事例でまなぶ プログラミングの基礎」は2019年3月に発売されていた。