見出し画像

文科省情報Ⅰ教員用研修教材第3章の解答の改善案

 文科省情報Ⅰ教員用研修教材第3章「コンピュータとプログラミング」は,本編がPython,ほかにJavaScript,VBA,ドリトル,Swift版が出ている。しかし,解答編はPythonだけである。
 そのPython版であるが,本編でいままでいくつか指摘した点がそのまま改善されていないばかりか,きちんとPythonの記述規約PEP8に準じていないのものがかなりある。PEP8といって,あまり厳密に言うこともないかもしれないが,せめて,「演算記号の前後にはスペースを入れる」くらいは守りたい。いろいろなところで書いているように,高校の「情報」では,「Pythonを教える」のではなく,「Pythonを使って」プログラミングの基本を教えるのだ。しかし,その言語に応じた書法は守る姿勢はきちんと教えたい。理由は簡単だ。プログラムコードの可読性のためだ。共通した書式にしていれば誰でも読みやすい。自分で書いて,その後変更することなく自分で使うだけなら「動けばいい」だろう。それでもよく言われることがある。「1年後の自分が読むことを想定して」である。その時にはわかっていても1年経つと忘れてしまう。その時に,自分書いたコードが読みにくかった困るのは自分なのである。

以下,課題とその解答,不備な点,改善案を示していく。なお,学習12のmicro bit の課題に関しては,高校情報科・情報処理技術者試験対策の突破口ドットコムさんが詳細な解説を書かれているので参照されたい。

以降は,学習13からである。

まず,インデントが7文字か8文字に見えるものがある。推奨は4文字である。これはすべてに共通である。

学習13 基本的プログラム

<演習 3 >
 (2)図表 10 のコードを参考に『30 点未満ならば「再試験」そうでなければ「合格」と表示される』プログラム
を作成しましょう。

解答のPDFではこうなっている

画像1

2行目,30 とコロン : の間に空白が入っている。(ように見えるだけかもしれない)ここにはスペースは入れない。4行目の else のあとも同様。
(1) や,他の解答例も同様である。

<演習 4 >
(1)図表 13 のコードを参考に『x の値を表示すると同時に繰り返している回数をその都度表示する』プロ グラムを作成しましょう。

画像2

2行目と5行目,コンマの前にはスペースを入れない。
逆に,6行目はコンマのあとにスペースを入れる。これは,本文の図表13も同様。他の解答例も同様である。
また,range のステップ値は,1がデフォルトなので略したほうがいいだろう。(これは PEP8ではない) range(1, 6) でよい。
なお,本文の図表13は,高校情報科・情報処理技術者試験対策の突破口ドットコムさんが指摘されている通り,図表11,12と合っていない。

図表11,12のようにやるなら,for i in range(5) または 明示的に range(0, 5, 1)としなければならない。

<演習 5 >
図表 16 のコードを参考に『i が偶数の時だけ x に 10 を加え,その都度 x の値を表示する』プログラムを作成 しましょう。

画像3

剰余演算子の % の前後,== の前後にスペースを入れる。本文の図表16も同様。

学習14

<演習 1 >
図表3のコードを参考にして『リスト a の中の最小値を表示する』プログラムを作成しましょう。

画像4

演算子の前後のスペースがない。
次の演習2,演習3も同じ。演習3の range(0, p, 1) は,単に range(p) でよい。
しかし,それよりまずいのは,最小値を表す変数に min を使っていることだ。これは,組み込み関数の最小値を求める関数の名前なので使ってはいけない。エラーは出ないけれど,「予約語は使わない」に反する。一度これをやってしまうと,次に,関数 min() を使おうとしたときにエラーになってしまうのだ。
ちなみに,JupyterNotebookだと,予約語は緑で表示される。

画像5

mini ならよい。

学習15

<演習 1 >
表3および図表6のコードにおいて,『探索した回数を表示』できるようにプログラムを変更しましょう。

追加した count=0 , count=count+1 は,いずれもスペースが入っていない。
if a[I]==p の == の前後にスペースがないのは本文の図表3も同じ。
 なお,この線形探索のプログラムだが,探索対象が存在しなかったとき,何も起こらないので,プログラムが動いているのかどうかもわからない。存在しなかったときには「ありませんでした」と表示したい。そのためには,フラグ(旗)を立てるという方法がある。さらに,これを関数化するならば,通常はあったかどうかだけを戻り値として返し,結果をどう使うかは呼び出し側で処理する。これらを含めて,次の改訂案を示す。

def linsearch(a, p):
   flag = False
   for i in range(len(a)):
       if a[i] == p:
           flag = True
           break
   return flag
a = [61, 15, 82, 77, 21, 32, 53]
p = 81
if linsearch(a, p):
   print("見つかりました")
else:
   print("ありませんでした")

 二分探索の方は,追加した count の行にはスペースが入っているが,他はこれと同様である。また,条件判断のところは elif と else でもよいだろう。

次の演習3,選択ソートと演習4クイックソートについては,以前指摘した通りである。
文科省の情報Ⅰの教員研修用教材,選択ソートもあれれ・・・
クイックソートは難しい? : 文科省研修教材のコードには虫がいるよ

学習16

<演習 1 >
複利計算のプログラムを動かし,グラフを表示してみましょう。また,このシミュレーション結果から,利息計算がどのような特徴をもっているか,どのようにして判断すれば良いか,考えてみましょう。
※計算する値(パラメータ)を変更しながら考えてみてください。

この解答は問題ない。
演習3も問題ない。ただ,PEP8のチェッカにかけると,np.count_nonzero(saikoro==i+1))
の == の両側にはスペースをいれるようにいわれる。

<演習 4 >
プログラムを実行してみて,試行回数が結果に与える影響について考察してみてください。

解答に次のコメントがある。

シミュレーション回数を増やすと時間がかかり,回数が少ない と結果のバラツキが大きくなる。妥当性の判断は,どの程度の正確さを求めるのかによって異なってくる。

回数を増やすと時間がかかるのは,ループの中でプロットしているからである。ループの中ではデータだけ作り,最後にプロットすればほとんど時間はかからない。プログラミング:モンテカルロ法で遊んでみた(2) 
に書いた通りである。

学習17

演習1 放物運動のシミュレーション

コードが長いのでコピーは略す。
コメントがたくさん書かれているが,ひとつひとつに全部つける必要はない。初心者向けということだろうが,かえって煩わしい。また,# の次に半角スペースを入れる。コマンドのあとにコメントを入れる場合は2つ以上のスペースを入れる。
コードには問題はない。
演習2,演習3も同様である。


以上。演算子やコンマの前後のスペースなど,生徒実習では注意するとしても,試験の解答では減点する必要はないだろう。実習でも細かく言う必要はないかもしれない。しかし,テキストは正しく書かれていなければならない。印刷する前に,PEP8チェッカにかけて確かめるほうがいいだろう。