C言語で行列の和を計算する方法と結果

このQ&Aのポイント
  • 久しぶりにC言語の復習をしようと簡単な行列の計算を書いてみたのですが、思うような結果になりませんでした。
  • どこに間違いがあるのか発見できませんでした。アドバイス等宜しくお願いいたします。
  • 期待する結果と出力された結果が異なるため、ソースコードに誤りがある可能性があります。
回答を見る
  • ベストアンサー

C言語 行列の和

C言語 行列の和 ご覧いただき有難うございます。 久しぶりにC言語の復習をしようと簡単な行列の計算を書いてみたのですが、思うような結果になりませんでした。 昨日から考えていたのですが、どこに間違いがあるのか発見できませんでした。 アドバイス等宜しくお願いいたします。 >環境 OS:Windows XP(32bit),Windows 7(64bit) コンパイラ:Visual Studio C++ 2010 Express (付属のコマンドプロンプ使用) >期待する結果 7 5 7 9 6 8 >出力された結果 7 8 0 0 0 0 >ソースコード #include <stdio.h> int main(void){ int i,j, ma[2][3] = {(1,2,3),(4,5,6)}, mb[2][3] = {(6,3,4),(5,1,2)}, mc[2][3] = {0}; for(i=0;i<2;i++){ for(j=0;j<3;j++){ mc[i][j] = ma[i][j] + mb[i][j]; } } for(i=0;i<2;i++){ for(j=0;j<3;j++){ printf("%3d",mc[i][j]); } putchar('\n'); } return (0); }

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

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

配列の初期化方法が間違ってますね。 想定しているのは、おそらく int ma[][] = {{1, 2, 3}, {4, 5, 6}}; int mb[][] = {{6, 3, 4}, {5, 1, 2}}; int mc[2][3]; という事でしょう。

kanatas
質問者

お礼

完全に見落としていました。 ありがとうございました。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

> ma[2][3] = {(1,2,3),(4,5,6)}, > mb[2][3] = {(6,3,4),(5,1,2)}, ()でくくられた中が、カンマ演算子と解釈され、実質 > ma[2][3] = {3,6}, > mb[2][3] = {4,2}, になっています。

kanatas
質問者

お礼

計算式に意識がいっており、カンマ演算子は考えてもいませんでした。 ありがとうございました。

