見出し画像

Retro-gaming and so on

関数型言語脳テスト その2

もう一問やってみようか。
これもオリジナルはC++の問題だ。

std::vector<std::string> に自分の好きなものの言葉を入れていってください。
例えば,std::vector<std::string> birds; に,"メジロ", "キジバト", ...と入れていく。
その後,そのベクターの中に特定の何かがあるかどうかを確かめるプログラムを書いてください。(例えば "オナガ" があるか)

これは、正直言うと、教えて!gooでは典型的なダメな質問の仕方だ。
宿題なら生徒に対して「好きなものの言葉を入れていってください」と言う指定が可能だろう。
しかしそれを教えて!gooでやられると「何でコチラ側がわざわざ自分でデータを作らなアカンのや」とか回答側は思ってしまう。メンド臭い。少なくとも僕はそうだな。
質問投稿する際は「具体的なデータ例」は質問者側が準備しておくべきなんだ。
じゃないと、ホント「考える気は全くありません」と言う典型的な「丸投げ質問」だと捉えられるだろう。

もっとも、僕はそれでも回答は書いちゃうけどね。教えて!gooだと「丸投げは止めましょう」と説教がしたい目的で徘徊してる人間も見かけるが、それは僕の趣味じゃない。しかも、確率は物凄く低いけど、それでも向学心があるヤツはソースコードから何かを学ぶだろう。
皆良く言うが、「他人が書いたソースコードは」良かれ悪しかれ最高の教材となる。従って、他の科目と違って、プログラミング「だけ」は「自分で考えろ」は必ずしも良い勉強法の示唆にはならんのだ。写経した方が100倍もマシだ、ってぇのは少しでもプログラミングに慣れてる層には割に当たり前である(※1)。
そんなのもあって、僕は基本的には丸投げ質問にはヘーキでコッチが書いたソースコードを提供してる。まぁ、もっとも教えて!gooに質問してる層はコピペ目的がほぼ100%だとは思ってるけどね。
でも構わないんだ、それは。C++弄る為だけの目的でコッチもやってるわけだから。

さて、こういう風に「データを準備してない」問題とか、あるいは入力が良く分からん問題の場合どうするんだろう。
僕だと大体コマンドライン引数を使っちゃう。それで「勝手に何とかしろ」って体で答えを書いちゃうのね(笑)。
そもそも、C言語系の初心者向けのお題で入力を扱わせるのは間違ってると思ってるんだ。これはC++だけど、Cでscanfを使用させるような問題を見る度に出題者はバカか?と思ってる。これまでにそう思った回数は500回を超えている。
この辺がC言語脳な教育者はバカなんだろうな、って思ってるまた1つの原因なのだ。scanfを使わせておいては余談で「でもこれはアブナイんですよ〜」とか言ってるんだろう。危険なら使わせないのが一番なのだ。C言語のscanfはPythonのinputやLispのread、あるいはPascalのread/readlnとは安全性で比較すると言語道断で危険な関数なんだよ。
そもそも、出される問題の質から言うと、全然コマンドライン引数でも構わんような問題ばっかだ。「プログラミングを教えるならまずは入力を・・・」とか言うのはPascalなら是だがCなら間違ってる。単にそれだけなのに、Pascal型の教育から一歩も進めてないんだ。だからまず、C言語脳の教育者側が全く何も考えてない、って事なんだろ。こいつらバカなんだわ、ホンマ。最初にコマンドライン引数を教えろよ、マジで(※2)。
もう1つの理由が、何度か指摘してるけど、教えてるCプログラムの書き方が依然ANSI Cベッタリな辺りだ。ホント、こいつらエエカゲンにせぇよ、とか思ってる。仕様書読んで現行Cに合う書き方を教えんのか。こういう怠慢な奴らはそもそも教育者に向いてないんじゃねぇのか。マジで腹立つ話だ(※3)。

さて、ここでも別に「C++で書け」とは言わない。RacketでもPythonでも何でもお好きな言語を使えばいいだろう。
そして、「鳥」のデータを自分で作っても良いし、僕がやるようにコマンドラインで入力しても良い。好きにすれば?とか思ってる(笑)。
ヒントとしては、例えばRacketだとベクタを返すcurrent-command-line-argumentと言う関数を使えば端末からコマンドライン引数を持ってこれる。あと、ライブラリとしてはSRFI-1を使えば幸せになれるだろう。
Pythonだったらコマンドライン引数はsysモジュールのsys.argvで取る事が出来る。
どっちにしても参考としては、RacketでもPythonでも、スクリプト形式だと、諸々合わせても10行に満たないプログラムになる。まぁ、これは僕が書いた場合、って事だ。
これも回答例は後日あげる事としよう。

※1: ぶっちゃけ、プログラミング程「下手の考え休むに似たり」が表面化する分野はない、と思ってる。
むしろ、考えずに、書道のように「良いお手本をとにかく何度も真似る」方が効果があるんじゃないか。

※2: 「コマンドライン引数を教える前に配列や文字列を教えないといけないし・・・」ってのはその通りだろう。だったら入力に纏わる話は配列や文字列のあとにやるべきだ、ってだけの話である。
とすれば、前半戦はかなりつまらん授業になるかもしれない。しかしその方が安全だし、なにより元々、単にC言語はプログラミング初学者には向いてない言語なのに、それを使うからそういうハメになるんだ。
Cを最初に扱わせる、と言うおバカな決定をした自分等を責めるべきなんだ。

※3: こういう事を書くとほぼ100%「組み込みでは〜」とかバカな事を言い出す奴らが現れるが関係ない。特定の分野でのプログラミングで必要だから「教育」の照準を「特定の分野」に合わせろ、なんつー意見はバカの意見だ、って事はフツーの感性を持ってたら簡単に分かる話である。
そもそも、組み込みで使うから「標準」は知らんでいい、ってのは狂ってる意見だろう。順序としては全く逆で、「標準」をまず知ってから「特定の分野」での事を学ぶべきなのだ。
そもそも、こういうバカな事を言い出す奴らは「何故に標準が定義されてるのか」と言う理由がアタマからスッポリ抜けているのである。
こういうクソバカな意見には耳を傾ける必要はない。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事