見出し画像

プログラミング,ちゃんと数えられますか。

 プログラミングに限らず,問題演習を行うにあたっては,生徒がどんなところを苦手としているかを把握しておく方がよいのはいうまでもないことだろう。
 しかし,時には想定外ということが起こる。すると,次回からはその事態を想定することになる。・・・・ のだが。

 「センター試験「情報関係基礎」2007年のブロック落としをCindyScriptで書く」という記事を以前書いた。そのあと,同じものを Python と JavaScript で書いて,言語による違いを調べた。
 今年もこの題材を実習で扱った。昨年も一昨年も扱っているが,例年と違うのは,2007年の問題を第1問も第2問も解かせたことだ。授業の一コマ目をこれに使う。二コマ目が例年と同じ,第3問のプログラミングだ。

 今年は記録をとってみた。まず,本試験の問題に対する正答率。全部結果を入力するのは大変なので,採点した結果,正答率の低いものだけ数えた。
 たとえば,次の問題。

 二つの16進数 2F と 1D の差を10進数で表すと「コサ」である。

 正答率は45%。「えっ」と思わざるを得ない結果だ。2Fから1Dを引けば 12 だから,10進数にすれば 16+2=18 ではないか。なぜできない?
 考えられるのは,それぞれ10進数に直したときにまちがったこと。もう一つは,Fが15,Dが13 ということがわからなかった(忘れた)こと。
 次の授業で解説をした。2Fと1Dを縦に並べて筆算である。

 さて,ここからが本題。
第3問は,ブロック落としのゲーム。問題の概要は,先程のページで説明したが,例を挙げて説明しよう。

次のようにブロックが積み上げられている。(下図左)

画像1

1番下(1段目)のブロックについて,左端から順に見ていく。
連続する3つのブロックが,「4+3」や「2×5」のようになっていれば計算可能で,+や×のブロックをその結果で置き換え,両端のブロックはとり除く。これを1段目の右端まで繰り返していく。ここでは,2×2で4になる。
取り除かれたブロックの上に,数や演算記号が書かれたブロックがあれば,下に落とす。(右図)

 同じことをまた行うと次のようになる。

画像2

最後は28だけが残る。

このプログラムが,問題には次のように示されている。1段目を左から計算していく部分だ。

画像3

「キ」には何が入るだろうか。

連続する3つのブロックが,「4+3」や「2×5」のようになっていれば計算可能

なので,初めにxにするのは左から2番目のブロックだ。(02)行を見るとよい。
だから「(01) xを2から [キ] まで1ずつ増やしながら 」なのだが,さて,キ はいくつ?

正解は 7 だ。8番目(右端)のブロックは,その右がないので計算可能かどうかの判定をする必要がない。

手順のルールがわかれば,順に追って行って,「数えれば」わかるはずだ。

結果(正答率)はどうだったか?

それを示す前に,次のプログラミング実習でのこの箇所を見ておこう。実際にコードを書いていく。

繰り返しの回数,空欄を入れ,全体を書いて完成しなさい。
 
1 : // HRNO 氏名
2 : // 図5 計算を実行する
3 : calc():=(
4 :   repeat( ,x,start->2, // キ に相当。repeat の回数を書く
5 :   if(isinteger(T_(x-1)_1) // もしT[x-1,1] が数ブロック
6 :      & isop(T_x_1) // かつ T[x,1] が演算ブロック
7 :         & isinteger(T_(x+1)_1),
8 :      if(T_x_1== ,   // ク に相当。右辺を書く
9 :       T_x_1=T_(x-1)_1+T_(x+1)_1;
10 :    );
     以下,略

 問題文の (01) 行目に相当するのが 4行目だ。Cindyscriptでの繰り返しは,「 aからbまで繰り返す」ではなく,「n回繰り返す」だ。start->2 は 2から,といいう意味。では,2から7までなら何回繰り返す?

結果は次のようになった。

画像4

「キ」を7と答えられた者が半数。
2から7までを6回と答えられたものは15.6%だ。

1コマ目の演習の後,正解は渡して,自己採点をするように言ってある。プログラミング実習は相談可だ。「キ」で間違えても,正解を見て修正しておけば,「2から7まで」とわかるはずだ。なのに,「2から7までで6回」ということがわかった者が15.6%しかいないとは?

 想定されること
その1:そもそもちゃんと復習して「7まで」ということを理解する,ということをしていない。
その2:「aからbまで」の繰り返しを「回」にする,ということがわかっていない。(でも,テキストには「repeat の回数を書く」と書いてある)
その3:2から7までは6回と数えられない。

 ここを 7 にすると,7回目では x=8 となり,T_(x+1) でリスト(配列)のインデックスが8を超えてしまってエラーになる。しかし,Cindyscriptでは,警告がコンソールに出るだけで,実行そのものは無視されるだけだ。Pythonのように,エラーで止まれば,考えるかもしれない。とはいえ,エラーメッセージが出ているのに,直そうとしないのである。エラーメッセージの意味,どの箇所でエラーなのかがわからないのかもしれない。

 さらに調べた。

問題もプログラミングも正答だった者     10.6%
ともに 7 と答えた者(回数がわかっていない) 36.2%
問題では違ったがプログラムは正解の者       5%

しっかり内容を把握できた者はわずか10%。えーっ 数えるだけでしょ。