高校数学の窓過去問検索

プログラミング


「コンピュータプログラミングをする」あるいは「コンピュータプログラムを書く」というと、すぐにPascal、C、BASIC、FORTRAN、COBOL等のプログラミング言語を思いうかべ、それらに精通し自由に操れなくては、プログラムを書くことができないと思う人が多いようです。たしかにコンピュータ教育のなかで、それらをマスターするための言語教育は、たいへん重要な位置をしめます。しかし、プログラミング言語を自由に操れるということは、コンピュータプログラムを作成する上での必要な能力、知識の一部分であってけっしてすべてではありません。
このテキストでは、特定のプログラミング言語に限定することなく、プログラミングの基礎を学習することにします

下線部:亀田


通大の「コンピュータ」テキストのII分冊にあたる「プログラミング」の序文にあたる場所です。
まあ、ここで書いてる事には間違いがありません。っつーか概論的には「間違いが入る」隙が無いんですね。ここまでは良し、です。
ただし、ここの宣言

特定のプログラミング言語に限定することなく、プログラミングの基礎を学習することにします。

と言うのは実は進んで行けば分かるんですが、目的が達成される事はありません。まあ、この目論見自体が完全に失敗しているんですね。
亀田が通読した限り、構文は完全にPascalを模したモノを説明していて、制御機構、データ型、それらはまんまPascalなのです。だったらPascalで初めから解説するべきなんです。脆くも「特定のプログラミング言語に限定する事なく」と言う前提は崩れ去っています。
現時点では、通大では十進BASICをCD-ROMで配布しているらしいんですが、そもそも、Pascalは「構造化プログラミングの旗手」だったわけですし、それを模した構文で解説されて、「時代錯誤のみっともないバッチ式プログラミング言語」であるBASICでフォローしながらプログラムを書けるわけが無いんです。この辺、現時点では完全に通大数学コースの「コンピュータ」は破綻していますね(悪いこと言わないんで、さっさとテキスト改訂した方が良いですよ)。
そして、数値計算法の肝の解説は……「ある言語」だったらピッタシカンカンな解説なんですが、一方、Pascalでこれじゃ意味不明だろ、ってな杜撰な解説で、確かにこれじゃあ受講生は混乱の極みなんですよ(笑)。その「ある言語」とは何か?それはこの筆者の経歴見たときピンと来たんですが、それはおいおい解説し(と言うかツッコミを入れ)ていきましょう。
先へ進みます。


コンピュータプログラムを作成するということは、大きく次の4つの部分に分けられます。

  1. 解決しなければならない問題、仕事を分析し実際になにをコンピュータにやらせたいのか正確に把握する(目的のないプログラムはありません)。

  2. コンピュータに実効させる問題解決のためのすべての処理手順および段取りを考え出す(コンピュータは考えません)。

  3. 考え出された手順、段取りをコンピュータが理解できる言語を使って指示、命令として記述、表現する(プログラミング言語の約束事をすべて覚えるのはたいへんです)。

  4. 実際にコンピュータで実行し、意図した通りの結果が得られるか調べる(1回で動くことはほとんどありません)。



いままでのコンピュータプログラミングに関するテキスト、教育では、上記の(3)の部分が特に強調されることが多いように思います。プログラミング言語を一つ特定し、最初にその言語の細かな文法、表記法をマスターした上で、その言語で処理手順と段取りを考え、記述することを目標とするのが従来からの方法です。
通常、人間はなんらかの言語の助けをかりて思考をします。そこで、一つのプログラミング言語に精通した後に、その言語で処理手順と段取りを考え、さらに、その言語で記述しようとする発想がそこにはあります。一つの言語で、すべてを行おうというわけです。

我々日本人は日本語で思考します。問題分析、目的確認および処理手順と段取りを考えるのは当然日本語で行います。そこで、その思考結果を日本語となんらかの記号を使って、簡潔に分かりやすく記述し、後でそれを実際のプログラミング言語を用いて書き直すと言う考え方も存在します。このテキストでは、この方法をとることにします。
ここで、この途中段階での記述もプログラムと呼ぶことにします。また、実際のプログラミング言語で書かれたものと、あえて区別する必要があるときは、これを疑似プログラムと呼びます。疑似プログラムにも、簡潔さと分かりやすさのために、また、あいまい性をなくすためにいくつかの簡単な表記規則を設けることにします。それらについては、後の節で順に説明します。


まず……ええと……。「疑似プログラム」とは言わねえんじゃねえの?(いや、待て、ひょっとしたら90年代初頭には言ってたのか???・笑)
第一に、用語ですが、今現代通りが良いのは「疑似コード」と言う呼び方です。「疑似プログラム」とは言いません。聞いた事が無い(笑)。これもある意味「玉川用語」でしょうねえ。
第二に、これが諸悪の根源なんですが、

