わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

インド式プログラミングバイブル

インド式プログラミングバイブル C言語入門 (上) (インド人著者執筆による日本語翻訳済みIT書籍シリーズ)

インド式プログラミングバイブル C言語入門 (上) (インド人著者執筆による日本語翻訳済みIT書籍シリーズ)

http://d.hatena.ne.jp/tomisima/20080401/1207025745経由で知りまして,Amazonからマーケットプレイスを使って購入しました.
昨日届いて,読み始めました.ざっと見た感想として,勉強の本として適しているとは言えませんが,章末の練習問題の分量が多く,問題のネタになりそうです.
勉強に適していない理由をリストにしておきますと:

  • 古臭い処理系・書き方です.intは2バイト決め打ちで,main関数の定義は「void main()」です.
  • 目次を見ると,章見出しは,カタカナ書きにしただけのものが目立ちます.「第8章 アレイ」となっていて,その次の行が「配列とは」ってのはびっくりです.他の見出しも見る限り,訳者は用語統一の作業をしているようには思えなません.
  • 索引がありません.おかげで,sizeofがどこでどのように使われているか,知ることができません*1

なお,処理系はp.19で「Turbo CもしくはTurbo C++」と書いています.その直前には,Microsoft C,Visual C++Borland C++,そしてgccの言及もあります.
自習する上でまずい箇所を一つ,挙げておきます.前提として,関数呼び出しにより,intの2次元配列aを実引数,intのポインタqと仮引数として代入させ,http://d.hatena.ne.jp/takehikom/20080529/1212009259の3番目の方法で,関数内ではqを使ってaの中身にアクセスしようとしています.しかし型キャストなしで異なる型のポインタの代入というのは,個人的に勧められない使い方です.

例えばiが2,jが3の場合は,要素a[2][3]を示すことになりますが,式 * ( q + i * col + j ) がこの要素を正しく示すかどうか,見てみましょう.次の図8.7を参照してください.*2
式 * ( q + i * col + j ) は * (65502 + 2 * 4 + 3) になります*3.この式はさらに * ( 65502 + 11 ) となります.65502は整数のアドレスであるため,* ( 65502 + 11 ) は * (65524) になります.このアドレスにある値は6となり*4,これはa[2][3]の要素になるので,式は正しく該当要素を示すことができました.
(pp.296-297)

途中で「* (65502 + 2 * 4 + 3)」としているのが,間違い,あるいは混乱のもとです.一応,ポインタ値と整数値の互換性はありますが,直接足すのは不適切です.ここは,「ポインタ値と整数値の加減算で,新たなポインタ値が得られる」ことを理解しておかないといけません.それと,「2 * 4 + 3」を先に計算し,それから「65502 + その結果」を求めていますが,文法上,+ は左結合ですので,まず「q + i * col」を計算してから,「その結果 + j」を求めるのが正当です.
あとは,充実の練習問題を見ていきますか.と,読んでいるうちに,すごい問題文に出くわしました.

ある会社では従業員の勤務効率を,業務を完了するのに費やした時間に基づいて算出しています.費やした時間が2〜3時間であるならば効率が高いと判断され,3〜4時間ならば,もっと速度を上げて仕事をするように,その従業員に命じます.4〜5時間かかる従業員には,業務速度改善の教育を受けさせます.5時間よりも多くかかってしまう従業員は,解雇となります.従業員が業務完了に費やした時間をキーボードから入力すると,勤務効率を判定するプログラムを書きなさい.
(p.90)

解雇があまりにもスピーディです.これぞまさにインド式,でしょうか.インドの仕事事情はさっぱりわかりませんが,こういうプログラミング課題が載っているのは,単純化されているとはいえ,簡単に解雇できる/される社会を表しているように思えます.
なお,同じページに,図書館の延滞料金という問題があって,この制度自体も日本で見かけないのですが,「最初の5日は50パイサ」だそうで,まずはパイサが何者なのかを知ることから始めないといけません*5

*1:個人的に,sizeofを演算子のところで説明していれば文法寄り,そうでなければ実用寄りの本と判断しています.あと,配列に対するsizeofの説明から,著者がメモリに対してどのようにイメージし,あるいは読者に伝えようとしているかが分かるものです.

*2:引用者注: 図は省略します.

*3:引用者注: 配列変数aは「int a[3][4]」と宣言されており,この4を使用しています.

*4:引用者注: 図8.7によります.

*5:次に「6〜10日になると1ルピー」とあるので,100パイサ=1ルピーと推測できるのですが.しかしルピーといえばソフマップだなあ.