PROGRAM SIMPLEX(INPUT,OUTPUT); (* ÈANNO ËLEIN 27.11.85 - 11.12.85*) CONST MAXZ=20;MAXSP=40;CLRSCR="“";CSRHOME=""; F1=133;F3=134;F5=135;F7=136;C=67;B=66;Q=81; RON="";ROFF="’";CD="";CR="";CL="?"; TYPE ZINDEX = 1..MAXZ; SPINDEX = 1..MAXSP; CARDINAL= 0..MAXINT; ZAHL = RECORD ZAEHLER : CARDINAL; NENNER : CARDINAL; VORZ : BOOLEAN END; TABLEAU = ARRAY[ZINDEX,SPINDEX] OF ZAHL; TKEY = 0..255; VAR TAB : TABLEAU; KEY : TKEY; PIVOT : ZAHL; I,ANZZ,PZ : ZINDEX; J,ANZSP,PSP : SPINDEX; PROCEDURE WAITKEY; BEGIN WRITELN(CD,CR,CR,CR,CR,RON,"ÔASTE DRUECKEN"); REPEAT SYS(-28) UNTIL PEEK(780)<>0 END; (*WAITKEY*) PROCEDURE INIT; BEGIN PZ:=0;PSP:=0; REPEAT WRITELN(CLRSCR,"ÁNZAHL DER ÚEILEN "); WRITELN("==>",ANZZ);WRITELN(CSRHOME); WRITE(CR,CR,CR,CR);READLN(ANZZ); WRITELN(CD,CD,"ÁNZAHL DER ÓPALTEN "); WRITELN("==>",ANZSP);WRITELN(CSRHOME); WRITE(CD,CD,CD,CD,CD,CR,CR,CR,CR);READLN(ANZSP) UNTIL (ANZZ<=MAXZ) AND (ANZSP<=MAXSP) END; (*INIT*) PROCEDURE CHECKFIELD(VAR FIELD:ZAHL;Z,N:INTEGER); BEGIN IF N<0 THEN N:=-N; IF (Z<0) AND (N<>0) THEN BEGIN Z:=-Z;FIELD.VORZ:=TRUE END ELSE FIELD.VORZ:=FALSE; IF (Z=0) OR (N=0) THEN BEGIN FIELD.ZAEHLER:=0;FIELD.NENNER:=0 END ELSE BEGIN FIELD.ZAEHLER:=Z;FIELD.NENNER:=N END END; (*CHECKFIELD*) PROCEDURE PRINTFIELD(FIELD:ZAHL); VAR Z,N:CARDINAL; BEGIN Z:=FIELD.ZAEHLER;N:=FIELD.NENNER; IF FIELD.VORZ THEN WRITE("-") ELSE IF Z<>0 THEN WRITE("+") ELSE WRITE(" ");WRITE(Z:3); IF (N<>1) AND (N<>0) THEN WRITELN(" /",N) ELSE WRITELN END; (*PRINTFIELD*) PROCEDURE EINGABE; VAR I,K:ZINDEX;J:SPINDEX;Z,N:INTEGER; BEGIN FOR J:=1 TO ANZSP DO BEGIN WRITELN(CLRSCR,RON,"ÓPALTE",J:3); FOR I:=1 TO ANZZ DO BEGIN WRITELN(CSRHOME,CD); FOR K:=1 TO I DO WRITE(CD); WRITE("ÚEILE",I:3," : 0 0",CL,CL,CL);READLN(Z,N); CHECKFIELD(TAB[I,J],Z,N) END END END; (*EINGABE*) PROCEDURE AUSGABE; VAR I:ZINDEX;J:SPINDEX; BEGIN FOR J:=1 TO ANZSP DO BEGIN WRITELN(CLRSCR,RON,"ÓPALTE",J:3,CD); FOR I:=1 TO ANZZ DO BEGIN WRITE("ÚEILE",I," : "); PRINTFIELD(TAB[I,J]) END; WAITKEY END END; (*AUSGABE*) PROCEDURE KUERZE(VAR X,Y:CARDINAL); VAR GGT,XX,YY:CARDINAL; BEGIN IF (X<>0) AND (Y<>0) THEN BEGIN XX:=X;YY:=Y; WHILE X<>Y DO IF X>Y THEN X:=X-Y ELSE Y:=Y-X; GGT:=X;X:=XX DIV GGT;Y:=YY DIV GGT END END; (*KUERZE*) PROCEDURE GETKGV(X,Y:CARDINAL;VAR KGV:CARDINAL); VAR U,V:CARDINAL; BEGIN IF (X=0) OR (Y=0) THEN KGV:=0 ELSE BEGIN U:=X;V:=Y; WHILE X<>Y DO IF X>Y THEN BEGIN X:=X-Y;U:=U+V END ELSE BEGIN Y:=Y-X;V:=V+U END; KGV:=(U+V) DIV 2 END END; (*GETKGV*) PROCEDURE GETVORZEICHEN(V1,V2:BOOLEAN;VAR ERGV:BOOLEAN); BEGIN IF (V1 AND V2) OR (NOT V1 AND NOT V2) THEN ERGV:=FALSE ELSE ERGV:=TRUE END; (*GETVORZEICHEN*) PROCEDURE DIVIDE(Z1,Z2:ZAHL;VAR ERG:ZAHL); BEGIN IF (Z1.ZAEHLER<>0) AND (Z2.ZAEHLER<>0) THEN BEGIN KUERZE(Z1.ZAEHLER,Z2.ZAEHLER); KUERZE(Z1.NENNER,Z2.NENNER); ERG.ZAEHLER:=Z1.ZAEHLER*Z2.NENNER; ERG.NENNER:=Z1.NENNER*Z2.ZAEHLER; KUERZE(ERG.ZAEHLER,ERG.NENNER); GETVORZEICHEN(Z1.VORZ,Z2.VORZ,ERG.VORZ) END ELSE IF Z2.ZAEHLER=0 THEN BEGIN WRITELN(CLRSCR,"ÄIVISION BY ZERO !!!");WAITKEY END ELSE BEGIN ERG.ZAEHLER:=0;ERG.NENNER:=0;ERG.VORZ:=FALSE END END; (*DIVIDE*) PROCEDURE MULTIPLY(Z1,Z2:ZAHL;VAR ERG:ZAHL); BEGIN IF (Z1.ZAEHLER<>0) AND (Z2.ZAEHLER<>0) THEN BEGIN KUERZE(Z1.ZAEHLER,Z2.NENNER); KUERZE(Z1.NENNER,Z2.ZAEHLER); ERG.ZAEHLER:=Z1.ZAEHLER*Z2.ZAEHLER; ERG.NENNER:=Z1.NENNER*Z2.NENNER; KUERZE(ERG.ZAEHLER,ERG.NENNER); GETVORZEICHEN(Z1.VORZ,Z2.VORZ,ERG.VORZ) END ELSE BEGIN ERG.ZAEHLER:=0;ERG.NENNER:=0;ERG.VORZ:=FALSE END END; (*MULTIPLY*) PROCEDURE ADD(Z1,Z2:ZAHL;VAR ERG:ZAHL); VAR KGV:CARDINAL;SUMME,X1,X2:INTEGER; BEGIN GETKGV(Z1.NENNER,Z2.NENNER,KGV); IF KGV<>0 THEN BEGIN ERG.NENNER:=KGV; X1:=Z1.ZAEHLER*(KGV DIV Z1.NENNER); X2:=Z2.ZAEHLER*(KGV DIV Z2.NENNER); IF Z1.VORZ THEN X1:=-X1;IF Z2.VORZ THEN X2:=-X2; SUMME:=X1+X2; IF SUMME<0 THEN BEGIN ERG.ZAEHLER:=-SUMME;ERG.VORZ:=TRUE END ELSE BEGIN ERG.ZAEHLER:=SUMME;ERG.VORZ:=FALSE END END ELSE BEGIN ERG.ZAEHLER:=Z1.ZAEHLER+Z2.ZAEHLER; ERG.NENNER:=Z1.NENNER+Z2.NENNER; ERG.VORZ:=Z1.VORZ OR Z2.VORZ END; IF ERG.ZAEHLER=0 THEN ERG.NENNER:=0 ELSE KUERZE(ERG.ZAEHLER,ERG.NENNER) END; (*ADD*) PROCEDURE CHANGEFIELD; VAR I:ZINDEX;J:SPINDEX;Z,N:INTEGER; BEGIN REPEAT WRITELN(CLRSCR,RON,"ÆELDAENDERUNG"); WRITELN(CD,CD,"ÚEILE ÓPALTE"); WRITE(CD,"==>");READLN(I,J); UNTIL (I>0) AND (I<=ANZZ) AND (J>0) AND (J<=ANZSP); WRITELN(CD,CD,"ÚAEHLER ÎENNER"); WRITE(CD,"==>");READLN(Z,N);CHECKFIELD(TAB[I,J],Z,N) END; (*CHANGEFIELD*) PROCEDURE CALCBRUCH; VAR Z,N:REAL; BEGIN REPEAT WRITELN(CLRSCR,RON,"ÂRUCH ==> ÄEZIMALWERT"); WRITELN(CD,CD,"ÚAEHLER ÎENNER"); WRITE(CD,"==>");READLN(Z,N) UNTIL (INT(Z)=Z) AND (INT(N)=N); IF N=0 THEN WRITELN(CD,CD,"ÄIVISION BY ZERO !!!") ELSE BEGIN WRITELN(CD,CD,"ÄEZIMALWERT"); WRITELN(CD,"==>",Z/N) END; WAITKEY END; (*CALCBRUCH*) PROCEDURE ITERATION; VAR I:ZINDEX;J:SPINDEX;ERG,MP:ZAHL;Z,N:CARDINAL; PROCEDURE GETPIVOT; BEGIN REPEAT WRITELN(CLRSCR,"ÐIVOT (ÚEILE ÓPALTE) "); WRITELN("==>",PZ,PSP);WRITELN(CSRHOME); WRITE(CR,CR,CR,CR);READLN(PZ,PSP) UNTIL (PZ0)AND(PSP>0); PIVOT:=TAB[PZ,PSP] END; (*GETPIVOT*) BEGIN (*ITERATION*) GETPIVOT;Z:=PIVOT.ZAEHLER;N:=PIVOT.NENNER; IF Z<>0 THEN BEGIN IF (Z<>1) OR (N<>1) THEN FOR J:=1 TO ANZSP DO IF TAB[PZ,J].ZAEHLER<>0 THEN DIVIDE(TAB[PZ,J],PIVOT,TAB[PZ,J]); FOR I:=1 TO ANZZ DO IF (I<>PZ) AND (TAB[I,PSP].ZAEHLER<>0) THEN BEGIN MP:=TAB[I,PSP]; IF TAB[I,PSP].VORZ THEN MP.VORZ:=FALSE ELSE MP.VORZ:=TRUE; FOR J:=1 TO ANZSP DO IF TAB[PZ,J].ZAEHLER<>0 THEN BEGIN MULTIPLY(MP,TAB[PZ,J],ERG); ADD(TAB[I,J],ERG,TAB[I,J]) END END END;AUSGABE END; (*ITERATION*) PROCEDURE QUOTIENT; VAR I:ZINDEX;SP:SPINDEX;QUOT:ZAHL; BEGIN REPEAT WRITE(CLRSCR,RON,"ÓPALTE:",ROFF," ");READLN(SP) UNTIL (SP>0) AND (SP0)) THEN WRITELN(" ./.") ELSE BEGIN DIVIDE(TAB[I,ANZSP],TAB[I,SP],QUOT); IF TAB[I,SP].VORZ THEN WRITELN(" (EVTL.)") ELSE PRINTFIELD(QUOT) END END;WAITKEY END; (*QUOTIENT*) BEGIN (* ÈÐ *) ANZZ:=0;ANZSP:=0;POKE(-28657,8); REPEAT WRITELN(CLRSCR,RON,"ÓIMPLEX-ÁLGORITHMUS",CD,CD); WRITELN(CD,RON,"Æ1",ROFF," ÔABLEAU EINGEBEN"); WRITELN(CD,RON,"Æ3",ROFF," ÔABLEAU AUSGEBEN"); WRITELN(CD,RON,"Æ5",ROFF," ÔABLEAU ITERIEREN"); WRITELN(CD,RON,"Æ7",ROFF," ÑUOTIENTEN BILDEN"); WRITELN(CD,CD,RON,"Ã",ROFF," ÆELDAENDERUNG"); WRITELN(CD,RON,"Â",ROFF," ÂRUCH ==> ÄEZIMAL"); WRITELN(CD,RON,"Ñ",ROFF," ÐROGRAMMENDE"); REPEAT SYS(-28) UNTIL PEEK(780)<>0;KEY:=PEEK(780); CASE KEY OF F1 : BEGIN INIT;EINGABE END; F3 : AUSGABE; F5 : ITERATION; F7 : QUOTIENT; C : CHANGEFIELD; B : CALCBRUCH ELSE END UNTIL KEY=Q;WRITELN(CLRSCR) END. (* ÈÐ *)