アプリ版:「スタンプのみでお礼する」機能のリリースについて

「Gauss-Jordan消去法」を使って、プログラムは入力部分、計算部分、出力部分に分けメイン関数から呼び出すようにしするプログラムを作る。以下のプログラムの間違ったところを直して以下だけますか。
#include<stdio.h>
#define N 100
void output(int n, int s, double a[][N], double b[]) {
int i, j;
printf("\n第%2d 消去ステップ\n", s);
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++)
printf(" %8.2f", a[i][j]);
printf(" %8.2f\n", b[i]);
}
}
void data_in(int *n, double *a[N][N], double *b[N]) {
int i, j;
printf("namber of demension(n) = ");
scanf("%d", &n);
for (i = 1; i <= *n; i++) {
for (j = 1; j <= *n; j++) {
printf("a[%d][%d] =", i, j);
scanf("%lf", &a[i][j]);
}
printf("b[%d] =", i);
scanf("%lf", &b[i]);
}
}
void calcution(int n, double a[N][N], double b[N], double *x[N]) {
int i, j, k;
double q, p;
printf("\nGauss-Jordan消去法\n");
printf("input data\n");
for (j = 1; j <= n; j++)
printf(" x%d", j);
printf(" rhs\n");
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++)
printf(" %7.2f", a[i][j]);
printf(" %7.2f\n", b[i]);
}
for (i = 1; i <= n; i++) {
p = a[i][i];
for (j = i; j <= n; j++) a[i][j] = a[i][j] / p;
b[i] = b[i] / p;
for (k = 1; k <= n; k++) {
if (k != i) {
q = a[k][i];
for (j = i; j <= n; j++)
a[k][j] -= q*a[i][j];
b[k] -= q*b[i];
}
}
output(n, i, a, b);
}
*x[N] = b[i];
}
void data_out(int n, double x[N]) {
int i;
printf("\nsolution :\n\n");
for (i = 1; i <= n; i++)
printf(" x[%d] = %8.2f\n", i, x[i]);
}
int main(void) {
int n, s;
double a[N][N], b[N], x[N];
output(n, s, a, b);
data_in(&n, &a, &b);
calcution(n, a, b[N], &x[N]);
data_out(n, &x[N]);
return 0;
}

A 回答 (1件)

そもそも、他人にデバッグやってもらおう、ってのがおかしいんですよね。


コンパイルが失敗したら、コンパイラがエラーの原因を伝えてくれる筈なんですが。

そして、ソースにコメントが無いんで何をやろうとしてるんだかサッパリ分からない。
例えば、main関数内で整数

int n, s

が定義されていますが、一体こいつらが何の為に存在してるのか分からない。
分からないんだけど、いきなりoutput関数の引数として渡されて「実体が無いままに」output関数のステップ数表示に使われたりforループを制御しようとする。一体いつ、nやsの「具体的な数」が与えられたんだろう?

とまぁ、このように、各関数内の「実装目的」とか、各引数の「存在目的」とか、他人が読んでもサッパリ分からんのですよね。一体何がしたいのか。

と言うわけで、少なくとも「コメントを付ける」習慣を付けましょう。
    • good
    • 1

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