1. スペイン語
ソース:
/* kuku_e.c (Espanol) */ #include <stdio.h> int main(void) { int multiplicando, multiplicador; for (multiplicando = 1; multiplicando <= 9; multiplicando++) { for (multiplicador = 1; multiplicador <= 9; multiplicador++) { printf("%2d ", multiplicando * multiplicador); } printf("\n"); } return 0; }
出力:
$ make kuku_e $ ./kuku_e 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81
なにこれ:
日本の算数教科書がスペイン語へ翻訳で「Multiplicando x Multiplicador = Producto」を引用しましたので,この式をもとに変数名を置き換えました.
かけられる数(multiplicando)が行,かける数(multiplicador)が列になる九九表は,"La Enseñanza de la Multiplicación" p.138にあります*1.
2. 行列の成分
ソース:
/* kuku_aij.c */ #include <stdio.h> int main(void) { int i, j; for (i = 1; i <= 9; i++) { for (j = 1; j <= 9; j++) { printf("a%d%d ", i, j); } printf("\n"); } return 0; }
出力:
$ make kuku_aij $ ./kuku_aij a11 a12 a13 a14 a15 a16 a17 a18 a19 a21 a22 a23 a24 a25 a26 a27 a28 a29 a31 a32 a33 a34 a35 a36 a37 a38 a39 a41 a42 a43 a44 a45 a46 a47 a48 a49 a51 a52 a53 a54 a55 a56 a57 a58 a59 a61 a62 a63 a64 a65 a66 a67 a68 a69 a71 a72 a73 a74 a75 a76 a77 a78 a79 a81 a82 a83 a84 a85 a86 a87 a88 a89 a91 a92 a93 a94 a95 a96 a97 a98 a99
なにこれ:
数学で行列の成分としてと書いたら,iが行位置でjが列位置です.wikipedia:行列やhttp://homepage3.nifty.com/rikei-index01/senkei/gyoutei.htmlで見ることができます.
これに合うよう,各成分を出力しようとするなら,上のソースのとおり,iが外側,jが内側で変化していく2重ループで書くのが自然です.
なお,来週の授業では,配列と3重ループを使った行列の積計算プログラムを実演する予定でして,その際のループカウンタは,外側から順にi,j,kとしています.
3. 2次元座標
ソース:
/* kuku_xy.c */ #include <stdio.h> int main(void) { int x, y; for (y = 1; y <= 9; y++) { for (x = 1; x <= 9; x++) { printf("(%d,%d)", x, y); } printf("\n"); } return 0; }
出力:
$ make kuku_xy $ ./kuku_xy (1,1)(2,1)(3,1)(4,1)(5,1)(6,1)(7,1)(8,1)(9,1) (1,2)(2,2)(3,2)(4,2)(5,2)(6,2)(7,2)(8,2)(9,2) (1,3)(2,3)(3,3)(4,3)(5,3)(6,3)(7,3)(8,3)(9,3) (1,4)(2,4)(3,4)(4,4)(5,4)(6,4)(7,4)(8,4)(9,4) (1,5)(2,5)(3,5)(4,5)(5,5)(6,5)(7,5)(8,5)(9,5) (1,6)(2,6)(3,6)(4,6)(5,6)(6,6)(7,6)(8,6)(9,6) (1,7)(2,7)(3,7)(4,7)(5,7)(6,7)(7,7)(8,7)(9,7) (1,8)(2,8)(3,8)(4,8)(5,8)(6,8)(7,8)(8,8)(9,8) (1,9)(2,9)(3,9)(4,9)(5,9)(6,9)(7,9)(8,9)(9,9)
なにこれ:
離散的な2次元座標を出力しようとなると,それぞれのyの値ごとに,それぞれのxの値とのペアを順に出力するのが単純です*2.この場合,2重ループは,yを外側とします.
4. まとめ
それでも慣習として,こういうときはjを先,iを後に書きます.というのは,iがx軸に対応し,jがy軸に対応しているからです.y軸あるいは行列でいう行に着目して,左から,行列でいう列の一つひとつに対して処理をしていく際の基本形なのです」
九九表生成プログラム - わさっき
「x軸とy軸」(より正確には,x座標とy座標),それと「行と列」を,ごっちゃにして話したのが,混乱させる原因となったのでした.
九九表に限ると,「行と列」を採用し,行にかけられる数,列にかける数を割り当てればよかったのでした.ですがスライドには「i≦i≦0, 1≦j≦9の各(i,j)について,i * jを計算する」と書いてしまっていて,ここもまた,トラブルのもとなのでした….
(リリース:2013-11-13 未明)