home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1987 / 03 / fkplot4.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-02-03  |  5.4 KB  |  139 lines

  1. {---------------------------------------------------------------------------}
  2. {                            fkplot4.pas                                    }
  3.  
  4. {             Funktion zur Berechnung des Funktionswertes von x:            }
  5.  
  6. FUNCTION Berechnung (q2: Str; x: REAL): REAL;
  7.  
  8. VAR i, j, k: INTEGER;
  9.     cd: INTEGER;
  10.     f1, f2: Str;
  11.     g1, g2, h: REAL;
  12.  
  13. BEGIN
  14.   FOR i := Length(q2)+1 TO 255 DO q2[i]:=' ';
  15.   REPEAT
  16.     i:=1;
  17.     j:=0;
  18.     REPEAT                                  { Suchen der innersten Funktion }
  19.       IF (q2[i] IN ['A'..'Z']) AND (NOT(q2[i] = 'E')) THEN
  20.       BEGIN
  21.         j := i;
  22.         REPEAT
  23.           j := j+1;
  24.         UNTIL (q2[j] IN ['A'..'Z',')']) AND (NOT(q2[j] = 'E'));
  25.         IF q2[j] = ')' THEN
  26.         BEGIN
  27.           IF q2[i] IN ['T'..'Z'] THEN
  28.           BEGIN
  29.             k := i;
  30.             REPEAT
  31.               k := k+1;
  32.             UNTIL q2[k] = ',';
  33.             f1 := Copy(q2, i+2, k-i-2);                   { erstes Argument }
  34.             f2 := Copy(q2, k+1, j-k-1);                  { zweites Argument }
  35.             WHILE f1[1] = ' ' DO Delete(f1, 1, 1);
  36.             WHILE f2[1] = ' ' DO Delete(f2, 1, 1);
  37.             IF f1 = '@' THEN g1 := x ELSE Val(f1, g1, cd);
  38.             IF f2 = '@' THEN g2 := x ELSE Val(f2, g2, cd);
  39.             CASE q2[i] OF                           { Berechnen der jeweils }
  40.               'Z': h := g1+g2;                     { innersten Teilfunktion }
  41.               'Y': h := g1-g2;
  42.               'X': h := g1*g2;
  43.               'W': IF g2 <> 0 THEN
  44.                      h := g1/g2
  45.                    ELSE
  46.                      h := 0;                   { eigentlich:  Fehlermeldung }
  47.               'V': IF g1 > 0 THEN
  48.                      h := Exp(g2*Ln(g1))
  49.                    ELSE IF (g1 = 0) AND (g2 > 0) THEN
  50.                      h := 0
  51.                    ELSE IF (g1 < 0) AND (g2 = Int(g2)) THEN
  52.                      CASE Odd(Trunc(g2)) OF
  53.                        TRUE : h := -Exp(g2*Ln(-g1));
  54.                        FALSE: h := Exp(g2*Ln(-g1));
  55.                      END
  56.                    ELSE
  57.                      h := 0;                   { eigentlich:  Fehlermeldung }
  58.               'U': h := g1-Int(g1/g2)*g2;
  59.               'T': h := Int(g1/g2);
  60.             END;
  61.           END
  62.           ELSE
  63.           BEGIN                                        { Falls Funktion A-S }
  64.             f1 := Copy(q2, i+2, j-i-2);                { Argument           }
  65.             WHILE f1[1] = ' ' DO Delete(f1, 1, 1);
  66.             IF f1 = '@' THEN g1 := x ELSE Val(f1, g1, cd);
  67.             CASE q2[i] OF
  68.               'A': IF g1 = 0 THEN h := 0 ELSE h := g1/abs(g1); { Berechnung }
  69.               'B': h := abs(g1);
  70.               'C': IF (g1 > 0) OR (g1 = Int(g1)) THEN
  71.                      h := Int(g1)
  72.                    ELSE
  73.                      h := Int(g1)-1;
  74.               'D': IF g1 <> 0 THEN
  75.                      h := (Exp(g1)+Exp(-g1))/(Exp(g1)-Exp(-g1))
  76.                    ELSE
  77.                      h := 0;                    { eigentlich: Fehlermeldung }
  78.               'F': h := (Exp(g1)-Exp(-g1))/(Exp(g1)+Exp(-g1));
  79.               'G': h := (Exp(g1)+Exp(-g1))/2;
  80.               'H': h := (Exp(g1)-Exp(-g1))/2;
  81.               'I': h := Pi/2-ArcTan(x);
  82.               'J': h := ArcTan(x);
  83.               'K': IF (g1 >= -1) AND (g1 <= 1) THEN
  84.                      IF g1 = 1 THEN
  85.                        h := 0
  86.                      ELSE IF g1 = -1 THEN
  87.                        h := Pi
  88.                      ELSE
  89.                        h := Pi/2-ArcTan(g1/Sqrt(1-g1*g1))
  90.                    ELSE
  91.                        h := 0;                  { eigentlich: Fehlermeldung }
  92.               'L': IF (g1 >= -1) AND (g1 <= 1) THEN
  93.                      IF g1 = 1 THEN
  94.                        h := Pi/2
  95.                      ELSE IF g1 = -1 THEN
  96.                        h := -Pi/2
  97.                      ELSE
  98.                        h := ArcTan(g1/Sqrt(1-g1*g1))
  99.                    ELSE
  100.                      h := 0;                    { eigentlich: Fehlermeldung }
  101.               'M': IF Sin(g1) <> 0 THEN
  102.                      h := Cos(g1)/Sin(g1)
  103.                    ELSE
  104.                      h := 0;                    { eigentlich: Fehlermeldung }
  105.               'N': IF Cos(g1) <> 0 THEN
  106.                      h := Sin(g1)/Cos(g1)
  107.                    ELSE
  108.                      h := 0;                    { eigentlich: Fehlermeldung }
  109.               'O': h := Cos(g1);
  110.               'P': h := Sin(g1);
  111.               'Q': IF g1 >= 0 THEN
  112.                      h := Sqrt(g1)
  113.                    ELSE
  114.                      h := 0;                    { eigentlich: Fehlermeldung }
  115.               'R': IF g1 > 0 THEN
  116.                      h := Ln(g1)/Ln(10)
  117.                    ELSE
  118.                      h := 0;                    { eigentlich: Fehlermeldung }
  119.               'S': IF g1 > 0 THEN
  120.                      h := Ln(g1)
  121.                    ELSE
  122.                      h := 0;                    { eigentlich: Fehlermeldung }
  123.             END; { of case }
  124.           END; { of else }
  125.           Delete(q2, i, j-i+1);
  126.           Str(h, f1);
  127.           Insert(f1, q2, i);
  128.           i := 254;
  129.         END  { of 'if q2[j]=')'' }
  130.         ELSE
  131.           i:=j-1;
  132.       END;  { of 'if q2[i] in ['A'..'Z']' }
  133.       i := i+1;
  134.     UNTIL i >= Length(q2);
  135.   UNTIL j = 0;            { bis der Term q2 nur noch aus einer Zahl besteht }
  136.   Val(q2, h, cd);
  137.   Berechnung := h;
  138. END;
  139.