codice:
PROGRAM CURVE;
USES CRT, Graph;
VAR XScale, YScale: Real;
PROCEDURE DrawPoint(x, y: real);
VAR x1, y1: Longint;
BEGIN
x1 := Round(x * 320 / XScale) + 320;
y1 := 240 - Round(y * 240 / YScale);
If (x1 > 0) AND (x1 < 640) AND (y1 > 0) AND (y1 < 480) Then
PutPixel(x1, y1, 15);
END;
FUNCTION Trim(str: String[200]): String[200];
VAR i, j: Integer;
Result: String[200];
BEGIN
j := 1;
FOR i := 1 TO Length(str) DO
IF str[i] <> ' ' THEN BEGIN
Result[j] := str[i];
j := j + 1;
END;
Trim := Copy(Result, 1, j-1);
END;
FUNCTION EvalExpr(Expr: String[200]; x: Real): Real;
VAR LastP, CurVal, TotalVal, i, j, Annidamento: Integer;
Result: Real;
Values: ARRAY[1..100] OF Real;
Ops: ARRAY[1..100] OF Char;
BEGIN
Expr := Trim(Expr);
Expr := Upcase(Expr);
Expr := Copy(Expr, 1, Length(Expr));
Write(Expr);
CurVal := 1;
LastP := 1;
Annidamento := 0;
FOR i := 1 TO Length(Expr) DO BEGIN
IF (Expr[i] = '(') THEN Annidamento := Annidamento + 1;
IF (Expr[i] = ')') THEN Annidamento := Annidamento - 1;
IF ((Expr[i] = '+') OR (Expr[i] = '-') OR (Expr[i] = '*') OR (Expr[i] = '/')) AND (Annidamento = 0) THEN BEGIN
IF Copy(Expr, LastP, i-LastP) = 'X' THEN
Values[CurVal] := x
ELSE IF (Expr[LastP] = '(') AND (Expr[i-1] = ')') THEN
Values[CurVal] := EvalExpr(Copy(Expr, LastP+1, i-LastP-2), x)
ELSE
Val(Copy(Expr, LastP, i-LastP), Values[CurVal]);
Ops[CurVal] := Expr[i];
LastP := i+1;
CurVal := Curval+1;
END;
END;
IF Copy(Expr, LastP, i-LastP+1) = 'X' THEN
Values[CurVal] := x
ELSE IF (Expr[LastP] = '(') AND (Expr[i] = ')') THEN
Values[CurVal] := EvalExpr(Copy(Expr, LastP+1, i-LastP-1), x)
ELSE
Val(Copy(Expr, LastP, i-LastP+1), Values[CurVal]);
TotalVal := CurVal;
i := 1;
WHILE i < TotalVal DO BEGIN
IF (Ops[i] = '*') OR (Ops[i] = '/') THEN BEGIN
IF Ops[i] = '*' THEN
Values[i] := Values[i] * Values[i+1]
ELSE BEGIN
IF Values[i+1] = 0 THEN
Values[i] := 0
ELSE
Values[i] := Values[i] / Values[i+1];
END;
FOR j := i+1 TO TotalVal-1 DO
Values[j] := Values[j+1];
FOR j := i TO TotalVal - 2 DO
Ops[j] := Ops[j+1];
TotalVal := TotalVal-1;
i := i-1;
END;
i := i + 1;
END;
Result := Values[1];
FOR i := 1 TO TotalVal - 1 DO BEGIN
IF Ops[i] = '+' THEN
Result := Result + Values[i+1]
ELSE
Result := Result - Values[i+1];
END;
EvalExpr := Result;
END;
VAR GraphDriver, GraphMode, i, j: Integer;
x, y: Real;
Expr: String[200];
BEGIN
Clrscr;
Write('Scegliere la scala per l''asse x: ');
Readln(XScale);
Write('Scegliere la scala per l''asse y: ');
Readln(YScale);
Writeln('Scrivere l''equazione in forma esplicita: ');
Write('y=');
Readln(Expr);
GraphDriver := VGA;
GraphMode := VGAHi;
InitGraph(GraphDriver, GraphMode, 'C:\BP\BGI');
Line(0, 240, 640, 240);
Line(320, 0, 320, 480);
FOR i := 1 TO 39 DO BEGIN
Line(i*16, 238, i*16, 242);
Line(318, i*12, 322, i*12);
FOR j := 1 TO 39 DO PutPixel(i*16, j*12, 15);
END;
x := -XScale;
WHILE x <= XScale DO BEGIN
y := EvalExpr(Expr, x);
x := x + (XScale/10000);
DrawPoint(x, y);
END;
Readln;
END.
A parte che non ne capisco una mazza di Pascal e quindi il programma è orribile e raffazonato, ma ho un problema concreto. A linea 40, c'è l'istruzione: