home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
modula2
/
library
/
fst
/
mod2brd1
/
rechner.mod
< prev
next >
Wrap
Text File
|
1990-04-08
|
4KB
|
134 lines
MODULE Rechner9;
(********************************************************************
Taschenrechner.
Dieses Programm ist ein kleiner Taschenrechner,der unter anderem
die "Punkt vor Strich"-Regel berücksichtigt.
Zur Verfügung stehende Operatoren sind:"+","-","*","/","(",")"
Bsp.: Eingabe: "5-3*(8+4/2)+1"
Ausgabe: " = -24 "
********************************************************************)
FROM InOut IMPORT WriteCard,WriteLn,ReadString,WriteString,WriteInt,Write;
VAR i,oben:CARDINAL; (* i: Index für String, oben: Index für Stack *)
next,x:CHAR; (* enthält nächstes Zeichen *)
s:ARRAY[1..80] OF CHAR; (* enthält Ausdrkücke *)
stack:ARRAY[1..40] OF INTEGER; (* enthält Stack *)
PROCEDURE Fehler;
(* Auftretende Fehler werden angezeigt *)
BEGIN
WriteLn; WriteLn;
WriteString(' Term falsch eingegeben! ');
WriteLn;
WriteString(' Oder Division durch Null! ');
WriteString(s);
WriteLn;
FOR i:=1 TO i-1 DO Write(' '); END;
WriteLn;
HALT
END Fehler;
PROCEDURE Lese;
(* nächstes Zeichen wird geholt *)
BEGIN
INC(i);
next:=s[i]
END Lese;
PROCEDURE LeseZahl;
(* Zahlen werden eingelesen *)
VAR zahl:CARDINAL;
minus:BOOLEAN; (* minus für negativ *)
BEGIN
minus:=FALSE; (* am Anfang nicht Negativ *)
IF next="-" THEN minus:=TRUE;
Lese; (* falls "-", wird nächstes Zeichen gelesen *)
END;
IF next="+" THEN Lese END; (* falls +, wird nächstes Zeichen gelesen *)
IF ((next<"0") OR (next>"9")) THEN Fehler END; (* falls Keine Zahl *)
(* --> Fehler *)
zahl:=0;
REPEAT
zahl:=zahl*10 +(ORD(next))-(ORD("0"));
Lese;
IF ABS(zahl)>MAX(INTEGER) THEN Fehler END;
UNTIL (next<"0") OR (next>"9");
IF minus THEN zahl:=-INTEGER(zahl) END; (* falls minus, ist die Zahl negativ *)
INC(oben); (* Stack erhoben *)
stack[oben]:=zahl; (* Zahl speichern *)
DEC(i) (* da next für i-1 sein soll *)
END LeseZahl;
PROCEDURE Ausdruck;
(* gemäß Skript *)
PROCEDURE Term;
(* gemäß Skript *)
PROCEDURE Faktor;
(* gemäß Skript *)
BEGIN (* Faktor *)
CASE next OF
"0".."9","+","-":LeseZahl; Lese; RETURN |
"(": Lese; Ausdruck;
IF next=")" THEN Lese; RETURN
ELSE Fehler
END (*IF*)
ELSE Fehler
END (*CASE*)
END Faktor;
BEGIN (* Term *)
Faktor;
LOOP
CASE next OF
"*": Lese;
Faktor;
DEC(oben);
stack[oben]:=stack[oben]*stack[oben+1]; |
"/": Lese;
Faktor;
IF stack[oben]=0 THEN Fehler END;
DEC(oben);
stack[oben]:=stack[oben] DIV stack[oben+1]; |
"-","+",")",0C: RETURN
ELSE Fehler
END (*CASE*)
END (*LOOP*)
END Term;
BEGIN (* Ausdruck *)
Term;
LOOP
CASE next OF
"+": Lese;
Term;
DEC(oben);
stack[oben]:=stack[oben]+stack[oben+1]; |
"-": Lese;
Term;
DEC(oben);
stack[oben]:=stack[oben]-stack[oben+1]; |
")",0C: RETURN
ELSE Fehler
END (*CASE*)
END (*LOOP*)
END Ausdruck;
BEGIN (*MAIN*)
WriteString('Dieses Programm stellt einen kleinen Taschenrechner dar, ');
WriteLn;
WriteString('zur Verfügung stehende Operatoren sind:"+","-","*","/","(",")"');
WriteLn; WriteLn;
WriteString('Bitte geben Sie jetzt den zu berechnenden Term ein: ');
WriteLn; WriteLn;
ReadString(s); (* Ausdrücke einlesen *)
oben:=0;
i:=0; (* initialisieren *)
Lese; (* erstes Zeichen holen *)
Ausdruck; (* berechnen *)
WriteString(' = ');
WriteInt(stack[1],2); (* Wert ausgeben *)
END Rechner9.