#2
by かずま » 5年前
そのソースは、全角スペースが入っていたり、
{ と } の対応がとれず、コンパイルエラーになります。
質問するときは、コンパイル環境を明記してください。
Visual Studio で VC++ を使っているのなら、
ブレークポイントやステップ実行でデバッグできるでしょう。
Linux で gcc を使っているのなら、gdb や ddd でデバッグできるでしょう。
Eclipse などの統合開発環境(IDE)が使えるかもしれません。
それ以外なら、printf デバッグでしょうか?
コード:
#include <stdio.h>
#define nmax 3
#define DEBUG
#ifdef DEBUG
void print(double a[nmax][nmax+1])
{
int i, j;
for (i = 0; i < nmax; i++, putchar('\n'))
for (j = 0; j <= nmax; j++)
printf("%10.3f", a[i][j]);
puts("---");
}
#endif
void hakidashi(double b[nmax][nmax+1], int jp[nmax])
{
int i, j, k, l, m;
double bx[nmax]; /*各行の最大値 */
for (i = 0; i < nmax; i++) {
bx[i] = 0.0;
for (j = 0; j < nmax; j++) {
if (b[i][j] > bx[i]) {
jp[i] = j;
bx[i] = b[i][j];
} else {
bx[i] = bx[i];
}
} /*i行の最大値bx[i]を求める */
printf("bx[%d] = %.3f\n", i, bx[i]); // DEBUG
for (k = 0; k < nmax+1; k++) {
b[i][k] = b[i][k] / bx[i];
}
for (l = 0; l < nmax; l++) {
if (l != i) {
for (m = 0; m < nmax+1; m++) {
b[l][m] = b[l][m] - b[l][jp[i]] * b[i][m];
}
}
}
print(b); // DEBUG
}
}
void irekae(double c[nmax][nmax+1], int jq[nmax])
{
int n, o;
double temp;
for (n = 0; n < nmax; n++) {
if (c[n][n] != 1.0) {
for (o = 0; o < nmax+1; o++) {
temp = c[n][o];
c[n][o] = c[jq[n]][o];
c[jq[n]][o] = temp;
}
}
} /*単位行列になるように入れ替える */
}
int main(void)
{
FILE *fp;
int i1, j1;
int J[nmax] = { 0 }; /*各行の最大値がある列 */
double a[nmax][nmax+1];
fp = fopen("gyouretsu.txt", "r");
if (!fp) { puts("fopen failed"); return 1; } // 念のため
for (i1 = 0; i1 < nmax; i1++) {
fscanf(fp, "%lf%lf%lf%lf", &a[i1][0], &a[i1][1], &a[i1][2], &a[i1][3]);
} /*行列を読み込む */
hakidashi(a, J);
irekae(a, J);
for (i1 = 0; i1 < nmax; i1++) {
printf("%lf %lf %lf %lf\n", a[i1][0], a[i1][1], a[i1][2], a[i1][3]);
} /*結果を出力 */
fclose(fp);
return 0;
}
分からないところを具体的に質問してもらうと、
詳しい説明ができると思います。
そのソースは、全角スペースが入っていたり、
{ と } の対応がとれず、コンパイルエラーになります。
質問するときは、コンパイル環境を明記してください。
Visual Studio で VC++ を使っているのなら、
ブレークポイントやステップ実行でデバッグできるでしょう。
Linux で gcc を使っているのなら、gdb や ddd でデバッグできるでしょう。
Eclipse などの統合開発環境(IDE)が使えるかもしれません。
それ以外なら、printf デバッグでしょうか?
[code]
#include <stdio.h>
#define nmax 3
#define DEBUG
#ifdef DEBUG
void print(double a[nmax][nmax+1])
{
int i, j;
for (i = 0; i < nmax; i++, putchar('\n'))
for (j = 0; j <= nmax; j++)
printf("%10.3f", a[i][j]);
puts("---");
}
#endif
void hakidashi(double b[nmax][nmax+1], int jp[nmax])
{
int i, j, k, l, m;
double bx[nmax]; /*各行の最大値 */
for (i = 0; i < nmax; i++) {
bx[i] = 0.0;
for (j = 0; j < nmax; j++) {
if (b[i][j] > bx[i]) {
jp[i] = j;
bx[i] = b[i][j];
} else {
bx[i] = bx[i];
}
} /*i行の最大値bx[i]を求める */
printf("bx[%d] = %.3f\n", i, bx[i]); // DEBUG
for (k = 0; k < nmax+1; k++) {
b[i][k] = b[i][k] / bx[i];
}
for (l = 0; l < nmax; l++) {
if (l != i) {
for (m = 0; m < nmax+1; m++) {
b[l][m] = b[l][m] - b[l][jp[i]] * b[i][m];
}
}
}
print(b); // DEBUG
}
}
void irekae(double c[nmax][nmax+1], int jq[nmax])
{
int n, o;
double temp;
for (n = 0; n < nmax; n++) {
if (c[n][n] != 1.0) {
for (o = 0; o < nmax+1; o++) {
temp = c[n][o];
c[n][o] = c[jq[n]][o];
c[jq[n]][o] = temp;
}
}
} /*単位行列になるように入れ替える */
}
int main(void)
{
FILE *fp;
int i1, j1;
int J[nmax] = { 0 }; /*各行の最大値がある列 */
double a[nmax][nmax+1];
fp = fopen("gyouretsu.txt", "r");
if (!fp) { puts("fopen failed"); return 1; } // 念のため
for (i1 = 0; i1 < nmax; i1++) {
fscanf(fp, "%lf%lf%lf%lf", &a[i1][0], &a[i1][1], &a[i1][2], &a[i1][3]);
} /*行列を読み込む */
hakidashi(a, J);
irekae(a, J);
for (i1 = 0; i1 < nmax; i1++) {
printf("%lf %lf %lf %lf\n", a[i1][0], a[i1][1], a[i1][2], a[i1][3]);
} /*結果を出力 */
fclose(fp);
return 0;
}
[/code]
分からないところを具体的に質問してもらうと、
詳しい説明ができると思います。