質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

2144閲覧

2つの行列の積を計算するプログラム(C言語、使用コンパイラはgcc)

suugaku_nyumon

総合スコア37

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/05/16 09:20

組もうとしているプログラムのコード

同じ次数の正方行列同士の掛け算をするプログラムを組もうとしています。

まずは掛けようとしているA、Bの2つの行列の成分をscanfで取得した後、
その取得した値を用いて掛け算をした後の行列の成分を計算して、
その後掛ける前の2つの行列と、掛け算の結果を表示させるプログラムです。

コード

C

1#include<stdio.h> 2 3int jisu; 4 5int mult(int a[][jisu],int b[][jisu]); 6void disp(int a[][jisu],int b[][jisu],int c[][jisu]); 7 8int main(void) 9{ 10 do 11 { 12 printf("Enter the dimension.\n"); 13 scanf("%d",&jisu); 14 } while(jisu < 2 || jisu > 5); 15 16 int a[jisu][jisu]; 17 int b[jisu][jisu]; 18 int c[jisu][jisu]; 19 printf("\ndefine matrix A."); 20 for(int m=0;m<jisu;m++) 21 { 22 for(int n=0;n<jisu;n++) 23 { 24 printf("\nEnter a[%d][%d]\n",m,n); 25 scanf("%d", &a[m][n]); 26 } 27 } 28 29 printf("\ndefine matrix B."); 30 for(int m=0;m<jisu;m++) 31 { 32 for(int n=0;n<jisu;n++) 33 { 34 printf("\nEnter b[%d][%d]\n",m,n); 35 scanf("%d", &b[m][n]); 36 } 37 } 38 39 c[jisu][jisu] = mult(a,b); 40 disp(a,b,c); 41} 42 43int mult(int a[][jisu],int b[][jisu]) 44{ 45 int c[jisu][jisu]; 46 for(int i=0;i<jisu;i++) 47 { 48 for(int j=0;j<jisu;j++) 49 { 50 c[i][j] = 0; 51 } 52 } 53 54 for(int i=0;i<jisu;i++) 55 { 56 for(int j=0;j<jisu;j++) 57 { 58 for(int n=0;n<jisu;n++) 59 { 60 c[i][j] += a[n][j] * b[i][n]; 61 } 62 } 63 } 64 65 return c[jisu][jisu]; 66} 67 68void disp(int a[][jisu],int b[][jisu],int c[][jisu]) 69{ 70 printf("matrix A\n"); 71 for(int i=0;i<jisu;i++) 72 { 73 printf("|"); 74 for(int j=0;j<jisu;j++) 75 { 76 printf("%6d",a[i][j]); 77 } 78 printf(" |\n"); 79 } 80 81 printf("matrix B\n"); 82 for(int i=0;i<jisu;i++) 83 { 84 printf("|"); 85 for(int j=0;j<jisu;j++) 86 { 87 printf("%6d",b[i][j]); 88 } 89 printf(" |\n"); 90 } 91 printf("multiply A by B\n"); 92 for(int i=0;i<jisu;i++) 93 { 94 printf("|"); 95 for(int j=0;j<jisu;j++) 96 { 97 printf("%6d",c[i][j]); 98 } 99 printf(" |\n"); 100 } 101}

入力

Enter the dimension. 3 define matrix A. Enter a[0][0] 1 Enter a[0][1] 0 Enter a[0][2] 0 Enter a[1][0] 0 Enter a[1][1] 1 Enter a[1][2] 0 Enter a[2][0] 0 Enter a[2][1] 0 Enter a[2][2] 1 define matrix B. Enter b[0][0] 0 Enter b[0][1] 1 Enter b[0][2] 2 Enter b[1][0] 4 Enter b[1][1] 5 Enter b[1][2] 6 Enter b[2][0] 3 Enter b[2][1] 2 Enter b[2][2] 3

結果

matrix A | 1 0 0 | | 0 1 0 | | 0 0 1 | matrix B |1978483764 1 2 | | 4 5 6 | | 3 2 3 | multiply A by B | 0 01978484256 | |642205219781671891978483764 | | 48 04200016 |

質問内容

行列Aの方はしっかり入力した通りに表示されるのですが、行列Bが(1,1)成分(b[0][0]にあたる値)が思うように出力されず、
掛け算の結果に関してはもはや意味が分かりません。

コードのどこがおかしいのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

c[jisu][jisu] = mult(a,b);

コレは意味不明です
だいたい、
c[jisu][jisu]
は範囲外となるんでアクセス違反となります

投稿2021/05/16 09:30

y_waiwai

総合スコア87800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suugaku_nyumon

