「前回の授業で解説した,2重ループを使った九九のプログラムですが,提出してくれたミニレポートの中で,ある学生が次のように書いていました.
i * jと書いたら,iがかけられる数ですか? jでは?
意図はおそらく,こうなのでしょう.かけ算の記号の左側が,かけられる数,右側が,かける数であると,小学校で学習してきたはずです.
それと確か,〈i=2,j=5〉のときのかけ算で,2 * 5を『にごじゅう』と言ったのでした.
しかし前回のスライドに書いた,プログラムコードの断片と,出力される表をよく見ると,それぞれの行が,九九のかけられる数に対応し,その行の値は,変数jの値がいわば支配しているのです.
そのあたりで疑問を持って,ミニレポートに書いてくれたのだと思います.『jでは?』は,『j * iと書かれていたら,悩まないんだけど』という意図だと理解しました.
これですが,そうですね,《i * j》と書いたら,これは演算子*を用いた2項演算である,と解釈するのがもっとも無難だと思います.それでもってその意味は,iとjの積だとするのです.構文と意味,シンタックスとセマンティクスを分けるわけです.
あるいはプログラマの観点で,解決を図ることもできます.iがかけられる数でjがかける数なのか,iがかける数でjがかけられる数なのか,となるから迷うんであって,変数名を『かけられる数』『かける数』にしてしまえばいいのです.
コードはこうです.
/* kuku_m.c */ #include <stdio.h> int main(void) { int multiplicand, multiplier; for (multiplicand = 1; multiplicand <= 9; multiplicand++) { for (multiplier = 1; multiplier <= 9; multiplier++) { printf("%2d ", multiplicand * multiplier); } printf("\n"); } return 0; }
multiplicandとは,かけられる数のことです.mutiplierは,かける数です.
関連語として,かけ算の結果,言い換えると積のことは,productと言います.かけ算そのものはmultiplication,『かける』という動詞はmultiplyです.2×5は,英語では2 times 5,もしくは2 multiplied by 5と読まれます.
こう書いたら,かけられる数を保持する変数が1から9まで変化し,そのそれぞれに対して,かける数のほうも1から9まで変化して,『かけられる数×かける数』によって積を出力するというのが,明確になっていますね」
なにこれ
これはフィクションです(記事カテゴリーには「授業」を入れていません).
計算機利用の観点で,いくつか補足します.昨日の記事のkuku.cから,今回のプログラムのように変数を変更するには,Emacsのquery-replace-regexpが便利です.バッファの先頭でC-M-%(日本語キーボードだと,Ctrl,Shift,Altを押しながら,テンキーでないほうの5を押す)とすると,ミニバッファで入力が求められます.そこで,\bi\b,RET,multiplicand,RET,最後に ! と打てば,変数i*1がすべてmultiplicandに置き換えられます.先頭に戻って,jも同様にmultiplierに変更します.そこにもう少し,手を加えて,本日のkuku_m.cを作りました.
ソースファイルのkuku.cとkuku_m.cをコンパイルして,実行ファイルのkukuとkuku_mを作ったとき,その出力が同じであることは
- ./kuku|md5sum;./kuku_m|md5sum
を実行して,ハッシュ値が同一となることから確認できます.zshなら
- diff <(./kuku) <(./kuku_m)
としたいところです.
「かけ算の順序」についても少しだけ.九九については,念のため,啓林館のサイトで確認しました.
かける数を行,かけられる数を列としている九九の表も,見たことがあります.
(リリース:2013-11-11 未明)