掛け算の表を作る(ここでは5×5までの掛算表)

1.考え方
二重ループで表をつくるのだが,いきなり考えるのは難しい場合は,素材をバラバラにして,ループを使わずにプログラムを書いて,ループになるところを,順にループを使った書き方に変更するという考え方をする。

2.出来上がり予想
出来上がりの表は次のようになる
      1   2   3   4   5 ←かける数
  1   1   2   3   4   5
  2   2   4   6   8  10
  3   3   6   9  12  15
  4   4   8  12  16  20
  5   5  10  15  20  25 
 ↑
 かけられる数
3.ループを使わないで作る
3.1 素朴に考える
上記の表をループを使わずに書くプログラムを考えてみよう。
(1)かける数を並べて表示して改行
(2)1を表示した後,1,2,3,4,5を表示して改行
(3)2を表示した後,2,4,6,8,10を表示して改行
(4)3を表示した後,3,6,9,12,15を表示して改行
(5)4を表示した後,4,8,12,16,20を表示して改行
(6)5を表示した後,5,10,15,20,25を表示して改行

3.2 このような場合,人間は自分で計算してしまうが,計算はコンピュータにさせるために
人間は計算しないようにして(計算結果は使わないで,掛け算は計算前の形を残して),考え方を書いてみる。
暗算が得意な人は計算結果を使わない考え方は不得意であるが,プログラミングのときは,
計算結果は使わないで考え方を示すのは大事な考え方である。
(1)かける数を並べて表示して改行
(2)1を表示した後,1×1,1×2,1×3,1×4,1×5を表示して改行
(3)2を表示した後,2×1,2×2,2×3,2×4,2×5を表示して改行
(4)3を表示した後,3×1,3×2,3×3,3×4,3×5を表示して改行
(5)4を表示した後,4×1,4×2,4×3,4×4,4×5を表示して改行
(6)5を表示した後,5×1,5×2,5×3,5×4,5×5を表示して改行

3.3 プログラムしてみる
できるだけバラバラにして,計算結果は使わないで,掛け算は計算前の形を残して,プログラムするのが大事な考え方である。

List 1
printf("      1   2   3   4   5\n"); //(1)
printf("%3d",1);         //(2)
printf("%4d",1*1);      //ここをバラバラに書くところがその後の考え方にとって大事である
printf("%4d",1*2);
printf("%4d",1*3);
printf("%4d",1*4);
printf("%4d",1*5);
printf("\n");
printf("%3d",2);       //(3)
printf("%4d",2*1);
printf("%4d",2*2);
printf("%4d",2*3);
printf("%4d",2*4);
printf("%4d",2*5);
printf("\n");
printf("%3d",3);       //(4)
printf("%4d",3*1);
printf("%4d",3*2);
printf("%4d",3*3);
printf("%4d",3*4);
printf("%4d",3*5);
printf("\n");
printf("%3d",4);       //(5)
printf("%4d",4*1);
printf("%4d",4*2);
printf("%4d",4*3);
printf("%4d",4*4);
printf("%4d",4*5);
printf("\n");
printf("%3d",5);       //(6)
printf("%4d",5*1);
printf("%4d",5*2);
printf("%4d",5*3);
printf("%4d",5*4);
printf("%4d",5*5);
printf("\n");

4.ループの導入
3.3のlist 1のプログラムから出発して考えよう。このプログラムをよく見ると
次の形のプログラムが5回繰り返されていることに気づくであろう。

list 2
printf("%3d",★);
printf("%4d",★*1);
printf("%4d",★*2);
printf("%4d",★*3);
printf("%4d",★*4);
printf("%4d",★*5);
printf("\n");


そして★のところが,1,2,3,4,5になってできているのが,3.3のプログラムである。
ゆえに,この5回の繰り返し部分はfor文が使える。(変数iを使っているので変数宣言も必要となる)
その結果3.3のプログラムは次のように書くことが出来る。

list 3
int i;
printf("      1   2   3   4   5\n"); //(1)
for (i=1; i<=5; i++) {           //(2)(3)(4)(5)(6)
    printf("%3d",i);
    printf("%4d",i*1);
    printf("%4d",i*2);
    printf("%4d",i*3);
    printf("%4d",i*4);
    printf("%4d",i*5);
    printf("\n");
}

もしlist 1からlist 3への変換に納得できなかったら,つぎ中間的なプログラムを表示して考えると良い。


5.二重ループの導入
list 3でつぎの5行に着目しよう。
    printf("%4d",i*1);
    printf("%4d",i*2);
    printf("%4d",i*3);
    printf("%4d",i*4);
    printf("%4d",i*5);

この部分は,printf("%4d",i*★);の形が5回繰り返されている。
★のところは1,2,3,4,5と変化しているので
変数jを導入して,次のように書くことが出来る。
    for (j=1; j<=5; j++) {
        printf("%4d",i*j);
    }


その結果,list 3は list 4のプログラムとなる。
このプログラムは最初に示した5×5までの掛け算表を表示する

list 4
int i,j;
printf("      1   2   3   4   5\n"); //(1)
for (i=1; i<=5; i++) {           //(2)(3)(4)(5)(6)
    printf("%3d",i);
    for (j=1; j<=5; j++) {
        printf("%4d",i*j);
    }
    printf("\n");
}