C言語のポインタの課題で任意の行列の積を求めるプログラムを作っているのですが、計算が合っていなかったり、コアダンプになったりしてしまいます。 どこが変か教えていただきたいです。
C言語のポインタの課題で任意の行列の積を求めるプログラムを作っているのですが、計算が合っていなかったり、コアダンプになったりしてしまいます。 どこが変か教えていただきたいです。 #include <stdio.h> #include <stdlib.h> int main (void) { int nrow1; // 1つ目の行の数 int ncolm1; // 1つ目の列の数 int nrow2; //2つ目の行の数 int ncolm2; //2つ目の列の数 double **a, **b, **z; // 行列A, B, Z int i, j; printf("1つ目の行の数を入力してください: "); scanf("%d",&nrow1); printf("1つ目の列の数と2つ目の行の数を入力してください: "); scanf("%d",&ncolm1); nrow2=ncolm1; printf("2つ目の列の数を入力してください: "); scanf("%d",&ncolm2); // 行列A // 行の確保:ポインタ配列 a = (double **)malloc(nrow1 * sizeof(double *)); // 列の確保 for (j = 0; j < nrow1; j++) { a[j] = (double *)malloc(ncolm1 * sizeof(double)); } // 行列B // 行の確保:ポインタ配列 b = (double **)malloc(nrow2 * sizeof(double *)); // 列の確保 for (j = 0; j < nrow2; j++) { b[j] = (double *)malloc(ncolm2 * sizeof(double)); } // 行列Z // 行の確保:ポインタ配列 z = (double **)malloc(nrow1 * sizeof(double *)); // 列の確保 for (j = 0; j < nrow2; j++) { z[j] = (double *)malloc(ncolm2 * sizeof(double)); } // 入力 printf("行列Aを入力してください\n"); for (j = 0; j < nrow1; j++) { for (i = 0; i < ncolm1; i++) { printf("a[%d][%d] = ", j, i); scanf("%lf", &a[j][i]); } } printf("行列Bを入力してください\n"); for (j = 0; j < nrow2; j++) { for (i = 0; i < ncolm2; i++) { printf("b[%d][%d] = ", j, i); scanf("%lf", &b[j][i]); } } //行列の積 double x=0.0; for (j = 0; j < nrow1; j++) { for (i = 0; i < ncolm2; i++) { x=0.0; for(int k=0;k<nrow1;k++){ x += a[j][k] * b[k][i] ; } z[j][i]=x; } } // 出力 printf("A × B = \n"); for (j = 0; j < nrow1; j++) { for (i = 0; i < ncolm2; i++) { printf("%5.2f ", z[j][i]); } printf("\n"); } // 領域の解放 for (j = 0; j < ncolm1; j++) { free(a[j]); } free(a); for (j = 0; j < ncolm2; j++) { free(b[j]); } free(b); for (j = 0; j < ncolm2; j++) { free(z[j]); } free(z); return 0; }
月曜に同じ動作環境で試してからベストアンサー決定したいと思います
ベストアンサー
#include <stdio.h> #include <stdlib.h> int main(void) { int r1; // 1つ目の行の数 int c1; // 1つ目の列の数 int r2; // 2つ目の行の数 int c2; // 2つ目の列の数 double **a, **b, **z; // 行列A, B, Z int i, j; printf("1つ目の行の数を入力してください: "); scanf("%d", &r1); printf("1つ目の列の数と2つ目の行の数を入力してください: "); scanf("%d", &c1); r2 = c1; printf("2つ目の列の数を入力してください: "); scanf("%d", &c2); // 行列A // 行の確保:ポインタ配列 a = (double **)malloc(r1 * sizeof(double *)); // 列の確保 for (i = 0; i < r1; i++) { a[i] = (double *)malloc(c1 * sizeof(double)); } // 行列B // 行の確保:ポインタ配列 b = (double **)malloc(r2 * sizeof(double *)); // 列の確保 for (i = 0; i < r2; i++) { b[i] = (double *)malloc(c2 * sizeof(double)); } // 行列Z // 行の確保:ポインタ配列 z = (double **)malloc(r1 * sizeof(double *)); // 列の確保 for (i = 0; i < r1; i++) { z[i] = (double *)malloc(c2 * sizeof(double)); } // 入力 printf("行列Aを入力してください\n"); for (i = 0; i < r1; i++) { for (j = 0; j < c1; j++) { printf("a[%d][%d] = ", i, j); scanf("%lf", &a[i][j]); } } printf("行列Bを入力してください\n"); for (i = 0; i < r2; i++) { for (j = 0; j < c2; j++) { printf("b[%d][%d] = ", i, j); scanf("%lf", &b[i][j]); } } //行列の積 double x = 0.0; for (i = 0; i < r1; i++) { for (j = 0; j < c2; j++) { z[i][j] = 0.0; for (int k = 0; k < r2; k++) { z[i][j] += a[i][k] * b[k][j]; } } } // 出力 printf("A × B = \n"); for (i = 0; i < r1; i++) { for (j = 0; j < c2; j++) { printf("%5.2f ", z[i][j]); } printf("\n"); } // 領域の解放 for (i = 0; i < c1; i++) { free(a[i]); } free(a); for (i = 0; i < c2; i++) { free(b[i]); } free(b); for (i = 0; i < c2; i++) { free(z[i]); } free(z); return 0; }
1人がナイス!しています
質問者からのお礼コメント
ありがとうございました。助かりました。
お礼日時:5/16 14:56