Programowanie w języku Delphi » Gotowce

Obliczanie wartości wyrażenia

  • 2012-03-11 20:16
  • 0 komentarzy
  • 2403 odsłony
  • Oceń ten tekst jako pierwszy

Wersja 0.4


Co jest obsługiwane:
-zamiana wyrażenia na ONP oraz obliczanie go
-obsługa nawiasów
-kolejność wykonywania działań
-obsługa funkcji z kilkoma parametrami/jednym/bez niego.
-liczby ujemne

Do zrobienia:
-obsługa stałych i zmiennych

Algorytm używany do zmiany wyrażenia na ONP to tzw. stacja rozrządowa
Po więcej informacji zapraszam np.tutaj: http://pl.wikipedia.org/wiki/Odwrotna_notacja_polska

Kod


http://pastebin.com/YfPbuW2H

Przykładowy program


Uses ExpressionUnit, Dialogs, SysUtils;
Var Expr: TExpressionParser;
Begin
 Try
  Expr := TExpressionParser.Create;
  ShowMessage(FloatToStr(Expr.EvalExpr('2+2*2')));
  Expr.Free;
 Except
 End;
End.


Dostępne metody i zmienne


Function ExprToRPN(Expr: String): String; -> zamienia wyrażenie matematyczne (np.2+2*2) na wyrażenie ONP (np.2 2 2 + *), wynik jest zwracany funkcją oraz zapisywany do RPN.
Function EvalRPN: Extended; -> oblicza wyrażenie ONP znajdujące się w zmiennej RPN
Function EvalExpr(Expr: String): Extended; -> oblicza wyrażenie matematyczne (nie zmienia zawartości zmiennej RPN).
Procedure AddFunction(Name: String; Param: Integer; Execute: TExecute); -> dodaje nową funkcję (patrz niżej).

RPN: String

Przykładowy program zwracający nieobliczone wyrażenie ONP


Uses ExpressionUnit, Dialogs, SysUtils;
Var Expr: TExpressionParser;
Begin
 Try
  Expr := TExpressionParser.Create;
  ShowMessage(Expr.ExprToRPN('2+2*2'));
  Expr.Free;
 Except
 End;
End.


Dodawanie własnych funkcji


Function MojaFunkcja(Param: TParam): Extended;
Begin
 Result := Param[0]*Param[1];
End;
(* ... *)
Var Expr: TExpressionParser;
(* ... *)
Expr.AddFunction('mojafunkcja', 2, @MojaFunkcja);

Sposób:
.AddFunction(nazwa funkcji, liczba parametrów, @funkcja)

Domyślne funkcje


sqrt(x),sin(x),cos(x),tan(x),asin(x),acos(x),atan(x),min(x,y),max(x,y),nww(x,y),nwd(x,y),sqr(x),round(x),pi(),abs(x)


Błędy


 Const ERROR_OK                 = 0;
       ERROR_TOO_MANY_BRACKETS  = 1;
       ERROR_TOO_FEW_BRACKETS   = 2;
       ERROR_INVALID_FUNCTION   = 3;
       ERROR_INVALID_FUNC_PARAM = 4;
       ERROR_WRONG_OPERATORS    = 5;


ErrorCode:

ERROR_OK -> brak błędu
ERROR_TOO_MANY_BRACKETS -> brakuje ErrorInfo nawiasów zamykających
ERROR_TOO_FEW_BRACKETS -> brakuje ErrorInfo nawiasów otwierających
ERROR_INVALID_FUNCTION -> funkcja ErrorString nie istnieje
ERROR_INVALID_FUNC_PARAM -> funkcja ErrorString wymaga ErrorInfo parametrów
ERROR_WRONG_OPERATORS -> błędnie ustawione operatory (w ErrorString znajduje się fragment wyrażenia, w którym jest błąd).