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

練習 5(提出プログラム名:p0605.c)※必須ではない

この練習問題は必須ではない(提出しなくてもよい)が適切に解けていれば加点の対象とする.

サンプルプログラム 5 (sample5.c)p0605.c という別の名前のファイルにコピーしなさい.そして,p0605.c を編集して以下の例のように行列の足し算ではなく行列の掛け算を実行できるプログラムを作りなさい.

【注意】このプログラムではマクロ SIZE の定義部分以外では 2 と直接書いてはいけません

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

行列の掛け算の結果もまた行列になるわけですが,答えとなる行列の (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 + B =⏎」ではなく「A B =⏎」である点に注意せよ.
行列 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 上でインデントを自動で揃える作業をやっていない).


第6回(Cプログラミング;3 限目の方)の練習問題は以上の5問です.
p0601.c ~ p0605.c を Moodle から提出してください.※ただし,p0605.c は必須ではないです.
くれぐれも各問題で記載されている注意事項や「過去にあったミス」を見落とさないようにしてください.
なお,コンパイルエラーや無限ループになるプログラムを 1 個でも提出した場合は総合評価を 0 点とするので十分に注意すること.
なお,提出後に間違いに気付いた場合,〆切前であれば差し替え(上書き)は可能です.