見出し画像

高等学校「情報Ⅰ」のプログラミングのために(5) フローチャートをやめよう

 以前ないと思っていた,「情報の科学」の教科書(採用のための見本)が,準備室の書棚に入っていた。
 「社会と情報」の教科書にも「発展」として「アルゴリズムとプログラミング」が入っているが,「情報の科学」ではちゃんと節を設けている。
 というのも,学習指導要領(解説)によると,「「モデル化とシミュレーション,アルゴリズムとプログラミング」は,「社会と情報」には,目標にも学習内容にも入っていないからだ。一方,「情報の科学」では,目標に

アルゴリズムを用いた表現方法の習得,コンピュータによる自動処理の有効性の理解,モデル化とシミュレーションの考え方の問題解決への活用

とあり,内容に

生徒の実態等に応じて,適切なアプリケーションソフトウェアやプログラム言語を用いるなどして,整列や探索などの基本的なアルゴリズム,簡単なアルゴリズムを生徒に表現させ,それを自動実行させるなどの体験的な学習活動を通じて行う

と書かれている。

なお,この現行課程の学習指導要領解説でも,

指導に当たっては,コンピュータやソフトウェアの操作方法の習得やプログラミング言語の記法の習得などが主目的にならないように留意し,ソフトウェアや処理手順の自動実行の原理を科学的に理解し,これらを必要に応じて活用できる能力の育成と活用方法の習得に重点を置くことが必要である。

という,まったくおかしなことが書いてある。習得が「主」目的ではないにしても,習得しなければ「必要に応じて活用」などできるはずもないではないか。ソフトウェアを立ち上げ,プログラムコードを書き,正しい場所に保存する,ということを習得できなくて,どのように活用するのだろうか。(ちなみに,今だに,「保存先を指定して,正しいファイル名をつけて保存する」ということができない生徒がいる)

閑話休題。

 教科書を比べてみた。一つの出版社で,レベルの異なる2種類の教科書を出している場合もあるが,見本で来ているものだけである。教科書によって,記述量に差がある。

実教出版   VBA。フローチャートあり。
日本文教出版 JavaScript。フローチャートあり。
数研出版   アルゴリズムのみ。フローチャートもなし。
東京書籍   JavaScript,フローチャートあり。

日本文教出版については,副教材も見本があった。内容は
・入力値が3で割りきれれば「大吉」割りきれないときは「小吉」と表示する。:入力と計算
・1から10までの和:繰り返し
・シーザー暗号:配列
・並べ替え(選択ソート)
・入力値以下の素数をすべて表示する
・硬貨の枚数を順に入力し,総額を計算する
となっており,教科書掲載と同じものを演習するようになっている。

 この,日本文教出版の副教材を見ていて,暗澹たる気持ちになった。この副教材はよくできていて,フローチャートの要素の説明が詳しく書かれており,コードと併記して対応できるようになっている。そういう点ではいいのだが,「フローチャートありき」の記述になっていて,それがかえってアルゴリズムの考察を阻害していたりするのだ。
 実は,現行の学習指導要領解説「情報」には,「フローチャート」という用語は一度も出ていない。
 おそらく,教科書会社の方で,「基本的なアルゴリズム,簡単なアルゴリズムを生徒に表現させ」るためにフローチャートを導入したのだろう。むしろフローチャートを載せていない数研出版の方が,余分なことをしていないだけましかもしれない。

これに対し,新学習指導要領では,

言葉だけでなく, フローチャートや状態遷移図などのアルゴリズムを表現するための図や記号,モデルを表現するための図や記号,プログラムを表現するための言語などを用いて考えたり,説明し たりするなどの学習活動も充実する必要がある。

と,書かれている。なぜフローチャートという前世紀の遺物を持ち込んだのだろうか。
 フローチャートについては,「高等学校「情報」のプログラミングを考察する(4)」でも書いたが,もう一度書いておこう。

・現在の構造化されたプログラミング書法に,フローチャートは合わない。
・情報処理技術者試験のひとつ,基本情報技術者試験では今でも扱っているが,フローチャートを書くのではなく読み取るものだ。それもごく簡単なもので,「知っている?」という程度のものに過ぎない。

