ここから本文です

C言語のプログラミングについてです。 行列の積のプログラムを作ったのですが、2...

alo********さん

2019/11/1215:16:35

C言語のプログラミングについてです。
行列の積のプログラムを作ったのですが、2行目の答えが正しく計算されません。

(2行3列の行列Aと、3行2列の行列Bの積を行列Cとして求めるものです)
どこが間違っているのでしょうか?
以下が作成したプログラムです。


#include<stdio.h>
main()
{
int i,j,k,a[2][3],b[3][2],c[2][2];

printf("行列Aの入力\n");
for(i=1;i<=2;i++)
{
for(j=1;j<=3;j++)
{
printf("a[%d][%d]=",i,j);
scanf("%d",&a[i][j]);
}
}
printf("行列Bの入力\n");
for(j=1;j<=3;j++)
{
for(k=1;k<=2;k++)
{
printf("b[%d][%d]=",j,k);
scanf("%d",&b[j][k]);
}
}

for(i=1;i<=2;i=i+1)
{
for(k=1;k<=2;k=k+1)
{
c[i][k]=0;
for(j=1;j<=3;j=j+1)
{
c[i][k]=c[i][k]+a[i][j]*b[j][k];
}
}
}
printf("行列の積\n");
for(i=1;i<=2;i++)
{
for(k=1;k<=2;k++)
{
printf("%3d ",c[i][k]);
}
printf("\n");
}
}

閲覧数:
67
回答数:
2
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

2019/11/1216:16:01

C言語の配列は、0 から始まりサイズ -1 までです。
例えば、
a[2][3]
と宣言すると、
a[0][0] ~a[1][2] の範囲になります。
ですから、
i j k を 1 少なくして、表示を +1 するか、(for(i=0;i<2;i++)なんて感じ)
もしくは、
配列を使うときに -1 にする必要があります。
c[i-1][k-1]=c[i-1][k-1]+a[i-1][j-1]*b[j-1][k-1];
こんな感じ。
これを間違えると、
エラーになる場合もありますが、
変なメモリーを読み書きしたりします。

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜1件/1件中

2019/11/1719:48:58

C言語の配列の添え字は0から始まります。
int a[2][3]; の宣言では
配列aのサイズは2*3=6個です。
アクセスするときはは
a[0][0], a[0][1], a[0][2]
a[1][0], a[1][1], a[1][2]
とします。

行列の入力が煩わしいので変えました。
元のはコメント内にあります。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
    int i, j, k, a[2][3], b[3][2], c[2][2];

    printf("数値をスペースで区切って入力してください\n");
    printf("行列Aの入力\n");
    for (i = 0; i < 2; i++) {
        printf("a[%d][1]...a[%d][3]=", i+1, i+1);
        for (j = 0; j < 3; j++) {
            scanf("%d", &a[i][j]);
        }
    }
    printf("行列Bの入力\n");
    for (j = 0; j < 3; j++) {
        printf("a[%d][1]...a[%d][2]=", j+1, j+1);
        for (k = 0; k < 2; k++) {
            scanf("%d", &b[j][k]);
        }
    }
/*
    printf("行列Aの入力\n");
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 3; j++) {
            printf("a[%d][%d]=", i+1, j+1);
            scanf("%d", &a[i][j]);
        }
    }
    printf("行列Bの入力\n");
    for (j = 0; j < 3; j++) {
        for (k = 0; k < 2; k++) {
            printf("b[%d][%d]=", j+1, k+1);
            scanf("%d", &b[j][k]);
        }
    }
*/
    for (i = 0; i < 2; i++) {
        for (k = 0; k < 2; k++) {
            c[i][k] = 0;
            for (j = 0; j < 3; j++) {
                c[i][k] += a[i][j] * b[j][k];
            }
        }
    }
    printf("行列の積\n");
    for (i = 0; i < 2; i++) {
        for (k = 0; k < 2; k++) {
            printf("%3d ", c[i][k]);
        }
        printf("\n");
    }
}

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる