home *** CD-ROM | disk | FTP | other *** search
- {$C+,U+} { Turbo Pascal Optionen }
- PROGRAM Gauss;
-
- CONST MAX = 9; { maximale Dimension }
- MAX1 = 10; { .. plus eins }
- TYPE FIELD = ARRAY [0..MAX,0..MAX1] OF REAL;
- { Feld für Matrix }
- F = ARRAY [1..MAX] OF REAL;
- VAR W : FIELD;
- X : F;
- M,C,L : INTEGER;
- DRUCKER : BOOLEAN; { Druckerprotokoll Ja/Nein }
-
- PROCEDURE HALLO;
-
- VAR C : INTEGER;
- CH : CHAR;
-
- BEGIN
- ClrScr;
- GotoXY(23,3); Write('Lineare Gleichungssysteme');
- GotoXY(28,5); Write('Version 1.00');
- FOR C:=20 TO 50 DO BEGIN
- GotoXY(C,1); Write('─');
- GotoXY(C,7); Write('─');
- END;
- FOR C:=1 TO 17 DO BEGIN
- GotoXY(20,C); Write('│');
- GotoXY(50,C); Write('│');
- END;
- GotoXY(23,15); Write('(C) Copyright 1987 by');
- GotoXY(23,16); Write(' Carsten Bräutigam');
- GotoXY(23,17); Write('& PASCAL INTERNATIONAL');
- FOR C:=1 TO 80 DO BEGIN
- GotoXY(C,20); Write('─');
- END;
- GotoXY(76,21); Write('cgb');
- Read(CH);
- END;
-
- PROCEDURE EINGABE
- (VAR W:FIELD; VAR M:INTEGER; VAR DRUCKER:BOOLEAN);
-
- VAR C,D,
- F,
- CODE : INTEGER;
- MM : CHAR;
-
- BEGIN
- ClrScr;
- FOR F := 0 TO M+1 DO W[0,F] := 0;
- GotoXY(2,1) ;
- WriteLn('Lineare Gleichungssysteme ');
- Write(' by Carsten Bräutigam & PASCAL INTERNATIONAL');
- GotoXY(65,1); WriteLn('Drucker : OFF');
- DRUCKER:=FALSE; { Druckerprotokoll aus }
- FOR CODE:=1 TO 80 DO BEGIN
- GotoXY(CODE,3);
- Write('─');
- END;
- CODE:=0;
- REPEAT
- GotoXY(2,5); TEXTCOLOR(2);
- Write ('Wieviele Variablen hat ihr System ? ');
- Read(Kbd,MM);
- IF MM=^D THEN BEGIN { Ctrl+D --> }
- DRUCKER:=NOT DRUCKER; { --> Drucker EIN/AUS }
- IF DRUCKER THEN BEGIN
- GotoXY(65,1);
- Write('Drucker : ON '); { Bildschirmausgabe }
- END
- ELSE BEGIN
- GotoXY(65,1);
- Write('Drucker : OFF');
- { Bildschirmausgabe DRUCKER : OFF }
- END;
- END
- ELSE
- Val(MM,F,CODE); { kein Ctrl-D --> also Zahlenangabe }
- UNTIL (Ord(MM)>47) AND (Ord(MM)<58) AND (CODE=0);
- { richtige Zahlenangabe : 0..9 }
- M:=F; { M = Dimension der Matrix }
- IF (M=0) OR (M>MAX) THEN BEGIN
- ClrScr;
- Halt;
- END;
- GotoXY(38,5); WriteLn(M);
- GotoXY(2,7);
- WriteLn('Bitte geben sie die Grundmatrix ein.');
- FOR C:= 1 TO M DO BEGIN
- GotoXY(C*5,9);
- Write('X',C:1);
- END;
- GotoXY((M+1)*5,9); Write('Y');
- FOR C:= 1 TO M DO BEGIN
- GotoXY(2,C+10);
- Write(C:1);
- END;
- FOR C:= 1 TO M DO BEGIN
- FOR D:= 1 TO M+1 DO BEGIN
- GotoXY(D*5,C+10);
- Read(W[C,D]);
- END;
- WriteLn;
- END;
- END;
-
- PROCEDURE PRINT(VAR W:FIELD; VAR M:INTEGER);
- { Für Druckerprotokoll zuständig }
- VAR C,F : INTEGER;
-
- LABEL 99;
-
- BEGIN
- FOR C:= 1 TO M DO BEGIN
- FOR F:= 1 TO M DO BEGIN
- IF (W[C,F]=0) AND (F<C) THEN BEGIN
- Write(Lst,' ');
- GOTO 99; { nächster Durchlauf FOR - Schleife }
- END;
- IF W[C,F]>0 THEN Write(Lst,' +')
- ELSE Write(Lst,' -');
- Write(Lst,ABS(W[C,F]):6:3,'x',#27,#83,#1,F:1,#27,#84);
- 99:
- END;
- Write(Lst,' =');
- IF W[C,M+1]>=0 THEN Write(Lst,' +')
- ELSE Write(Lst,' -');
- WriteLn(Lst,ABS(W[C,M+1]):6:3);
- END;
- WriteLn(Lst,'');
- END;
-
- PROCEDURE Gauss(VAR W:FIELD; VAR M:INTEGER);
-
- VAR K,I,J,
- L,C : INTEGER;
- U : F;
- Q : ARRAY[1..MAX1] OF REAL;
-
- BEGIN
- K:=1; { Arbeitszeile = 1 }
- IF DRUCKER THEN BEGIN { --> Druckerprotokoll ... }
- WriteLn(Lst,'Lineare Gleichungssysteme Version 1.00');
- Write(Lst,'(C) Copyright 1987 by Carsten Bräutigam');
- WriteLn(Lst,' & PASCAL INTERNATIONAL ');
- WriteLn(Lst);
- END;
- REPEAT
- IF DRUCKER THEN PRINT(W,M);
- { Matrix auf Drucker ausgeben }
- L:=K; { L = Arbeitszeile }
- WHILE W[K,K] = 0 DO BEGIN
- { Wenn Pivotelemet gleich 0, }
- L:=L+1;
- { nächste Zeile wird Arbeitszeile. }
- IF L>M THEN Exit;
- { Wenn alle Zeilen durch, dann Ende, }
-
- FOR C:= 1 TO M+1 DO U[C]:=W[K,C]; { sonst beide }
- W[K]:=W[L]; { Zeilen }
- FOR C:= 1 TO M+1 DO W[L,C]:=U[C]; { tauschen }
- END;
- FOR I:= K+1 TO M DO BEGIN
- Q[I]:=W[I,K]/W[K,K]; { Quotienten bilden }
- W[I,K]:=0; { Element der Pivotspalte }
- FOR J:= K+1 TO M+1 DO { Null setzen. }
- W[I,J]:=W[I,J]-Q[I]*W[K,J];
- { Multiplikation und Subtraktion durchführen. }
- END;
- K:=K+1; { nächste Zeile Arbeitszeile }
- UNTIL K>M-1; { bis zur vorletzten Zeile }
- { Treppenform erreicht. }
- IF DRUCKER THEN PRINT(W,M); { Endmatrix ausdrucken }
- END;
-
- FUNCTION SONDERLOESUNG(W:FIELD; M:INTEGER):INTEGER;
-
- VAR C,F,N,
- V : INTEGER;
-
- BEGIN
- SONDERLOESUNG:=0; { 0 --> nur eine Lösung }
- V:=0;
- IF W[M,M]=0 THEN BEGIN
- FOR C:= 1 TO M DO BEGIN
- N:=0;
- FOR F:= 1 TO M+1 DO
- IF W[C,F]=0 THEN N:=N+1; { Prüfung, ob alle }
- { Elemente der Zeile }
- IF N=M+1 THEN V:=V+1; { = Null - Nullzeile }
- END;
- IF V>0 THEN SONDERLOESUNG:=-V
- { negativ --> unendlich viele Lösungen }
- ELSE SONDERLOESUNG:=2;
- { 2 --> keine Lösung }
- END;
- END;
-
- PROCEDURE LOESUNG
- (VAR W:FIELD; VAR M:INTEGER; VAR X:F; VAR L:INTEGER);
-
- VAR S : REAL;
- I,J,K,
- A,B : INTEGER;
- V : FIELD;
-
- BEGIN
- L := SONDERLOESUNG(W,M);
- IF L<>2 THEN { Es gibt eine/mehrere Lösung/en }
- IF L<0 THEN BEGIN { Es gibt unendlich viele Lösungen }
- A :=-L; { Anzahl der Lösungsvariablen }
- B := 0;
- FOR I := M DOWNTO M-A+1 DO BEGIN
- FOR J := 0 TO A DO V[J,I] := 0;
- B := Succ(B);
- V[B,I] := 1; { Initialisierung der Lösungsvariablen}
- END;
- FOR I := M-A DOWNTO 1 DO BEGIN
- { folgende Berechnung dient zum }
- { Finden der Lösungsvektoren. }
- FOR K := 0 TO A DO BEGIN
- V[K,I] := 0;
- FOR J := I+1 TO M DO
- V[K,I] := V[K,I] - W[I,J]*V[K,J]/W[I,I];
- END;
- V[0,I] := V[0,I] + W[I,M+1]/W[I,I];
- END;
- W := V;
- END
- ELSE BEGIN
- X[M]:=W[M,M+1]/W[M,M];
- FOR I:= M-1 DOWNTO 1 DO BEGIN
- S:=0;
- FOR J := 1 TO M-I DO S:=S+W[I,I+J]*X[I+J];
- X[I]:=(1/W[I,I])*(W[I,M+1]-S);
- END;
- END;
- END;
-
- PROCEDURE AUSGABE(VAR X:F; VAR W:FIELD;
- M:INTEGER; L:INTEGER; DRUCKER:BOOLEAN);
-
- VAR C,I,J : INTEGER;
- CH : CHAR;
- A : INTEGER;
-
- BEGIN
- A:=13+M;
- IF L=2 THEN BEGIN { es gibt keine Lösung }
- GotoXY(2,A);
- WriteLn('Es gibt keine Lösung für dieses',
- ' Gleichungssystem.');
- IF DRUCKER THEN
- WriteLn(Lst,'Es gibt keine Lösung für dieses',
- ' Gleichungssystem.');
- Read(Kbd,CH); Exit;
- END;
- IF L<0 THEN BEGIN
- { es gibt unendlich viele Lösungen mit }
- { -L Lösungsvariablen }
- GotoXY(2,A); WriteLn('Die Lösungsmenge lautet :');
- WriteLn; Write(' ');
- IF DRUCKER THEN BEGIN
- WriteLn(Lst,'Die Lösung lautet :');
- WriteLn(Lst); Write(Lst,' ');
- END;
- FOR I := 0 TO -L DO BEGIN
- Write('┌',W[I,1]:7:3,'┐ ');
- IF DRUCKER THEN Write(Lst,'┌',W[I,1]:7:3,'┐ ');
- END;
- WriteLn;
- Write(' L = { X │ X = ');
- IF DRUCKER THEN BEGIN
- WriteLn(Lst);
- Write(Lst,' L = { X │ X = ');
- END;
- FOR I := 0 TO -L-1 DO BEGIN
- Write('│',W[I,2]:7:3,'│',' + ',Chr(114+I),' ');
- IF DRUCKER THEN
- Write(Lst,'│',W[I,2]:7:3,'│',' + ',Chr(114+I),' ');
- END;
- WriteLn('│',W[-L,2]:7:3,'│');
- IF DRUCKER THEN WriteLn(Lst,'│',W[-L,2]:7:3,'│');
- FOR I := 3 TO M-1 DO BEGIN
- Write(' ');
- IF DRUCKER THEN Write(Lst,' ');
- FOR J := 0 TO -L-1 DO BEGIN
- Write('│',W[J,I]:7:3,'│ ');
- IF DRUCKER THEN Write(Lst,'│',W[J,I]:7:3,'│ ');
- END;
- WriteLn('│',W[-L,I]:7:3,'│');
- IF DRUCKER THEN WriteLn(Lst,'│',W[-L,I]:7:3,'│');
- END;
- Write(' ');
- IF DRUCKER THEN Write(Lst,' ');
- FOR J := 0 TO -L-1 DO BEGIN
- Write('└',W[J,M]:7:3,'┘ ');
- IF DRUCKER THEN Write(Lst,'└',W[J,M]:7:3,'┘ ');
- END;
- WriteLn('└',W[-L,M]:7:3,'┘');
- IF DRUCKER THEN WriteLn(Lst,'└',W[-L,M]:7:3,'┘');
- END;
- IF L=0 THEN BEGIN { es gibt genau eine Lösung }
- GotoXY(2,A); Write('Die Lösungsmenge lautet : ');
- IF DRUCKER THEN Write(Lst,'Die Lösungsmenge lautet : ');
- Write('L = {'); IF DRUCKER THEN Write(Lst,'L = {');
- FOR C:= 1 TO M-1 DO BEGIN
- Write(X[C]:6:3,',');
- IF DRUCKER THEN Write(Lst,X[C]:6:3,',');
- END;
- WriteLn(X[M]:6:3,' }');
- IF DRUCKER THEN WriteLn(Lst,X[M]:6:3,' }');
- END;
- Read(Kbd,CH);
- END;
-
- BEGIN
- HALLO;
- ClrScr;
- TEXTCOLOR(2);
- EINGABE(W,M,DRUCKER);
- WHILE M>0 DO BEGIN { 0 --> Ende des Programms }
- Gauss(W,M); { Matrix auf Dreiecksgestalt bringen }
- LOESUNG(W,M,X,L); { Lösung der Matrix berechnen }
- AUSGABE(X,W,M,L,DRUCKER); { Ausgabe }
- EINGABE(W,M,DRUCKER);
- END;
- ClrScr;
- END.
-