簡潔に分かりやすく記述し

と書いていますが、そもそもこのテキストで使われている「疑似プログラム」自体がPascalを模したもの(正確に言うと、ちょっとCが混じっている感じ)です。そして、現代的な観点では、Pascalはお世辞にもそんなに「簡潔」で「分かりやすく」もない。従って、「Pascalを模している」以上、「簡潔」にも「分かりやすく」もなるわけないんです。
故に、

後でそれを実際のプログラミング言語を用いて書き直す

ってのは「たんなる二度手間」です。そんなまだるっこしい事する必要無いんですよ。
もう一度書きますが、「最初から一貫してPascalで記述してた方が」マシだ、ってだけのお話です。

そもそも「疑似コード」と言うのは、「処理の中核をメモ程度に記述するもの」です。従って、他人が読めれば読めたに越した事はないんですが、かと言って、何らかの「公式の」スタイルがあるようなものではありません。ましてや、それこそ「特定の言語」を模した形式を「制定したり」、あるいは、それを使って「レポートを書いたり」「テスト問題になる」ような性質のものではないんです(通大はそれを「やってる」んですが)。
あたかも「正式な疑似プログラムの書き方」があるような記述は紛らわしいですし、害悪です。この辺も「玉川ローカルだけで通じる」発想でしょう。とんでもない、ですね。

なお、唯一の「公式な」疑似コードと考えられるものにBNF記法、と言われるものがある事はあります。
ただし、これは基本的にコンパイラ設計者(つまりプログラミング言語設計者)が用いる為のもので、情報工学の難しい範疇には出てきますが、一般的な意味で言うと「知ってる必要が無い」代物です。あるいはプログラミング言語の「仕様書」を読む場合必要になる可能性がありますが、まあ、殆ど関係無いですね。
「玉川オリジナル」の「疑似プログラム」は無駄が多くて最悪です。代替案は「後の節で」本文にツッコミながらご紹介しましょう。


さて、ある問題を解決するための、または、ある仕事を実行するための処理手順、段取りを考えだすといっても、我々人間に対するものではなくコンピュータに対するものであることを常に意識しなくてはいけません。
あまり良い例ではありませんが、"電気炊飯器でご飯を炊く仕事"を子供に頼む事を考えてみましょう。大きな子供であれば、

  • 4合ご飯を炊きなさい


と、一言いえば細かなことは自分で判断してやってくれます。それができない、小さな子供であれば、

  • 電気炊飯器の内釜をとりだす

  • お米を計量カップで4合ばかり、内釜にいれる

  • お米を水で白いにごりがなくなるまでとぐ

  • 水を釜の内側の線をみて4合ぶんいれる

  • 内釜を電気炊飯器にもどし、30分そのままにする

  • 電気炊飯器のスイッチをいれる


というぐあいに、こと細かく指示しなくてはいけません。同じ仕事の処理手順、段取りを指示するにも相手が違えば、その内容が異なってきます。相手のことをよく知らなければ、適切な処理手順、段取りを考えだし、指示をあたえることはできません。


以前の章では、いま我々が指示を出す相手であるコンピュータをよく知るために、その外観と構成等をみてきました。これは、人間で例えるならば、その容姿と内臓器官の種類および役割等をみてきたことになります。しかし、それだけではプログラムを作成するうえでの知識としては十分とは言えません。コンピュータの、いわゆる人間でいうところの、知的能力と運動能力と称するものを知らなくてはなりません。
仕事および問題の内容が、コンピュータシステムに直接関係すればするほど、これらについて深く知らなければなりません。しかし、多くの一般的な問題に対しては、コンピュータは

「加減乗除等の計算がやたら早く、記憶力にすぐれ、指示されたことは疑うことなくすばやく実行するが、いっさいの融通がきかず、指示されたこと以外は絶対に行わない。」

という認識をもち、コンピュータに対する指示の出し方の特徴をつかめば、そのための処理手順、段取りを考え出すことができます。

この章の残りは、この特徴を述べることにします。

< 演習問題 >
上で"電気炊飯器で"として話をしましたが、その条件がない場合は指示の出し方がどのように違ってきますか。(ご飯を炊く器具もいろいろあります)



回答例
いや、別にふざけているわけじゃなくって、「プログラムの書き方」の概要を初心者に説明する際に、「料理のレシピとの対比を語る」と言うのは良くあるテクニックなんです。
ですから、この問題は意外に「マトモ」ですし、実際「料理の手順の把握/説明」と言うのはプログラミングに相通ずるものがあると思います。
(別な言い方すると、意外に「料理上手な」女性なんかの方が、プログラミングに向いている可能性さえあります)

0 コメント: