I'm working on a code to read in a file and store the numbers in an array. The code itself is working, but the numbers are not being stored in the array properly and as such, I'm not getting the desired output. Here is my code:
/* 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;
}
The output of the code isn't storing the numbers properly. For example, my text file is as follows:
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
And the result I'm getting is
2 -1 0 0 -> -1
3 -2 0 0 -> -2
5 -3 0 0 -> -3
3 1 1.5 2.5 -> 1.5
As well as a diagonal convergence error. What's causing the file to not be stored properly?
EDIT: The numbers after the row of 4x4 (the four in the third block: 1, 1.5, 2.5, 1.5) are supposed to be on the other side of the arrow.