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

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

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

SIZE × SIZE の行列 A, B を読み込み,A+B を別の行列 C として格納する.
その後に,A, B, C の内容を表示する.
なお,SIZE はマクロとして定義する.
 1:   #include <stdio.h>
 2:
 3:   #define SIZE 2
 4:
 5:   int main(void){
 6:      int a[SIZE][SIZE], b[SIZE][SIZE], c[SIZE][SIZE];
 7:      int i, j;
 8:
 9:      printf("行列 A の各要素を入力してください:\n");
10:      for ( i = 0; i < SIZE; i++ ){
11:         for ( j = 0; j < SIZE; j++ ){
12:            scanf("%d", &a[i][j]);
13:         }
14:      }
15:
16:      printf("行列 B の各要素を入力してください:\n");
17:      for ( i = 0; i < SIZE; i++ ){
18:         for ( j = 0; j < SIZE; j++ ){
19:            scanf("%d", &b[i][j]);
20:         }
21:      }
22:
23:      for ( i = 0; i < SIZE; i++ ){
24:         for ( j = 0; j < SIZE; j++ ){
25:            c[i][j] = a[i][j] + b[i][j];
26:         }
27:      }
28:
29:      printf("\n");
30:      printf("A = \n");
31:      for ( i = 0; i < SIZE; i++ ){
32:         for ( j = 0; j < SIZE; j++ ){
33:            printf("%3d", a[i][j]);
34:         }
35:         printf("\n");
36:      }
37:
38:      printf("\n");
39:      printf("B = \n");
40:      for ( i = 0; i < SIZE; i++ ){
41:         for ( j = 0; j < SIZE; j++ ){
42:            printf("%3d", b[i][j]);
43:         }
44:         printf("\n");
45:      }
46:
47:      printf("\n");
48:      printf("A + B = \n");
49:      for ( i = 0; i < SIZE; i++ ){
50:         for ( j = 0; j < SIZE; j++ ){
51:            printf("%3d", c[i][j]);
52:         }
53:         printf("\n");
54:      }
55:
56:      return 0;
57:   }

プログラムの基本的な流れ

このプログラムでは,(数学でいうところの)行列2 次元配列を使って表現しています.

例えば,

の場合,a という名前の 2 次元配列に次のイメージで格納しようというものです:
0 1
a 0  5   8 
1  7   9 
各変数との対応関係は
  • a[0][0] = 5
  • a[0][1] = 8
  • a[1][0] = 7
  • a[1][1] = 9
となっています.

プログラムの大まかな構成は次の通りです:
  1. 配列 a に行列 A の内容を格納していく
  2. 配列 b に行列 B の内容を格納していく
  3. 配列 c に行列 C (=A+B) の内容を格納していく
  4. 配列 a, b, c の内容を順に出力する

9-14 行目: printf("...."); for ( i = 0; i < SIZE; i++ ){ ... }

 8:
 9:      printf("行列 A の各要素を入力してください:\n");
10:      for ( i = 0; i < SIZE; i++ ){
11:         for ( j = 0; j < SIZE; j++ ){
12:            scanf("%d", &a[i][j]);
13:         }
14:      }
15:     

行列 A の内容を二重の for 文を使って読み込んでいます.
外側の for 文(制御変数 i )が行列の「」に対応し, 内側の for 文(制御変数 j )が行列の「」に対応します.
したがって,for 文の繰り返しによって, a[0][0], a[0][1], a[1][0], a[1][1] の順に scanf で読み込みが行われます.
例えば,

の場合, 5 8 7 9 の順に読み込みます.

行列 B についても同様です.(16-21 行目)

23-27 行目: for ( i = 0; i < SIZE; i++ ){ ... }

22:
23:      for ( i = 0; i < SIZE; i++ ){
24:         for ( j = 0; j < SIZE; j++ ){
25:            c[i][j] = a[i][j] + b[i][j];
26:         }
27:      }
28:      

ここでは行列 A と B の足し算を実現しています.
内容は単純で,A の (i,j) 成分と B の (i,j) 成分を足したものを C の (i,j) 成分として求めています.

例えば,

とすると,

という計算を行っています.

具体的には i = 0 ~ 1j = 0 ~ 1 について c[i][j] = a[i][j] + b[i][j] を求めています.
  • c[0][0] = a[0][0] + b[0][0]
  • c[0][1] = a[0][1] + b[0][1]
  • c[1][0] = a[1][0] + b[1][0]
  • c[1][1] = a[1][1] + b[1][1]