home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* RECHNEN.PAS *)
- (* Die 4 Grundrechenarten bis zu einer Genauigkeit von *)
- (* maximal 250 Ziffern *)
- (* (c) 1989 Christian Ramsauer & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM Rechnen;
-
- TYPE Operat = STRING[255];
-
- VAR a, b, c : Operat;
- ch : CHAR;
- i : INTEGER;
-
- FUNCTION Komma(VAR s, t : Operat) : INTEGER;
- BEGIN
- IF Pos('.', s) = 0 THEN s := s + '.';
- IF Pos('.', t) = 0 THEN t := t + '.';
- WHILE (Length(s) - Pos('.', s)) <
- (Length(t) - Pos('.', t)) DO s := s + '0';
- WHILE (Length(s) - Pos('.', s)) >
- (Length(t) - Pos('.', t)) DO t := t + '0';
- WHILE Length(s) > Length(t) DO t := '0' + t;
- WHILE Length(s) < Length(t) DO s := '0' + s;
- IF s[Length(s)] = '.' THEN Delete(s, Length(s), 1);
- IF t[Length(t)] = '.' THEN Delete(t, Length(t), 1);
- IF (Pos('.', s) > 0) THEN BEGIN
- Komma := Length(s) - 1 - Pos('.', s);
- Delete(s, Pos('.', s), 1);
- Delete(t, Pos('.', t), 1);
- END ELSE Komma := 0;
- END;
-
- PROCEDURE Korrektur(VAR x: Operat);
- BEGIN
- WHILE (x[1] = '0') AND (x[2] <> '.') AND
- (Length(x)>1) DO Delete(x, 1, 1);
- WHILE (x[Length(x)] IN ['0', '.']) AND (Pos('.', x) > 0)
- AND (Length(x) > 1) DO Delete(x, Length(x), 1);
- END;
-
- FUNCTION Add0(x, y : Operat) : Operat;
- VAR b : Operat;
- i, u, z : INTEGER;
- BEGIN
- u := 0;
- b := '';
- FOR i := 1 TO Length(x) - Length(y) DO y := '0' + y;
- FOR i := 1 TO Length(y) - Length(x) DO x := '0' + x;
- FOR i := Length(x) DOWNTO 1 DO BEGIN
- z := Ord(x[i]) + Ord(y[i]) - 96 + u;
- u := z DIV 10;
- b := Chr(48 + (z MOD 10)) + b;
- END;
- IF u = 1 THEN b := '1' + b;
- Korrektur(b);
- Add0 := b;
- END;
-
- FUNCTION Add1(x, y : Operat) : Operat;
- VAR b : Operat;
- kom : INTEGER;
- BEGIN
- kom := Komma(x, y);
- b := Add0(x, y);
- IF kom <> 0 THEN Insert('.', b, Length(b) - kom);
- IF b[1] = '.' THEN b := '0' + b;
- Korrektur(b);
- Add1 := b;
- END;
-
- FUNCTION Sub0(x, y : Operat) : Operat;
- VAR b : Operat;
- i, u, z : INTEGER;
- BEGIN
- b := '';
- u := 0;
- FOR i := 1 TO Length(x) - Length(y) DO y := '0' + y;
- FOR i := 1 TO Length(y) - Length(x) DO x := '0' + x;
- FOR i := Length(x) DOWNTO 1 DO BEGIN
- IF Ord(x[i]) >= (Ord(y[i]) + u) THEN BEGIN
- z := Ord(x[i]) - Ord(y[i]) - u;
- u := 0;
- END ELSE BEGIN
- z := Ord(x[i]) - Ord(y[i]) + 10 - u;
- u := 1;
- END;
- b := Chr(48 + z) + b;
- END;
- Korrektur(b);
- Sub0 := b;
- END;
-
- FUNCTION Sub1(x, y : Operat) : Operat;
- VAR b : Operat;
- kom, i, u, z : INTEGER;
- BEGIN
- kom := Komma(x, y);
- b := Sub0(x, y);
- IF (kom <> 0) AND (Length(b) >= kom) THEN
- Insert('.', b, Length(b) - kom);
- IF b[1] = '.' THEN b := '0' + b;
- Korrektur(b);
- Sub1 := b;
- END;
-
- FUNCTION Mul1(x, y : Operat) : Operat;
- VAR b ,z : Operat;
- kommax, kommay, i, j : INTEGER;
- BEGIN
- IF Pos('.', x) <> 0 THEN kommax := Length(x) - Pos('.', x)
- ELSE kommax := 0;
- IF Pos('.', y) <> 0 THEN kommay := Length(y) - Pos('.', y)
- ELSE kommay := 0;
- Delete(x, Pos('.', x), 1);
- Delete(y, Pos('.', y), 1);
- b := '0';
- FOR i := 1 TO Length(x) DO BEGIN
- z := '0';
- FOR j := 1 TO Ord(x[i]) - 48 DO z := Add0(z, y);
- FOR j := 1 TO Length(x) - i DO z := z + '0';
- b := Add0(b, z);
- END;
- IF kommax + kommay > 0 THEN BEGIN
- FOR j := 1 TO 250 - Length(b) DO b := '0' + b;
- Insert('.', b, Length(b) + 1 - kommax - kommay);
- END;
- Korrektur(b);
- Mul1 := b;
- END;
-
- FUNCTION kl(x, y : Operat) : BOOLEAN;
- VAR kx, ky, i : INTEGER;
- BEGIN
- WHILE (x[1] = '0') AND (Length(x) > 1) DO Delete(x, 1, 1);
- WHILE (y[1] = '0') AND (Length(y) > 1) DO Delete(y, 1, 1);
- IF Pos('.', x) = 0 THEN x := x + '.';
- IF Pos('.', y) = 0 THEN y := y + '.';
- kx := Length(x) - Pos('.', x);
- ky := Length(y) - Pos('.', y);
- FOR i := 1 TO kx - ky DO y := y + '0';
- FOR i := 1 TO ky - kx DO x := x + '0';
- IF Length(x) < Length(y) THEN kl := TRUE;
- IF Length(x) > Length(y) THEN kl := FALSE;
- IF Length(x) = Length(y) THEN
- IF x < y THEN kl := TRUE ELSE kl := FALSE;
- END;
-
- FUNCTION Div1(x, y : Operat; g : INTEGER) : Operat;
- VAR b, xx, z, yy : Operat;
- kommax, kommay, i : INTEGER;
- fertig, first : BOOLEAN;
- BEGIN
- IF Pos('.', x) <> 0 THEN kommax := Length(x) - Pos('.', x)
- ELSE kommax := 0;
- IF Pos('.', y) <> 0 THEN kommay := Length(y) - Pos('.', y)
- ELSE kommay := 0;
- FOR i := 1 TO kommax - kommay DO y := y + '0';
- FOR i := 1 TO kommay - kommax DO x := x + '0';
- Delete(x, Pos('.', x), 1);
- Delete(y, Pos('.', y), 1);
- xx := '';
- b := '';
- first := TRUE;
- REPEAT
- fertig := FALSE;
- IF Length(x) > 0 THEN BEGIN
- xx := xx + Copy(x, 1, 1);
- Delete(x, 1, 1);
- END ELSE BEGIN
- IF first THEN BEGIN
- first := FALSE;
- b := b + '.';
- END;
- xx := xx + '0';
- END;
- IF kl(xx, y) THEN b := b + '0'
- ELSE BEGIN
- i := 0;
- REPEAT
- i := i + 1;
- UNTIL (kl(xx, Mul1(Chr(i + 48), y))) OR (i = 10);
- b := b + Chr(47 + i);
- xx := Sub0(xx, Mul1(Chr(47 + i), y));
- fertig := TRUE;
- FOR i := 1 TO Length(xx) DO
- IF xx[i] <> '0' THEN fertig := FALSE;
- END;
- IF (b[1] = '0') AND (b[2] <> '.') THEN Delete(b, 1, 1);
- UNTIL (Length(b) > g) OR fertig;
- IF b[1] = '.' THEN b := '0' + b;
- Div1 := b;
- END;
-
- FUNCTION Neg(VAR xy : Operat) : BOOLEAN;
- BEGIN
- IF xy[1] = '-' THEN Neg := TRUE ELSE Neg := FALSE;
- IF (xy[1] = '-') OR (xy[1] = '+') THEN Delete(xy, 1, 1);
- END;
-
- FUNCTION Groesse(x, y : Operat) : BOOLEAN;
- VAR x1, x2, y1, y2 : INTEGER;
- BEGIN
- IF Pos('.', x) > 0 THEN BEGIN
- x1 := Pos('.', x) - 1;
- x2 := Length(x) - 1 - x1;
- END ELSE BEGIN
- x1 := Length(x);
- x2 := 0;
- END;
- IF Pos('.', y) > 0 THEN BEGIN
- y1 := Pos('.', y) - 1;
- y2 := Length(y) - 1 - y1;
- END ELSE BEGIN
- y1 := Length(y);
- y2 := 0;
- END;
- IF (x1 + y2 > 250) OR (y1 + x2 > 250) THEN
- Groesse := FALSE
- ELSE Groesse := TRUE;
- END;
-
- FUNCTION Addition(x, y : Operat) : Operat;
- VAR b : Operat;
- null : BOOLEAN;
- BEGIN
- Korrektur(x);
- Korrektur(y);
- IF NOT Groesse(x, y) THEN BEGIN
- Addition := 'Ergebnis übersteigt die Kapazität!';
- Exit;
- END;
- CASE Neg(x) OF
- TRUE: CASE Neg(y) OF
- TRUE : b := '-' + Add1(x, y);
- FALSE: IF kl(y, x) THEN b := '-' + Sub1(x, y)
- ELSE b := Sub1(y, x);
- END;
- FALSE: CASE Neg(y) OF
- TRUE : IF kl(y, x) THEN b := Sub1(x, y)
- ELSE b := '-' + Sub1(y, x);
- FALSE: b := Add1(x,y);
- END;
- END;
- null := TRUE;
- FOR i := 1 TO Length(b) DO
- IF b[i] IN ['1'..'9'] THEN null := FALSE;
- IF null THEN b := '0';
- Addition := b;
- END;
-
- FUNCTION Subtraktion(x, y : Operat) : Operat;
- VAR b : Operat;
- null : BOOLEAN;
- BEGIN
- Korrektur(x);
- Korrektur(y);
- IF NOT Groesse(x, y) THEN BEGIN
- Subtraktion := 'Ergebnis übersteigt die Kapazität!';
- Exit;
- END;
- CASE Neg(x) OF
- TRUE: CASE Neg(y) OF
- TRUE : IF kl(x, y) THEN b := Sub1(y, x)
- ELSE b := '-' + Sub1(x, y);
- FALSE: b := '-' + Add1(x, y);
- END;
- FALSE: CASE Neg(y) OF
- TRUE : b := Add1(x, y);
- FALSE: IF kl(y, x) THEN b := Sub1(x, y)
- ELSE b := '-' + Sub1(y, x);
- END;
- END;
- null := TRUE;
- FOR i := 1 TO Length(b) DO
- IF b[i] IN ['1'..'9'] THEN null := FALSE;
- IF null THEN b := '0';
- Subtraktion := b;
- END;
-
- FUNCTION Multiplikation(x, y : Operat) : Operat;
- VAR b : Operat;
- null : BOOLEAN;
- i : INTEGER;
- BEGIN
- Korrektur(x);
- Korrektur(y);
- IF Length(x) + Length(y) <= 250 THEN BEGIN
- IF Neg(x) = Neg(y) THEN b := Mul1(x, y)
- ELSE b := '-' + Mul1(x, y);
- null := TRUE;
- FOR i := 1 TO Length(b) DO
- IF b[i] IN ['1'..'9'] THEN null := FALSE;
- IF null THEN b := '0';
- END ELSE b := 'Ergebnis übersteigt die Kapazität!';
- Multiplikation := b;
- END;
-
- FUNCTION Division(x, y : Operat) : Operat;
- CONST stell = 20;
- VAR b : Operat;
- null, d_null : BOOLEAN;
- maximum, i : INTEGER;
- BEGIN
- IF Length(x) > Length(y) THEN maximum := Length(x)
- ELSE maximum := Length(y);
- IF maximum < stell THEN maximum := stell;
- Korrektur(x);
- Korrektur(y);
- IF x = '0' THEN null := TRUE ELSE null := FALSE;
- IF y = '0' THEN d_null := TRUE ELSE d_null := FALSE;
- IF d_null THEN b := 'Division durch Null!'
- ELSE IF null THEN b := '0'
- ELSE IF Neg(x) = Neg(y) THEN b := Div1(x, y, maximum)
- ELSE b := '-' + Div1(x, y, maximum);
- Division := b;
- END;
-
- FUNCTION Zahl : Operat;
- VAR b : Operat;
- ch : CHAR;
- i : INTEGER;
- punkt : BOOLEAN;
- BEGIN
- i := 0;
- punkt := FALSE;
- b := '';
- REPEAT
- REPEAT
- Read(KBD,ch)
- UNTIL ch IN ['0'..'9','.','+','-',#8,#13];
- CASE ch OF
- '0'..'9': IF i < 251 THEN BEGIN
- i := i + 1;
- b := b + ch;
- Write(ch);
- END;
- '.': IF (i < 251) AND (b[Length(b)] IN ['0'..'9'])
- AND NOT punkt THEN BEGIN
- i := i + 1;
- b := b + ch;
- Write(ch);
- punkt := TRUE;
- END;
- '+','-': IF i = 0 THEN BEGIN
- i := i + 1;
- b := b + ch;
- Write(ch);
- END;
- #8: IF i > 0 THEN BEGIN
- i := i - 1;
- IF b[Length(b)] = '.' THEN punkt := FALSE;
- Delete(b, Length(b), 1);
- IF WhereX = 1 THEN BEGIN
- GotoXY(80, WhereY - 1);
- Write(#32);
- GotoXY(80, WhereY - 1);
- END ELSE Write(#8, #32, #8);
- END;
- END;
- UNTIL (ch = #13) AND (i > 0);
- Zahl := b;
- WriteLn;
- END;
-
- BEGIN
- REPEAT
- ClrScr;
- WriteLn('**** Genaue Grundrechenarten ****');
- WriteLn;
- Write('Operand 1: ');
- a := Zahl;
- Write('Rechenart: ');
- REPEAT
- Read(KBD,ch)
- UNTIL ch IN ['+','-','*','/'];
- WriteLn(ch);
- Write('Operant 2: ');
- b := Zahl;
- WriteLn(' =');
- CASE ch OF
- '+': c := Addition(a,b);
- '-': c := Subtraktion(a,b);
- '*': c := Multiplikation(a,b);
- '/': c := Division(a,b);
- END;
- Write('Ergebnis: ');
- WriteLn(c);
- WriteLn;
- Write('Weitermachen (J/N) ?');
- Read(KBD,ch);
- UNTIL ch IN ['n','N'];
- END.
- (* ------------------------------------------------------ *)
- (* Ende von RECHNEN.PAS *)
-