練習 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 上でインデントを自動で揃える作業をやっていない).
← [ 練習3 (p0503a.c) ]
ミスが無いことを確認したら次の問題へ → [ 練習5 (p0505a.c) ]