home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* TERM.PAS *)
- (* Berechnen von mathematischer Termen Turbo 4/5 *)
- (* (C) 1989 Alexander Sunder & TOOLBOX *)
- (* ------------------------------------------------------ *)
- UNIT Term;
-
- INTERFACE
-
- TYPE
- String80 = STRING[80];
-
- VAR
- x, y, z : REAL;
-
- FUNCTION Pruef(T : String80) : BOOLEAN;
- FUNCTION Loes (T : String80) : REAL;
-
- IMPLEMENTATION
-
- FUNCTION Pruef(T : String80) : BOOLEAN;
- TYPE
- TM = SET OF CHAR;
- CONST
- Zi : TM = ['0'..'9'];
- Op : TM = ['+','-','*','/','^'];
- VAR
- i, Klammer : INTEGER;
- Punkt, Fehler, Verknuepf : BOOLEAN;
- BEGIN
- Fehler := FALSE; Klammer := 0; Punkt := FALSE;
- Verknuepf := FALSE; i := 1; T[i] := UpCase(T[i]);
- IF NOT(T[i] IN Zi + ['-','(','x','y','z']) THEN
- Fehler := TRUE
- ELSE BEGIN
- IF T[i] = '(' THEN Klammer := Klammer + 1;
- WHILE NOT(Fehler) AND (i < Length(T)) DO BEGIN
- i := i + 1; T[i] := UpCase(T[i]);
- CASE T[i-1] OF
- '0'..'9': IF NOT(T[i] IN Zi + Op) THEN
- CASE T[i] OF
- ')': Klammer := Klammer - 1;
- '.': IF NOT(Punkt) THEN
- Punkt := TRUE
- ELSE Fehler := TRUE
- ELSE Fehler := TRUE;
- END;
- '+','-',
- '*','/',
- '^' : BEGIN
- Punkt := FALSE;
- Verknuepf := TRUE;
- IF NOT(T[i] IN Zi+['X','Y','Z']) THEN
- IF T[i] = '(' THEN
- Klammer := Klammer + 1
- ELSE
- Fehler := TRUE;
- END;
- '.' : IF NOT(T[i] IN Zi) THEN Fehler := TRUE
- ELSE Punkt := TRUE;
- '(' : IF NOT(T[i] IN Zi+['-','X','Y','Z']) THEN
- IF T[i] = '(' THEN Klammer := Klammer+1
- ELSE Fehler := TRUE;
- ')' : IF NOT(T[i] IN Op) THEN
- IF T[i] = ')' THEN Klammer := Klammer-1
- ELSE Fehler := TRUE;
- 'x','y',
- 'z' : IF NOT(T[i] IN Zi+Op) THEN
- IF T[i] = ')' THEN Klammer := Klammer-1
- ELSE Fehler := TRUE
- END;
- END;
- IF NOT (Fehler) AND ((T[i] IN Op) OR
- (Klammer <> 0)) THEN Fehler := TRUE;
- END;
- Pruef := NOT(Fehler);
- END;
-
- PROCEDURE RechenZeichen (VAR Zeichen : CHAR;
- VAR Pos : BYTE;
- VAR T : STRING80);
- VAR
- i, Klammer : BYTE;
- Prior : 0..3;
- BEGIN
- Prior := 0; Klammer := 0;
- FOR i := 1 TO Length(T) DO
- CASE T[i] OF
- '(' : Klammer := Klammer + 1;
- ')' : Klammer := Klammer - 1;
- '^' : IF (Prior <= 1) AND (Klammer=0) THEN BEGIN
- Prior := 1; Pos := i;
- END;
- '*','/': IF (Prior <= 2) AND (Klammer=0) THEN BEGIN
- Prior := 2; Pos := i;
- END;
- '+','-': IF Klammer = 0 THEN BEGIN
- Prior := 3; Pos := i;
- END;
- END;
- IF Prior = 0 THEN BEGIN
- Zeichen := #0; Pos := 0;
- END ELSE Zeichen := T[Pos];
- END;
-
- FUNCTION Berechnung(VAR Z1, Z2 : REAL;
- VAR Operator : CHAR) : REAL;
- VAR
- i : INTEGER;
- Pot : REAL;
- BEGIN
- CASE Operator OF
- '^': IF (Z1<0) AND (Frac(Z2)<>0) THEN BEGIN
- WriteLn('Negative Wurzel !'); Halt(1);
- END ELSE
- IF Z1 = 0 THEN
- Berechnung := 0
- ELSE
- IF (Frac(Z2) = 0) AND
- (Trunc(Z2) >= 0) THEN BEGIN
- Pot := 1.0;
- FOR i := 1 TO Trunc(Z2) DO Pot := Pot * Z1;
- Berechnung := Pot;
- END ELSE
- Berechnung := Exp(Z2 * Ln(Z1));
- '*': Berechnung := Z1 * Z2;
- '/': IF Z2 <> 0 THEN
- Berechnung := Z1/Z2
- ELSE BEGIN
- Write('Division durch 0 !'); Halt(1);
- END;
- '+': Berechnung := Z1 + Z2;
- '-': Berechnung := Z1 - Z2
- END;
- END;
-
- FUNCTION Loes(T : String80) : REAL;
- VAR
- Z1, Z2, Zahl : REAL;
- Operator : CHAR;
- Pos : BYTE;
- Code : INTEGER;
- Klammerung : BOOLEAN;
- BEGIN
- REPEAT
- Klammerung := FALSE;
- RechenZeichen(Operator, Pos, T);
- IF Pos <> 0 THEN BEGIN
- Z1 := 0;
- Val(Copy(T, 1, Pos-1), Z1, Code);
- IF Code <> 0 THEN
- Z1 := Loes(Copy(T, 1, Pos-1));
- Val(Copy(T, Pos+1, Length(T)-Pos), Z2, Code);
- IF Code <> 0 THEN
- Z2 := Loes(Copy(T, Pos+1, Length(T)-Pos));
- Loes := Berechnung(Z1, Z2, Operator)
- END ELSE
- IF T[1] = '(' THEN BEGIN
- T := Copy(T, 2, Length(T)-2);
- Klammerung := TRUE;
- END;
- UNTIL NOT(Klammerung);
- IF Pos = 0 THEN
- CASE UpCase(T[1]) OF
- 'x': Loes := x;
- 'y': Loes := y;
- 'Z': Loes := z;
- ELSE BEGIN
- Val(T, Zahl, Code);
- Loes := Zahl;
- END;
- END;
- END;
-
- END.
- (* ------------------------------------------------------ *)
- (* Ende von TERM.PAS *)