わさっきhb

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

九九表生成プログラム〜かけられる数とかける数に配慮

「前回の授業で解説した,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 未明)

*1:「\bi\b」は「語境界,i,語境界」という意味になる正規表現です.語境界を指定しなかったら,printfがprmultiplicandntfに変わってしまいます.