わさっきhb

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

九九表生成プログラムのバリエーション

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

なにこれ:
数学で行列の成分としてa_{ij}と書いたら,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 未明)

*1:「九九表を作ろう」という学習指導案と思われます.

*2:各行の出力内容を格納する配列に書き足すか,cursesなどの端末制御ライブラリを使えば,列ごとに出力することも可能ですが,今回のコードよりも複雑になります.