diff --git a/gauss.c b/gauss.c new file mode 100644 --- /dev/null +++ b/gauss.c @@ -0,0 +1,150 @@ +/** + * $Id: gauss.c,v 1.1.1.1 2008-04-28 17:32:53 mbroeker Exp $ + * $Source: /development/c/gauss/gauss.c,v $ + * + */ + +#define VERSION 0.8 + +#ifndef VERBOSE +#define VERBOSE 1 +#endif +#ifndef ZEROASSUMPTION +#define ZEROASSUMPTION 1E-3 /* 0.001 = 0.0 */ +#endif + +#include +#include + +void ausgabe (float **A, int MAXX, int MAXY) +{ + int n, k; + + for (k = 0; k < MAXY; k++) { + for (n = 0; n < MAXX - 1; n++) { + if ((A[k][n] < ZEROASSUMPTION) && (A[k][n] > -ZEROASSUMPTION)) + A[k][n] = 0.0; + printf ("%8.2f ", A[k][n]); + } + printf ("=%8.2f\n", A[k][n]); + } +} + +void gauss (float **A, int MAXX, int MAXY) +{ + int i, j, k, n; + float h; + + i = 0; + for (j = 0; j < MAXY; j++) { + for (k = j + 1; k < MAXY; k++) { + if (A[k][i] != 0) + h = A[j][i] / A[k][i]; + else + continue; + + for (n = 0; n < MAXX; n++) { + A[k][n] *= -h; + A[k][n] += A[j][n]; + } + } + i++; + } + +#ifdef PUPILS + printf ("\n"); + ausgabe (A, MAXX, MAXY); + printf ("\n"); +#endif + + i--; /* i = (MAXX-1)-1; */ + + for (j = MAXY - 1; j > -1; j--) { + for (k = j - 1; k > -1; k--) { + h = A[j][i] / A[k][i]; + for (n = MAXX - 1; n > k - 1; n--) { + A[k][n] *= -h; + A[k][n] += (A[j][n]); + if (A[j][i] == 0.0) { + printf ("Divison by Zero\n"); + exit (-1); + } + A[j][n] /= (A[j][i]); + } + } + i--; + } + + if ((h = A[0][0]) == 0.0) { + printf ("Division by Zero\n"); + exit (-1); + } + /*h=A[0][0];*/ + A[0][0] /= h; + A[0][MAXX - 1] /= h; +} + +int main (int argc, char **argv) +{ + int i, k; + int MAXX, MAXY; + float value; + + float **A; + + if (argc != 2) { + printf ("Benutzung: %s UNBEKANNTE\n", argv[0]); + printf ("Berechnet ein lineares Gleichungssystem mit n UNBEKANNTEN und n Zeilen ( nxn ).\n"); + printf ("Praktische Beispiele stehen in der README Datei.\n"); + return EXIT_SUCCESS; + } + + MAXY = atoi (argv[1]); + MAXX = MAXY + 1; + + if ((A = calloc (MAXY, sizeof (float *))) == NULL) { + printf ("Nicht genug Speicher verfuegbar\n"); + return EXIT_SUCCESS; + } + + for (i = 0; i < MAXY; i++) { + if ((A[i] = calloc (MAXX, sizeof (float))) == NULL) { + printf ("Nicht genug Speicher verfuegbar\n"); + for (k = 0; k < i; k++) + free (A[k]); + free (A); + + return EXIT_SUCCESS; + } + } + + for (k = 0; k < MAXY; k++) { + printf ("Spalte %d: ", k); + for (i = 0; i < MAXX; i++) { + if (scanf ("%f", &value) < 1) { + printf ("READ ERROR\n"); + return EXIT_FAILURE; + } + A[k][i] = value; + } + } + + if (VERBOSE) { + printf ("\n"); + ausgabe (A, MAXX, MAXY); + } + + gauss (A, MAXX, MAXY); + + printf ("\nLoesung des GL-Systems( %d x %d )\n\n", MAXX - 1, MAXY); + for (i = 0; i < MAXY; i++) + printf ("a[%2d] = %8.2f\n", i, A[i][MAXX - 1]); + + for (i = 0; i < MAXY; i++) + if (A[i] != NULL) + free (A[i]); + if (A != NULL) + free (A); + + return EXIT_SUCCESS; +}