2021/05/18 04:17

c[jisu][jisu]は変でした。ご回答ありがとうございます。
guest

0

multは配列を返したいのでしょうが、整数c[jisu][jisu]を返していますね。
c[jisu][jisu]cの範囲外になるので、それも誤りですが)
そしてcのスコープはmult内になりますので、multから帰った時点でcにはアクセスできません。
提案ですが、multには結果を返したい配列も引数で渡して、そこに計算結果を格納して帰るようにしてはどうでしょう。

投稿2021/05/16 09:26

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2021/05/16 09:36

> (c[jisu][jisu]はcの範囲外になるので、それも誤りですが) これで、 bの配列を壊しているのでしょうか。 気づかなかった。
suugaku_nyumon

2021/05/18 04:17

c[jisu][jisu]が変でした。そのおかしなコードのせいでbまで影響が出ていたのですね。 ご回答ありがとうございます。
guest

0

自己解決

お礼

ご回答ありがとうございます。確かにc[jisu][jisu]は変でした。

説明

returnを使って配列は返せないのですね。実は関数の項目を勉強していまして、それで配列を返して具体的にコードを組んでみようとしたのですが、ポインタを使うことでうまくいきました。malloc関数を使えば一般化はできそうですし、構造体(?)という手段もあると調べてみたサイトで書かれていましたが、またポインタや構造体を勉強する際に一般化にリベンジしようと思います。

修正後のコード

C

1#include<stdio.h> 2 3int jisu; 4 5int (*mult2(int a[][2],int b[][2]))[2]; 6int (*mult3(int a[][3],int b[][3]))[3]; 7int (*mult4(int a[][4],int b[][4]))[4]; 8int (*mult5(int a[][5],int b[][5]))[5]; 9void disp(int a[][jisu],int b[][jisu],int c[][jisu]); 10 11int main(void) 12{ 13 do 14 { 15 printf("Enter the dimension.\n"); 16 scanf("%d",&jisu); 17 } while(jisu < 2 || jisu > 5); 18 19 int a[jisu][jisu]; 20 int b[jisu][jisu]; 21 22 printf("\ndefine matrix A."); 23 for(int m=0;m<jisu;m++) 24 { 25 for(int n=0;n<jisu;n++) 26 { 27 printf("\nEnter a[%d][%d]\n",m,n); 28 scanf("%d", &a[m][n]); 29 } 30 } 31 32 printf("\ndefine matrix B."); 33 for(int m=0;m<jisu;m++) 34 { 35 for(int n=0;n<jisu;n++) 36 { 37 printf("\nEnter b[%d][%d]\n",m,n); 38 scanf("%d", &b[m][n]); 39 } 40 } 41 if(jisu == 2) 42 { 43 int (*c)[2] = mult2(a,b); 44 disp(a,b,c); 45 } 46 else if(jisu == 3) 47 { 48 int (*c)[3] = mult3(a,b); 49 disp(a,b,c); 50 } 51 else if(jisu == 4) 52 { 53 int (*c)[4] = mult4(a,b); 54 disp(a,b,c); 55 } 56 else if(jisu == 5) 57 { 58 int (*c)[5] = mult5(a,b); 59 } 60 else 61 { 62 printf("Error.\n"); 63 } 64} 65 66int (*mult2(int a[][2],int b[][2]))[2] 67{ 68 static int d[2][2]; 69 for(int i=0;i<2;i++) 70 { 71 for(int j=0;j<2;j++) 72 { 73 d[i][j] = 0; 74 } 75 } 76 77 for(int i=0;i<2;i++) 78 { 79 for(int j=0;j<2;j++) 80 { 81 for(int n=0;n<2;n++) 82 { 83 d[i][j] += a[i][n] * b[n][j]; 84 } 85 } 86 } 87 88 return d; 89} 90 91int (*mult3(int a[][3],int b[][3]))[3] 92{ 93 static int d[3][3]; 94 for(int i=0;i<3;i++) 95 { 96 for(int j=0;j<3;j++) 97 { 98 d[i][j] = 0; 99 } 100 } 101 102 for(int i=0;i<3;i++) 103 { 104 for(int j=0;j<3;j++) 105 { 106 for(int n=0;n<3;n++) 107 { 108 d[i][j] += a[i][n] * b[n][j]; 109 } 110 } 111 } 112 113 return d; 114} 115 116int (*mult4(int a[][4],int b[][4]))[4] 117{ 118 static int d[4][4]; 119 for(int i=0;i<4;i++) 120 { 121 for(int j=0;j<4;j++) 122 { 123 d[i][j] = 0; 124 } 125 } 126 127 for(int i=0;i<4;i++) 128 { 129 for(int j=0;j<4;j++) 130 { 131 for(int n=0;n<4;n++) 132 { 133 d[i][j] += a[i][n] * b[n][j]; 134 } 135 } 136 } 137 138 return d; 139} 140 141int (*mult5(int a[][5],int b[][5]))[5] 142{ 143 static int d[5][5]; 144 for(int i=0;i<5;i++) 145 { 146 for(int j=0;j<5;j++) 147 { 148 d[i][j] = 0; 149 } 150 } 151 152 for(int i=0;i<5;i++) 153 { 154 for(int j=0;j<5;j++) 155 { 156 for(int n=0;n<5;n++) 157 { 158 d[i][j] += a[i][n] * b[n][j]; 159 } 160 } 161 } 162 163 return d; 164} 165 166void disp(int a[][jisu],int b[][jisu],int c[][jisu]) 167{ 168 printf("matrix A\n"); 169 for(int i=0;i<jisu;i++) 170 { 171 printf("|"); 172 for(int j=0;j<jisu;j++) 173 { 174 printf("%6d",a[i][j]); 175 } 176 printf(" |\n"); 177 } 178 179 printf("matrix B\n"); 180 for(int i=0;i<jisu;i++) 181 { 182 printf("|"); 183 for(int j=0;j<jisu;j++) 184 { 185 printf("%6d",b[i][j]); 186 } 187 printf(" |\n"); 188 } 189 printf("multiply A by B\n"); 190 for(int i=0;i<jisu;i++) 191 { 192 printf("|"); 193 for(int j=0;j<jisu;j++) 194 { 195 printf("%6d",c[i][j]); 196 } 197 printf(" |\n"); 198 } 199}

