« ぷらっと大阪遠征 レビュー | メイン | 薬指と人差し指,どっちが長い? »

何故論理思考ができないのか? [ 教育 ]

前回のレポートは以下のような課題であった.

でたらめな正の整数を10個入力したとき,n番目の値がn+1番目の値よりも大きかった回数を数えたい.

出題の意図としては,
・正の整数を10個入力するので,配列.
・正の整数を10個入力するので,forループ.
・大小比較をするので,if条件判定.
・数えるという概念.
を確認したい.

「うまく動かない」と質問してきた学生が数名いた.
その大半がほぼ共通する問題を共有していた.
それぞれ異なるプログラムで,細かいニュアンスは違うが,以下のようなプログラムだ.


#include <stdio.h>
void main(void)
{
  int i,a[10],c=0;
  for(i=0;i<10;i++)
  {
    scanf("%d",&a[i]);
    if(a[i]>a[i+1]) c++;
  }
  printf("%d\n",c);
}

確かに,配列を作成し,10個の整数を入力し,2つの隣り合う配列要素を比較し,条件に合うものを数えている.
が.全く要件を満たしていない.
何故これが正しく動くと思うのだろうか.
これはプログラミングセンス以前の問題であると考える.

a[i]を入力したときに,a[i+1]がまだ決まっていないという事実に気付かない.意識しない.
そもそも,出題文をそのままプログラムに起こせばいいのだから,
「でたらめな正の整数を10個入力」→「n番目の値とn+1番目の値を比較」→「条件に合えば数える」
と思考できるはずなのだが,それがどうやらできない.
これはアルゴリズムの問題なので,プログラミングの問題ではない.

課題の下には例が書かれている.
オレ「この例だと結果はいくつになるの?」
学生「・・・(数えてる)・・・4です」
オレ「どうやって4ってわかったの?」
学生「ぇ?」
ここで止まってしまう.
どうやってその問題を解いたのかを説明できない.
今まさに,自らがそれを行っていたのにも関わらずだ.
オレ「今,君はどうやってこれが4だってわかったの?」
学生「1,2,3,4」
オレ「うん.だから,どうやって数えたの?」
学生「・・・・・・」
何も考えていないのだ.
何故そうするのか?何故そうなるのか?
「何故」が足りなさすぎる.

もう1つ.
彼らは優しすぎるようだ.
コンピュータに仕事をさせるのは可哀想だと思っているようだ.
なるべくforの回数を減らしたいらしいし,メモリも節約したいらしい.
なんだか,ものすごく高度なことですよね.
その結果が,入力しながら無理矢理比較するという発想.
無茶苦茶.
これは今年に限った話ではなく,論理思考できない人全般に共通するのだが,
複数のforを書こうとしない.
多重ループとかではなく,独立に複数のfor.
「100個のデータを入力し,それを並び替える」
というプログラムを1つのforで解決しようと四苦八苦する.
問題を細かく分割して,個々に考えればいいのにね.
小さな小さな処理の連続でプログラムはできあがるのにね.
それが関数プログラミングなのに,いまいちそれが伝わってない.
やっぱり,入学してすぐにプログラミングを教えることは無謀なんだと思う.
先にやるか同時にやるか,とにかく,デ構アルゴとかコ基を知らないことには・・・

それから,考えずにプログラムを書いてる人もいる.
オレ「これは?この命令は何をするために書いたの?」
学生「・・・わかりません」
オレ「オレもわかりません」
自分で書いたプログラムなんだから,何かの意図があって書いたはずなのに,わからないらしい.
書いているうちに忘れてしまうのだろうか?スタック領域が狭いなぁ・・・
わからないものを書いたんだったら,わからない動作をしても仕方がない.
わからないものを「正しく直してくれ」と言われても,それは無理な相談だ.
「これこれこうしたい」とか「こうなるはず」とか,何か意図がないとどうしようもない.

あと,よくやるやり取り.
学生はムカッとしてるかもしれないが,それがプログラミングというもの.
学生「この結果,合ってますか?」
オレ「うん.合ってるよ.君の書いたプログラム通りに動いてるよ」
学生「え?でも,先生の答えと違うんですけど・・・」
オレ「この結果は君が書いたプログラムの動作として,何も間違ってないよ」
類似のやりとりに「これ,どこが間違ってますか?」というのもある.
この質問はエラーがない状態で,期待の結果が得られないときによく出る.
しかしながら,「間違っている」という以上,「正しい」結果があるはずであるが,
どうなれば「正しい」のかを示せない学生がいっぱいいる.
「正しい」状態がわからないのに,現状は「間違っている」と認識している.
不可思議だ.
総じて,「何をしたいのか?」「どういう考えをしたのか?」「どうしたいのか?」を示せないなら,答えない.
それを無くして,学生が求めているものをTAが提示してしまっては,答えをばらまいているのと同じ.
それは勉強でも学習でもなんでもない,解答の流布である.


結論:
自分が何をしているのかを考える.
論理思考を心がける.っていうか,できるようにする.
勉強をする気があるなら,アグレッシブに.
自己主張はハッキリと.
聞くときは聞く,勉強するときは勉強する,寝るときは寝る,メリハリを付ける.

プログラミングができない学生の大半は,プログラミング以前の問題を抱えています.
それを解決しない限り,何回再履修したって取れません.
ずーっと前から学科主任に苦情を申し立ててるけど,一向に改善されません.
論理思考は理系の基礎中の基礎なんだから,それができないとなれば,
その影響は計り知れないという事実をなかなか受け入れてくれない.
「プログラミングをやりながら身につけよう」なんて甘い考えが通用しない事実から目を背ける.
本学科の教育カリキュラムに乗っかってれば,ちゃんと勉強できるなんて考えてはいけません.
自学自習が大学教育の基本です.決断するのは自分自身.
あ.そういう意味では,大学教育の真髄を実践しているのか.
もちろん,皮肉.