home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------------------------- *)
- (* Demo-Programm zum Einsatz von "CALC" *)
- (* ----------------------------------------------------------------------- *)
-
- (*$A-*) (* fuer Turbo Pascal: rekursiven Code erzeugen *)
-
- PROGRAM CalcDemo (Input, Output);
-
- CONST
- (*$I CALCCONS.PAS *)
-
- TYPE
- (*$I CALCTYPE.PAS *)
-
- VAR
- a, b, dx : REAL;
- dummy : REAL;
- Formula : Calc_String; (* Ausdruck als Zeichenfolge *)
- FormProg : Calc_Prog; (* der uebersetzte Ausdruck *)
- x : Calc_VarTab; (* die dazugehoerende Variablen-Tabelle *)
- (*$I CALCVAR.PAS *)
-
- (*$I CALCUTIL.PAS *) (* Hilfsmittel fuer Calc *)
- (*$I MATHFUNC.PAS *) (* Erweiterte Funktionen vereinbaren *)
- (*$I CALC.PAS *) (* CALC verfuegbar machen *)
-
- BEGIN
- WriteLn; WriteLn; WriteLn;
- WriteLn('Demo: CALC - ein Mathe-Compilerchen in Pascal!');
- WriteLn(' (C) 1987 PASCAL INT.');
- x := NewVarTab; (* Variablentabelle fuer Ausdruck erzeugen *)
- dummy := AddToVarTab(x,'X'); (* Variable "X" vereinbaren *)
- CalcDecMod := TRUE; (* nur vereinbarte Variablen zulassen *)
- REPEAT
- WriteLn; WriteLn;
- WriteLn('Bitte den auszuwertenden Ausdruck eingeben:'); WriteLn;
- Write('f(x) = '); ReadLn(Formula); WriteLn;
- CompileExpression(Formula, x, FormProg); (* Formel uebersetzen *)
- IF CalcResult THEN
- BEGIN
- WriteLn('Ausdruck "',Formula,'" korrekt uebersetzt...');
- WriteLn;
- Write('Berechnung von f(x) zwischen a = '); Read (a);
- Write(' und b = '); Read (b);
- Write(' mit Schrittweite dx = '); ReadLn (dx);
- WriteLn;
- WHILE (a <= b) DO (* Berechnung der Funktionswerte *)
- BEGIN
- (* Wert in Var.-Tabelle uebernehmen. Direkte Zuweisung an
- das entsprechende Feld-Element wuerde schneller gehen! *)
- AssignVar(x,'X',a);
- WriteLn('f(',a:1:4,') = ',
- CalcExpression(FormProg, x):1:4);
- a := a+dx
- END;
- KillExpression(FormProg); (* keinen Muell entstehen lassen ! *)
- END
- UNTIL Formula = '';
- KillVarTab(x);
- WriteLn('Demo beendet...');
- END.