説明(5月18日14時30分追記)

ポインタを使わないといけないと書きましたが、そんなことありませんでした。
1要素ずつ計算する関数を作れば良いだけでした。

参考(追記についてのコード)

C

1#include<stdio.h> 2 3int jisu; 4 5int multij(int fir[][jisu],int sec[][jisu],int i,int j); 6void disp(int a[][jisu],int b[][jisu],int c[][jisu]); 7 8int main(void) 9{ 10 do 11 { 12 printf("Enter the dimension.\n"); 13 scanf("%d",&jisu); 14 } while(jisu < 2 || jisu > 6); 15 16 int a[jisu][jisu]; 17 int b[jisu][jisu]; 18 int c[jisu][jisu]; 19 printf("\ndefine matrix A."); 20 for(int m=0;m<jisu;m++) 21 { 22 for(int n=0;n<jisu;n++) 23 { 24 printf("\nEnter a[%d][%d]\n",m,n); 25 scanf("%d", &a[m][n]); 26 } 27 } 28 29 printf("\ndefine matrix B."); 30 for(int m=0;m<jisu;m++) 31 { 32 for(int n=0;n<jisu;n++) 33 { 34 printf("\nEnter b[%d][%d]\n",m,n); 35 scanf("%d", &b[m][n]); 36 } 37 } 38 39 for(int m=0;m<jisu;m++) 40 { 41 for(int n=0;n<jisu;n++) 42 { 43 c[m][n] = multij(a,b,m,n); 44 } 45 } 46 disp(a,b,c); 47} 48 49int multij(int fir[][jisu],int sec[][jisu],int i,int j) 50{ 51 int valueij = 0; 52 for(int n=0;n<jisu;n++) 53 { 54 valueij += fir[i][n] * sec[n][j]; 55 } 56 57 return valueij; 58} 59 60void disp(int a[][jisu],int b[][jisu],int c[][jisu]) 61{ 62 printf("matrix A\n"); 63 for(int i=0;i<jisu;i++) 64 { 65 printf("|"); 66 for(int j=0;j<jisu;j++) 67 { 68 printf("%6d",a[i][j]); 69 } 70 printf(" |\n"); 71 } 72 73 printf("matrix B\n"); 74 for(int i=0;i<jisu;i++) 75 { 76 printf("|"); 77 for(int j=0;j<jisu;j++) 78 { 79 printf("%6d",b[i][j]); 80 } 81 printf(" |\n"); 82 } 83 printf("multiply A by B\n"); 84 for(int i=0;i<jisu;i++) 85 { 86 printf("|"); 87 for(int j=0;j<jisu;j++) 88 { 89 printf("%6d",c[i][j]); 90 } 91 printf(" |\n"); 92 } 93}

投稿2021/05/18 03:53

編集2021/05/18 05:33
suugaku_nyumon

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問