練習 [5] 配列(4/5)

練習 4(提出プログラム名:p0504a.c)

以下の例のように SIZE × SIZE の正方行列の掛け算を行うプログラムを p0504a.c として作りなさい.ただし,SIZE はマクロとし,2 と定義せよ.

【注意】
この問題では(#define SIZE 2 というマクロの定義部分を除いて) 2 や 1 と直接書いてはいけません

【ヒント】
まずは行列の「掛け算」がどういう計算であったかを確認しておきましょう.例えば,次のような行列の場合,掛け算は以下のようになります:

行列の掛け算の結果もまた行列になるわけですが,答えとなる行列の (i,j) 成分を cij と表すとすると,これは次式で求まることになります(ただし,行番号・列番号とも配列に合わせて 0 から始まるようにしてあります):

つまり,cij を 2 次元配列 c[i][j] で表すとすれば,これを求めるには
 c[i][j] = 0;
 for ( k = 0; k < SIZE; k++ )
 {
   c[i][j] += a[i][k] * b[k][j];
 }
という計算を行えばよいことになります.
※合計(Σ)演算を行うため,c[i][j] = 0; という初期化を忘れないこと!

あとは,上のプログラムを i と j をそれぞれ制御変数とした 2 重の for 文の内側に書けば完成です.

  • 【プログラムの実行例】(その1)赤字は実行時にキーボードから入力する内容
行列 A の各要素を入力してください:
1 2 3 4
行列 B の各要素を入力してください:
5 6 7 8

A =
  1  2
  3  4

B =
  5  6
  7  8

A B =
 19 22
 43 50
  • 【プログラムの実行例】(その2)赤字は実行時にキーボードから入力する内容
行列 A の各要素を入力してください:
1 2 3 4
行列 B の各要素を入力してください:
2 3 4 5

A =
  1  2
  3  4

B =
  2  3
  4  5

A B =
 10 13
 22 29
  • 【プログラムの実行例】(その3)赤字は実行時にキーボードから入力する内容
行列 A の各要素を入力してください:
1 2 3 4
行列 B の各要素を入力してください:
1 0 0 1

A =
  1  2
  3  4

B =
  1  0
  0  1

A B =
  1  2
  3  4

【過去にあったミス(実際に減点となり,やり直しを命じられた例)】
■ 上に示した3通りの実行例と出力結果が違っている
c[i][j] = 0; を誤った位置に書いてしまっていて,正しく計算されていない.
■ 上のヒントを見落としていて,無駄に複雑なプログラムになっていたり,2 行 2 列の行列にしか対応できない(マクロ SIZE が生かされていない)プログラムになっている.
インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).


ミスが無いことを確認したら次の問題へ → [ 練習5 (p0505a.c) ]