我正在编写一个代码来读取文件并将数字存储在一个数组中。代码本身正在工作,但数字没有正确存储在数组中,因此,我没有得到所需的输出。这是我的代码:
/* code to solve a nxn system using the Gauss-Seidel method */
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <malloc.h>
#define MAX_DIM 100
#define MAX_ITER 500
#define TOLERANCE 1.e-6
void gauss_seidel(double **a, double b[], double x[], int n);
void main()
{
int i, j, n;
int violation_counter, answer;
double sum;
/* read in data */
n = MAX_DIM + 1;
FILE *inf, *onf;
char fileName[256];
printf("Enter file Name: ");
scanf("%s", fileName);
inf = fopen(fileName, "r");
if(inf != NULL){
while (n > MAX_DIM) {
fscanf(inf, "%d", &n);
}
int *violation_rows = (int *)malloc(sizeof(int) * n);
double **a = (double **)malloc(sizeof(double *) * n);
double *b = (double *)malloc(sizeof(double) * n);
double *x = (double *)malloc(sizeof(double) * n);
for(i = 0; i < n; ++i){
a[i] = (double *)malloc(sizeof(double) * n);
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
fscanf(inf, "%lf", &a[i][j], sizeof(a[i][j]));
printf("%.2lf ", a[i][j]);
}
fscanf(inf, "%lf", &b[i], sizeof(b[i]));
printf("-> %.2lf\n", b[i]);
}
printf("\n");
/* test the convergence criterion */
violation_counter = 0;
for (i = 0; i < n; i++) {
sum = 0.0;
for (j = 0; j < n; j++)
if (i != j)
sum = sum + fabs(a[i][j]);
if (fabs(a[i][i]) < sum) {
violation_rows[violation_counter] = i;
violation_counter = violation_counter + 1;
}
if (a[i][i] == 0.0) {
printf("Found diagonal element equal to zero; rearrange equations; exiting ...\n");
exit(0);
}
}
if (violation_counter > 0) {
printf("The Gauss-Seidel convergence criterion is violated in %d rows out of %d\n", violation_counter, n);
printf("Specifically, it was violated in rows:\n");
for (i = 0; i < violation_counter; i++)
printf("%d ", violation_rows[i]);
printf("\n");
printf("Enter 1 if you want to continue; any other number to abort : ");
scanf("%d", &answer);
if (answer != 1)
exit(1);
printf("Check results carefully\n\n");
}
/* initialize the solution vector -- initial guesses */
for (i = 0; i < n; i++) {
fscanf(inf, "%lf", &x[i], sizeof(x[i]));
printf("x[%d] = %.2lf\n", i, x[i]);
}
fclose(inf);
/* solve the system */
gauss_seidel(a, b, x, n);
/* output solution */
printf("Enter file Name: ");
scanf("%s", fileName);
onf = fopen(fileName, "w");
for (i = 0; i < n; i++)
fprintf(onf, "x[%d]=%f\n", i, x[i]);
fprintf(onf, "\n");
fclose(onf);
}
else{
printf("Can not open %s to read\n", fileName);
}
return;
}
代码的输出不能正确存储数字。例如,我的文本文件如下:
4
2 -1 0 0
-1 3 -2 0
0 -2 5 -3
0 0 -3 3
1
1.5
2.5
1.5
0
0
0
0
我得到的结果是
2 -1 0 0 -> -1
3 -2 0 0 -> -2
5 -3 0 0 -> -3
3 1 1.5 2.5 -> 1.5
以及对角线会聚误差。是什么导致文件无法正确存储?
编辑:4x4行之后的数字(第三个块中的四个:1,1.5,2.5,1.5)应该位于箭头的另一侧。
答案 0 :(得分:2)
您阅读数据的方式与您的输入文件不匹配。该文件看起来像
n
a11 a12 a13
a21 a22 a23
a31 a32 a33
b1
b2
b3
但你读它好像是
n
a11 a12 a13 b1
a21 a22 a23 b2
a31 a32 a33 b3
因此,您应该在单独的向量中阅读b
向量。我还建议你先阅读所有内容,然后在读完所有内容后单独打印出来:
// Scan first ...
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
fscanf(inf, "%lf", &a[i][j]);
}
}
for (i = 0; i < n; i++) {
fscanf(inf, "%lf", &b[i]);
}
for (i = 0; i < n; i++) {
fscanf(inf, "%lf", &x[i]);
}
// ... then print
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("%.2lf ", a[i][j]);
}
printf("-> %.2lf\n", b[i]);
}
printf("\n");
for (i = 0; i < n; i++) {
printf("x[%d] = %.2lf\n", i, x[i]);
}
printf("\n");
答案 1 :(得分:0)
我很抱歉写这个作为答案,而不是评论(还没有声誉),但我认为当你
if (!$error) {
$_SESSION['fistName'] = $firstName;
指向二维数组的指针可能有问题。 (我也会尝试在这里省略sizeof()。)
这篇文章讨论了指向二维数组的指针:
一切都很好!