C プログラミング (C Programming)

[2017/10/28, H.Aman]
[← 演習のページへ戻る]

サンプルプログラム 3 の内容

掛け算九九の表を表示する.
 1:   #include <stdio.h>
 2:  	
 3:   int main(void){
 4:      int i, j;
 5: 
 6:      for ( i = 1; i <= 9; i++ ){
 7:         for ( j = 1; j <= 9; j++ ){
 8:            printf("%3d", i*j);
 9:         }
10:         printf("\n");
11:      }
12:      
13:      return 0;
14:   }

プログラムの基本的な考え方

掛け算九九の表は,1 から 9 までの自然数の掛け算の組合せをすべて表示したものです.
このサンプルプログラムの場合は,特に入力は必要なく,9 行 9 列のかたちで二つの自然数の積を表示するだけになっています.

ここでは,i と j という二つの変数(int 型)を用意しておき,i と j の値をそれぞれ 1 から 9 まで変化させながら i*j の値を printf で表示しています.

ポイントとしては,i を制御変数とした for 文の内側に別の for 文(j を制御変数としたもの)が入っているというところです.

まず,外側の i を使った for 文での 1 回目のターン(i=1)の中で内側の j を使った for 文が動作しますので, i = 1 の状態で j = 1, 2, ...., 9 と変化しながら i*j の値を printf で表示します. つまり,1*1, 1*2, 1*3, ..., 1*9 が計算され,結果が表示されます.
  1  2  3  4  5  6  7  8  9

その後,改行文字を出力し,i の for 文での次のターン(i=2)に入ります. そこでも同様の処理を行います. つまり,2*1, 2*2, 2*3, ..., 2*9 が計算され,結果が表示されます.
  1  2  3  4  5  6  7  8  9  (改行\n)
  2  4  6  8 10 12 14 16 18
以下同様です.

8 行目: printf("%3d", i*j);

 6:      for ( i = 1; i <= 9; i++ ){
 7:         for ( j = 1; j <= 9; j++ ){
 8:            printf("%3d", i*j);
 9:         }
10:         printf("\n");
11:      }

単純に計算結果を表示するだけであれば printf("%d", i*j); でも構わないのですが,
表のかたちで列を揃えて表示させるため,表示幅をあえて指定して printf("%3d", i*j); としています.
掛け算九九の場合,最大値は 81 であるため,3 桁分の幅をとるようにすれば全ての出力位置が揃います.
※もしも 2 桁分しかとらなかったとすると,隣り合う数字がくっついてしまいます("16 18" ではなく "1618" 等になる).

10 行目: printf("\n");

 6:      for ( i = 1; i <= 9; i++ ){
 7:         for ( j = 1; j <= 9; j++ ){
 8:            printf("%3d", i*j);
 9:         }
10:         printf("\n");
11:      }

既に説明したように,内側の j を使った for 文で 1 行文(9 個の計算結果)の出力が作られますが,そのままでは次のターンで右に出力が続いてしまい表のかたちになりません.
  1  2  3  4  5  6  7  8  9  2  4  6  8 10 12 14 16 18  3  6 ...
内側の j を使った for 文が終わるたびに,いったん改行文字を出力する必要があります.
  1  2  3  4  5  6  7  8  9(改行\n)
  2  4  6  8 10 12 14 16 18(改行\n)
  3  6 ...