関連するQ&A

  • C言語で行列の積を計算できるような関数を作って疑問に思ったことがありま

    C言語で行列の積を計算できるような関数を作って疑問に思ったことがあります。 まず↓のような2x3行列と3x2行列が計算できる関数を作りました、、 #include <stdio.h> void mul(const int ma[2][3],const int mb[3][2],int mc[2][2]) { int i,j,k; for(i = 0; i < 2; i++) for(j = 0;j < 2;j++) for(k=0;k<3;k++) mc[i][j]+=ma[i][k]*mb[k][j]; } int main(void) { int i,j; int ma[2][3] ={{1,2,3},{4,5,6}}; int mb[3][2] ={{7,8},{9,0},{1,2}}; int mc[2][2] ={0}; mul(ma,mb,mc); for(i = 0;i < 2; i++) { for(j = 0;j < 2;j++) printf("%4d",mc[i][j]); putchar('\n'); } eturn(0); } ---------------------------------- これをmxn,nxp行列で計算できるような関数にしたいと思い 下のようにしたのですがエラーになります。どうしたらいいでしょうか・・? #include <stdio.h> void mul(const int ma[int m][int n],const int mb[int n][int p],int mc[m][p]) { int i,j,k; for(i=0;i<m;i++) for(j=0;j<p;j++) for(k=0;k<n;k++) mc[i][j]+=ma[i][k]*mb[k][j]; } int main(void) {int i,j; int ma[2][3] ={{1,2,3},{4,5,6}}; int mb[3][2] ={{7,8},{9,0},{1,2}}; int mc[2][2] ={0}; mul(ma,mb,mc); for(i = 0;i < 2; i++) {for(j = 0;j < 2;j++) printf("%4d",mc[i][j]); putchar('\n');} return(0);}

  • 行列の積の求めかた

    行列の積を求めるプログラムを組んだのですがうまく表示されないです。 x=1,2,3  4,5,6 y=1,5  5,3  8,1 としの行列の積です。 #include <stdio.h> int main(void) { int i,j; int ma[2][3] = {{1,2,3},{4,5,6}}; int mb[3][2] = {{1,5},{5,3},{8,1}}; int mc[2][2] = {0}; for(i=0;i<2;i++) for(j=0;j<3;j++) mc[i][i] += ma[i][j]*mb[j][i]; mc[1-i][i] += ma[1-i][j]*mb[j][i]; for(i=0;i<2;i++){ for(j=0;j<2;j++) printf("%3d",mc[i][j]); putchar('\n'); } return(0); } 結果は↓のようになります。 38 0 0 41 まだプログラミングをはじめて日が浅いので基本てきなとこが抜けてる かもしれません。よろしくお願いします。

  • 行列の和のプログラミング

    以下のをCソースを打ち込んでコンパイルすると、 warning: passing arg 1 of `mat_add' from incompatible pointer type warning: passing arg 2 of `mat_add' from incompatible pointer type となります。これは、どういうエラーでどう直せばいいのでしょうか? #include <stdio.h> void mat_add(const int ma[2][3], const int mb[2][3], int mc[2][3]) { int i, j; for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) mc[i][j] = ma[i][j] + mb[i][j]; } int main(void) { int i, j; int ma[2][3] = { {10, -5, 4}, {18, -2, -18} }; int mb[2][3] = { {23, 16, -9}, {-3, 20, 5} }; int mc[2][3] = { 0 }; mat_add(ma, mb, mc); for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) printf("%3d", mc[i][j]); putchar('\n'); } return (0); }

  • c言語 行列の積に関して

    <問>  4行3列の行列aと3行4列の行列bの積を、4行4列の行列cに格納する関数を作成せよ。  void mat_mul(const int a[4][3], const int b[3][4], int c[4][4]) 入門レベルのスキルしかありません。 上手く行列の積のプログラムが組めません。 行列の積の計算結果が何も出てきません。 どの様にしたら良いかご指導の程、宜しくお願いします。 <プログラム>  void mat_mul(const int a[4][3], const int b[3][4], int c[4][4]) { int i, j, k; for (i = 0; i < 4; k++) { for (j = 0; j < 4; i++) for (k = 0; k < 3; j++) c[i][j] = c[i][j] + (a[i][k] * b[k][j]); } } void mat_print(const int m[4][4]) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) printf("%4d", m[i][j]); putchar('\n'); } } int main(void) { int i, j ,k; int tensu1[4][3]; int tensu2[3][4]; int seki[4][4]; for(i = 0; i < 4; i++) { for (j = 0; j < 3; j++) { scanf("%d", &tensu1[i][j]); } putchar('\n'); } for(i = 0; i < 3; i++) { for(j = 0; j < 4; j++){ scanf("%d", &tensu2[i][j]); } putchar('\n'); } putchar('\n'); mat_mul(tensu1, tensu2, seki); puts("行列の積"); mat_print(seki); return 0; }  

  • 2次元配列の基礎について

    とある問題で 下に示す行列x,yの積を求めるプログラムを作成せよ。 x=[123][456] y=[15] [53][81] 問題の意味が自分にはよくわからないのですが この場合 123*15;123*53;123*81 456*15;456*53;456*81 の解答を表示させればいいのでしょうか? 自分でやったら以下のようになりましたが、これだと456*53と123*15と0しか表示されません。どこをどう直せば宜しいでしょうか? ご教授お願いしますm(__)m #include <stdio.h> int main(void){ int ma[3][1] ={{123},{456}}; int mb[3][1] ={{15},{53},{81}}; int mc[3][1] ={0}; int i; int j; for(i=0;i <= 3;i++){ for(j=0;j <= 1;j++){ mc[i][j] =ma[i][j] * mb[i][j]; } } for(i=0;i <= 3;i++){ for(j=0;j <= 1;j++){ printf("%3d",mc[i][j]); putchar('\n'); } } return 0; }

  • C言語、行列の積を求めるプログラムについて

    「次に示す行列x,yの積を求めるプログラムを作成せよ。   x[2][3]={{1,2,3},{4,5,6}} y=[3][2]={{1,5},{5,3},{81}}」 という問題です。自分ではとりあえず、 #include<stdio.h> int main(void) { int i,j; int x[2][3]={{1,2,3},{4,5,6}}; int y[3][2]={{1,5},{5,3},{8,1}}; int xy[3][3]={0}; for(i=0;i<3;i++) for(j=0;j<3;j++) xy[i][j]=x[i][j]*y[i][j]; for(i=0;i<3;i++){ for(j=0;j<3;j++) printf("%3d",xy[i][j]); putchar('\n'); } return 0; } というプログラムを作ってみましたが、ダメでした。 ちゃんと積の表示が出るようにするにはどこをどう変えるべきでしょうか?

  • 多次元配列の受渡しでの警告

    多次元配列を関数に受け渡す際に、 警告: passing argument 1 of ‘mat_add’ from incompatible pointer type 警告: passing argument 2 of ‘mat_add’ from incompatible pointer type のような警告が出てきてしまいます。 プログラムは、明解C言語(柴田望洋著)で紹介されているサンプルプログラムなのですが(下に載せておきます)、どうしてこのような警告がでるのか分からず困っています。 多次元配列の渡し方になにか問題があるのでしょうか? #include <stdio.h> void mat_add(const int ma[][3], const int mb[][3], int mc[][3]) { int i,j; for(i=0; i<2; i++) for(j=0; j<3; j++) mc[i][j] = ma[i][j] + mb[i][j]; } int main(void) { int i,j; int ma[2][3] = {{9,2,-3},{4,5,1}}; int mb[2][3] = {{9,2,-3},{4,5,1}}; int mc[2][3] = {0}; mat_add(ma, mb, mc); for(i=0; i<2; i++){ for(j=0; j<3; j++) printf("%3d",mc[i][j]); putchar('\n'); } return(0); }

  • C言語、putcharについて

    C言語で、 int i,j; for (i=1;i<=9;i++) { for (j=1;j<=9;j++) printf("%d",i*j); putchar('¥n'); を実行すると   1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81 となります。 しかし、4行目をprintf("%d",i*j); にかえてputchar('¥n')をなくすと、すべての値が同じ列になってしまいます これはどういうことでしょうか??

  • C言語の問題です!!

    C言語の問題です。次の問題でプログラムを作ってみたのですがどうでしょうか?もし小さな間違いであったら訂正をお願いします。全然違う場合はそのように回答してください。初心者なものでよろしくお願いします。 ・1~100までの整数値を画面に表示せよ. ただし,数値を10個表示するごとに改行すること. #include<stdio.h> int main(void){ int i,j; for(i=1;i<=100;i++){    for(j=1;j<=9;j++) printf("%3d",i+j); i=i+9; putchar("\n"); } return(0); }

  • 【C言語を教えてください!】2次元配列について

    【C言語を教えてください!】2次元配列について 2次元配列を用いて、コンソール画面(ターミナル)の中央付近に*を表示させるプログラムを作りたいのですがさっぱり分かりません。 画面の大きさは半角で横80 縦25です。 25は奇数ですので40×12に表示したいと思います。 2重ループでなら出来たのですが配列でのやり方がわかりません。 #include<stdio.h> main() { int i,j; for(i=0;i<25;i++){ for(j=0;j<80;j++){ if(i==12&j==39){ putchar('*'); }else{ putchar(' '); } } } return 0; } 回答お願いします!

専門家に質問してみよう