(3,3)行列同士の掛け算についてのプログラムを組んでみましたが、
M_abの値がムチャクチャです。
#include<stdio.h>
int main()
{
int M_a[3][3];
int M_b[3][3];
int M_ab[3][3];
int x;
int line;
int colm;

for(line = 0; line < 3; line ++){
for(colm = 0; colm < 3; colm ++ ) {
printf("M_a[%d][%d] >" ,line ,colm );
scanf("%d",&M_a[line][colm]);
}
}
for(line = 0; line < 3; line ++){
for(colm = 0; colm < 3; colm ++){
printf("M_b[%d][%d] >",line,colm);
scanf("%d",&M_b[line][colm]);
}
M_ab[line][colm] = 0;
}
for(x = 0; x < 3; x ++ ){
for(line = 0; line < 3; line ++){
for(colm = 0; colm < 3; colm ++){
M_ab[line][colm] += M_a[line][x] * M_b[x][colm] ;
}
}
}
for(line = 0; line < 3; line ++){
for(colm = 0; colm < 3; colm ++){
printf("M_A = %d\t",M_a[line][colm]);
printf("M_B = %d\t",M_b[line][colm]);
printf("M_AB = %d\n",M_ab[line][colm]);

}
}

return(0);
}

このQ&Aに関連する最新のQ&A

A 回答 (4件)

ku_by_wada さんが、プログラム中で M_ab を初期化しようと


思っている場所が違うようです.
(実際には、初期化されていないと思います)

--+--+--
for(line = 0; line < 3; line ++){
 for(colm = 0; colm < 3; colm ++){
  printf("M_b[%d][%d] >",line,colm);
  scanf("%d",&M_b[line][colm]);
 }
 M_ab[line][colm] = 0; /* ← ここ */
}
--+--+--

これだと、意図しない場所を初期化してしまいます.
M_ab[0][3]、 M_ab[1][3]、 M_ab[2][3]
line の値は変わるけど、colm の値は for 文の外ですから
かならず 3 になっていまいます.
(3行3列の行列なのに、4列目を初期化していることになっています)

なので、初期の部分を for 文の中に入れてしまえば
良いと思います.

--+--+--
for(line = 0; line < 3; line ++){
 for(colm = 0; colm < 3; colm ++){
  printf("M_b[%d][%d] >",line,colm);
  scanf("%d",&M_b[line][colm]);
  M_ab[line][colm] = 0; /* ← ここに移動 */
 }
}
--+--+--

ではでは.

# 実際に、行列の掛け算を行っている部分が間違っているのかも
# しれませんが、そこは検証していません.
    • good
    • 0
この回答へのお礼

どうもありがとうございました。おかげさまでちゃんと動くようになりました。本当に感謝してます。

お礼日時:2001/02/07 08:57

別の回答を思いついたので.



行列の計算を行っている部分を書き換えて、0を代入する場所を
変えてみました.

--+--+--
for(line = 0; line < 3; line ++){
 for(colm = 0; colm < 3; colm ++){
  M_ab[line][colm] = 0;
  for(x = 0; x < 3; x ++ ){
   M_ab[line][colm] += M_a[line][x] * M_b[x][colm] ;
  }
 }
}
--+--+--
# あまり意味の無い書き換えだったかも.

混乱してしまったら、ゴメンなさい.(_o_)
    • good
    • 0
この回答へのお礼

すいません。じっくりやりたいのですが、学校が閉まる時間になってしまったので、続きはあしたにしたいと思います。

お礼日時:2001/02/06 20:05

for(line = 0; line < 3; line ++){


for(colm = 0; colm < 3; colm ++){
printf("M_b[%d][%d] >",line,colm);
scanf("%d",&M_b[line][colm]);
}
M_ab[line][colm] = 0;
}

のM_ab[line][colm]の配列を初期化する部分が間違ってるのかな?
これだと3列目しか初期化できてないような気が。。。
VC++4だとM_b[][]の入力がループされます。

for(line = 0; line < 3; line ++){
for(colm = 0; colm < 3; colm ++){
printf("M_b[%d][%d] >",line,colm);
scanf("%d",&M_b[line][colm]);
M_ab[line][colm] = 0;
}
}
こう変えるとちゃんと走りましたよ

この回答への補足

そう変更したところ、次のように表示されました。ex6_3.c: In function `main':
ex6_3.c:22: parse error before `}'
ex6_3.c:24: parse error before `)'
ex6_3.c:25: parse error before `)'
ex6_3.c:26: parse error before `)'
ex6_3.c: At top level:
ex6_3.c:31: parse error before `for'
ex6_3.c:34: parse error before string constant
ex6_3.c:34: warning: data definition has no type or storage class
ex6_3.c:35: parse error before string constant
ex6_3.c:35: warning: data definition has no type or storage

補足日時:2001/02/06 19:54
    • good
    • 0

全部を詳しく見てはいませんが、とりあえず M_ab[][] の初期化の場所が一行ずれてません?


(さらに言うと、この場所だと、処理系によっては不正なメモリアクセスにもなりそう。)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このカテゴリの人気Q&Aランキング

おすすめ情報