具体例を示そう。日本文教出版の副教材「情報のノート」掲載のものだ。

シーザー暗号
 アルファベットを何文字かずらして暗号化するシーザー暗号。それを復号するためのアルゴリズム。

画像3

 左側のフローチャートについて,その説明が右にある。
丁寧で,フローチャートの意味がわかりやすい・・・・ と思うだろうか。それとも笑ってしまうだろうか。

 フローチャートを見ても何のことやらわからない。
・配列x,y,n,mって,何?
・「"暗号文は",m,"<br">」って何? チャートの記号は「表示」だから,「暗号文を表示」とすればよさそうなものだが。
・次のループ。iが0から10 までなのはなぜ?(右の説明で暗号文を見ると11文字だが,別の文だったらどうするのだろう)
・そのあと,ループの中の n[i]=m[i] が何をしているのかがわからない。もともとn,mの説明がないからだ。右の説明を見ると,平文の配列 n の i 番目に,暗号文の配列 m の i番目を代入しているようだ。何のために?
・次のループでは,i番目の文字をアルファベット配列xから探し出し,n[i]に対応するy[i] を代入している。つまりこの時点で復号。
あれ?それならさっきの n[i]=m[i] はいらないではないか。

 それにしても,フローチャートを見てもなんのことだかわからない,右の説明を見てわかる,のであれば,フローチャートはいらないではないか。
 なお,テキストでは,このあとに,暗号文を変えて実行するようになっている。その答えは「プログラムの9行目の for(i=0; i<=10; i++) を for(i=0; i<=14; i++) に変更する」なのだが,こんなバカなことはしないのがプログラミングの流儀である。すなわち,文字列の長さを表す変数を用意するのだ。アルゴリズムとしても,「k を配列 m の大きさとする」を入れて,ループを k-1 までとすべきなのだ。

並べ替え
 4つのおもりの重さ(weight)を昇順に並べ替える。アルゴリズムは選択ソート。最小値を探して入れ替える,という方法だ。

画像3

 ここで二重ループ( for ループのネスティング)が登場するのだが,フローチャートでは「どこまでが第一ループか」がすぐにはわからない。「ループ b の終わり」を探さなければならないのだ。
 これに対し,右のコードならブロック化されているので,どこまでが b のループかはすぐにわかる。
 もっとも,このコードでは,ブロックのインデントの付け方が誤っていて,構造が見にくいのだが。Pythonだったらエラーで動かない。
(さて,どこが違うでしょうか。デバッグしましょう)
 これが,いまの「構造化されたプログラミング書法」とフローチャートがなじまない例だ。

素数の抜き出し
 任意の数 number 以下の素数をすべて表示するプログラム。
考え方が右上に書かれている。

画像3

 フローチャートを見ていって,何をしているかわかるだろうか。
右の説明を読まずに,「gをyで割った余りが0 - はい/いいえ」と,そのあとの judgement++ で何をしているか説明できるだろうか。
 また,右の説明の 8 番目と9番目は必要だろうか。2番目,4番目と重複しているのではないか。
 ここでも二重ループなのだが,やはりループのはじめと終わりの対応は探していかないとわからない。
 これに対応するコードが掲載されている。

画像4

この方が,構造がずっとわかりやすい。
大学入試センター試験「情報関係基礎」の問題でも,フローチャートは載っておらず,コーディングの問題は次のようになっている。二重ループだ。

画像5

構造がわかりやすい。

 ところで,例として示した日本文教出版のJavaScriptのコードだが,これに適宜コメント文をつければ,フローチャートはまったくいらないだろう。コメント文の付け方とその意義についてはぜひ指導すべきだ。

 新課程の教科書はまだ目にしていないが,おそらく各社ともフローチャートは載せてくるだろう。学習指導要領に記載があるからだ。しかし,実際の授業では,「順次処理」「繰り返し」「条件分岐」の基本だけ記号と意味を教えるくらいで,それぞれの課題に対していちいちフローチャートを書くことはしない方がよい。フローチャートを書くつもりで,最初から構造化した枠を描いていけばいいのだ。わざわざフローチャートを書くなど,時間の無駄であるばかりか,「わからなくなる」要因だからだ。