電子書籍の厳選無料作品が豊富!

これが私のプログラムです。

##############################################
#include<stdio.h>

int main(void)
{
int i, j, k, c;
int matrix1[4][3];  /*4かけ3行列*/
int matrix2[3][4];   /*3かけ4行列*/
int matrix[4][4]; /* matrix1とmatrix2の掛け算*/

puts("4掛け3行列の入力:");
for(i=0; i<4; i++) {
for(j=0; j<3; j++) {
printf("matrix1[%d][%d]=", i+1, j+1);
scanf("%d", &matrix1[i][j]);
}
putchar('\n');
}

putchar('\n');
puts("3掛け4行列の入力:");
for(i=0; i<3; i++) {
for(j=0; j<4; j++) {
printf("matrix2[%d][%d]=", i+1, j+1);
scanf("%d", &matrix1[i][j]);
}
putchar('\n');
}


putchar('\n');
puts("行列の積:");
for(i=0; i<4; i++) {
for(j=0; j<4; j++) {
c = 0;
for(k=0; k<3; k++)
c = c + matrix1[i][k]*matrix2[k][j];
c = matrix[i][j];
printf("%4d", matrix[i][j]);
}
putchar('\n');
}

putchar('\n');
puts("4掛け4行列の計算結果:");
for(i=0; i<5; i++) {
for(j=0; j<5; j++)
printf("%4d", matrix[i][j]);
putchar('\n');
}




return 0;
}
##############################################



これを実行すると、
##############################################
4掛け3行列の入力:
matrix1[1][1]=1
matrix1[1][2]=1
matrix1[1][3]=1

matrix1[2][1]=1
matrix1[2][2]=1
matrix1[2][3]=1

matrix1[3][1]=1
matrix1[3][2]=1
matrix1[3][3]=1

matrix1[4][1]=1
matrix1[4][2]=1
matrix1[4][3]=1


3掛け4行列の入力:
matrix2[1][1]=1
matrix2[1][2]=1
matrix2[1][3]=1
matrix2[1][4]=1

matrix2[2][1]=1
matrix2[2][2]=11
matrix2[2][3]=1
matrix2[2][4]=1

matrix2[3][1]=1
matrix2[3][2]=1
matrix2[3][3]=1
matrix2[3][4]=1


行列の積:
1835627636160006154118698333341952802655
1 04196909 0
0 0 0 0
4196832 04195728 0

4掛け4行列の計算結果:
1835627636160006154118698333341952802655 1
1 04196909 0 0
0 0 0 04196832
4196832 04195728 01673351312
1673351312327656176885764550097164196832
##############################################

となってしまいます。どのように改善すればようでしょうか?

A 回答 (4件)

以下のようにしてください。

修正個所は//修正のコメントをいれてます。
-------------------------------
#include<stdio.h>

int main(void)
{
int i, j, k, c;
int matrix1[4][3]; /*4かけ3行列*/
int matrix2[3][4]; /*3かけ4行列*/
int matrix[4][4]; /* matrix1とmatrix2の掛け算*/

puts("4掛け3行列の入力:");
for(i=0; i<4; i++) {
for(j=0; j<3; j++) {
printf("matrix1[%d][%d]=", i+1, j+1);
scanf("%d", &matrix1[i][j]);
}
putchar('\n');
}

putchar('\n');
puts("3掛け4行列の入力:");
for(i=0; i<3; i++) {
for(j=0; j<4; j++) {
printf("matrix2[%d][%d]=", i+1, j+1);
scanf("%d", &matrix2[i][j]); //修正matrix1->matrix2
}
putchar('\n');
}


putchar('\n');
puts("行列の積:");
for(i=0; i<4; i++) {
for(j=0; j<4; j++) {
c = 0;
for(k=0; k<3; k++)
c = c + matrix1[i][k]*matrix2[k][j];
matrix[i][j]=c; //修正 右辺と左辺を交換
printf("%4d", matrix[i][j]);
}
putchar('\n');
}

putchar('\n');
puts("4掛け4行列の計算結果:");
for(i=0; i<4; i++) { //修正 5->4
for(j=0; j<4; j++) //修正 5->4
printf("%4d", matrix[i][j]);
putchar('\n');
}

return 0;
}
--------------------------------------
以下、実行結果です。
ケース1
4掛け3行列の入力:
matrix1[1][1]=1
matrix1[1][2]=1
matrix1[1][3]=1

matrix1[2][1]=1
matrix1[2][2]=1
matrix1[2][3]=1

matrix1[3][1]=1
matrix1[3][2]=1
matrix1[3][3]=1

matrix1[4][1]=1
matrix1[4][2]=1
matrix1[4][3]=1


3掛け4行列の入力:
matrix2[1][1]=1
matrix2[1][2]=1
matrix2[1][3]=1
matrix2[1][4]=1

matrix2[2][1]=1
matrix2[2][2]=1
matrix2[2][3]=1
matrix2[2][4]=1

matrix2[3][1]=1
matrix2[3][2]=1
matrix2[3][3]=1
matrix2[3][4]=1


行列の積:
3 3 3 3
3 3 3 3
3 3 3 3
3 3 3 3

4掛け4行列の計算結果:
3 3 3 3
3 3 3 3
3 3 3 3
3 3 3 3

ケース2
4掛け3行列の入力:
matrix1[1][1]=1
matrix1[1][2]=2
matrix1[1][3]=3

matrix1[2][1]=4
matrix1[2][2]=5
matrix1[2][3]=6

matrix1[3][1]=7
matrix1[3][2]=8
matrix1[3][3]=9

matrix1[4][1]=10
matrix1[4][2]=11
matrix1[4][3]=12


3掛け4行列の入力:
matrix2[1][1]=13
matrix2[1][2]=14
matrix2[1][3]=15
matrix2[1][4]=16

matrix2[2][1]=17
matrix2[2][2]=18
matrix2[2][3]=19
matrix2[2][4]=20

matrix2[3][1]=21
matrix2[3][2]=22
matrix2[3][3]=23
matrix2[3][4]=24


行列の積:
110 116 122 128
263 278 293 308
416 440 464 488
569 602 635 668

4掛け4行列の計算結果:
110 116 122 128
263 278 293 308
416 440 464 488
569 602 635 668
    • good
    • 0
この回答へのお礼

ありがとうございます

お礼日時:2016/11/14 18:01

>for(i=0; i<3; i++) {


>for(j=0; j<4; j++) {
>printf("matrix2[%d][%d]=", i+1, j+1);
>scanf("%d", &matrix1[i][j]);
>}

多分コピペミスでしょうがscanf()で受け取る配列違いませんか?
そんな訳でmatrix2[][]は未初期化なんじやないですかね?

本来なら想定みしてない妙な値が出ていることからも。
# あとツッコミありますがループ回数がおかしくてバッファオーバーランとか。
    • good
    • 0

あそうだ, 最後の 2重 forループは範囲が変.

    • good
    • 0

c = matrix[i][j];


ってなにしたいの?
    • good
    • 0

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