gauss.c
changeset 3 820ed7fb9314
child 8 96d16dfe787a
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 <stdio.h>
+#include <stdlib.h>
+
+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;
+}