Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423

    [Pascal] Aiuto rappresentazione curve

    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 ?

  2. #2
    In effetti l'assenza dell'istruzione non dovrebbe compromettere il funzionamento del programma , trattandosi di un semplice output

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Infatti è assolutamente assurdo. Eppure succede. Deve esserci qualcosa che non so riguardo alla funzione Write oppure qualche cosa che mi sfugge riguardo all'esecuzione.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Ho risolto il problema, anche se non ne ho capito benissimo la causa. Comunque il problema era la funzione Trim che era scritta male.

  5. #5
    Ho provato a testarlo ma mi segnala 2 warning in corrispondenza delle seguenti istruzioni nella funzione EvalExpr:

    codice:
    Val(Copy(Expr, LastP, i-LastP), Values[CurVal]);
    .....
    Val(Copy(Expr, LastP, i-LastP+1), Values[CurVal]);
    inoltre non mi disegna la funzione

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Originariamente inviato da king64
    Ho provato a testarlo ma mi segnala 2 warning in corrispondenza delle seguenti istruzioni nella funzione EvalExpr:

    codice:
    Val(Copy(Expr, LastP, i-LastP), Values[CurVal]);
    .....
    Val(Copy(Expr, LastP, i-LastP+1), Values[CurVal]);
    inoltre non mi disegna la funzione
    Strano perchè a me funziona perfettamente.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.