ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

C言語(ソース議論をベースに)コミュの助けてください

  • mixiチェック
  • このエントリーをはてなブックマークに追加
助けてください(>_<)
再々々履修中です…

今日参考書を読んでいて答えを見てもよくわからない問題が合ったので誰がわかりやすく教えてくれませんか?
問題:2行3列と3行2列の行列の積を求める

ソース:
#include <stdio.h>
int main (void)
{
int i,j,k;
int mx[2][3]={{1,2,3},{4,5,6}};
int my[3][2]={{1,5},{5,3},{8,1}};
int mz[2][2]={0};

for(i=0;i<2;i++){
for(j=0;j<2;j++){
mz[i][j]=0; /*疑問?
   for(k=0;k<3;k++)
mz[i][j] +=mx[i][k]*my[k][j];/*疑問?
}
}

for(i=0;i<2;i++){
for(j=0;j<2;j++)
printf("%3d",mz[i][j]);
putchar('\n');
}

return(0);

}


/*疑問というところがわかりません。
?mz[i][j]=0;
と置く理由 またなんで0?
?mz[i][j] +=mx[i][k]*my[k][j];
の式の意味
そもそも行、列が異なる掛け算の仕方がわかりません(苦笑)

実行結果は
35 14
77 41
になります!!!

コメント(7)

1.おく必要ないんじゃない?初期化してるんだし。。。

2.式が mz[i][j] = mz[i][j] + (mx[i][k] * my[k][j])
ってなるのはわかるよね?
mz[0][0] = mx[0][0] * my[0][0] + mx[0][1] * my[1][0]
+ mx[0][2] * my[2][0]
になるのかな?( ゚д゚)ポカーン
(1*1)+(2*5)+(3*8)=mz[0][0]になりますよぉーみたいな?
(1*5)+(2*3)+(3*1)=mz[0][1]になりますぅーみたいな?
うわぁ!!!!!!!!!!!!!!わかりやすいです!!!おもわず印刷しちゃった(笑)ありがとうございます!!疑問?の方はまたナイverで実行してみます!!!!
疑問?の方ですが、0で初期化してるわけは配列に限らず、変数は最初宣言した際、何らかの値が入っています。

そして計算した値を代入した際、やり方を間違えると、当然バグになります。

その時、意味のわからない値がでれば問題ないのですが、普通の値が出てきた場合、それも偶然にも正解の値がたまたま出てしまった場合、それがバグだと気づかない可能性があります。

なので予め0をおいておけばバグかどうかがわかりやすくなります。
今回のようなケースは特に計算の仕方を間違えやすいパターンなので、0があれば正確に計算できているかどうか一発でわかります。

初期化している理由は確かこれだったと思います。

なくてもいいですけど、安全に行きたいなら必ずおいたほうがいいです。
>変数は最初宣言した際、何らかの値が入っています。
宣言が
>int mz[2][2]={0};
なので宣言した際に入ってるのは0だと思いますよ。
σ(-ω-*)フム…
まぁわかってくれたらよかったでし(゚∀゚ )
がんばってくらはい(´∀` )
>プヨぷよさん

すいません。ちゃんとコード見て無かったです。

ちゃんと見てから言わないとだめですね(._.ゞ)ポリポリ
うわぁ…ハイレベルですね…みなさんありがとうございます!!!!またお願いします(>_<)

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語(ソース議論をベースに) 更新情報

C言語(ソース議論をベースに)のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング