Ho scritto questo programma per rappresentare curve qualunque esplicitate rispetto alla y:
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:
codice:
Write(Expr);
Apparentemente non serve ad una mazza, invece se lo tolgo il programma smette di funzionare con equazioni che prevedono delle parentesi. Il tutto con il compilatore FreePascal. Qualcuno è in grado di illuminarmi ?