Obliczanie wartości wyrażenia
Patryk27
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
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).