• ベストアンサー

Cで作ったプログラムについて

(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); }

質問者が選んだベストアンサー

  • ベストアンサー
  • slackware
  • ベストアンサー率59% (22/37)
回答No.3

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; /* ← ここに移動 */  } } --+--+-- ではでは. # 実際に、行列の掛け算を行っている部分が間違っているのかも # しれませんが、そこは検証していません.

ku_by_wada
質問者

お礼

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

その他の回答 (3)

  • slackware
  • ベストアンサー率59% (22/37)
回答No.4

別の回答を思いついたので. 行列の計算を行っている部分を書き換えて、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_)

ku_by_wada
質問者

お礼

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

  • QPchan
  • ベストアンサー率22% (8/36)
回答No.2

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; } } こう変えるとちゃんと走りましたよ

ku_by_wada
質問者

補足

そう変更したところ、次のように表示されました。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

  • hohihohi
  • ベストアンサー率34% (23/66)
回答No.1

全部を詳しく見てはいませんが、とりあえず M_ab[][] の初期化の場所が一行ずれてません? (さらに言うと、この場所だと、処理系によっては不正なメモリアクセスにもなりそう。)

関連するQ&A