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).