Rozbijanie ciagu znakow na osobne wyrazenia

0

Witam, w sumie to nie wiedzialem jaki dac tytul do mojego problemu, wiec od razu mowie : sorry.

A moj problem przedstawia sie nastepujaco :
Mam funkcje :

function TForm1.WartoscFunkcji(x:real):double;
var znak : array
begin
  result:=cos(x)*2+2;
end;

jest ona potem wykorzystywana do rysowania funkcji wykresu, jednak zeby zmienic funkcje(np. z cos(x)*2+2 na x^2) trzeba wejsc do zroda i ponownie skompilowac program.

Jak rozbic podany ciąg znaków (user wpisuje wzór do TEdit) na pojedyncze znaki i wstawic je tak aby powyzsza funkcja zadzialala, bo jak widac StrToFloat() nie pomoze gdyz we wzorze funkcji moga znajdowac sie znaki : + - / * ^ no i wtedy oczywiscie wywala blad.
Tak wiec jak to rozbic zeby zadzialalo ? :| reszty programu nie moge za bardzo zmienic, a nie pomyslalem o tym predzej, problem pojawil sie gdy skonczylem praktycznie 90% programu :/

0

odwrotna notacja polska

0

eh... obawialem sie tego - czemu ? - poniewaz nie rozumiem za dobrze RPN :/

//---------------------------------------

Poszukalem na google i jak przeksztalcac postac infiksowa wyrazenia do ONP, ale co dalej ??
Jak wyglada algorytm ktory obliczy mi to wyrazenie ?
x^2 + 3
w ONP : x2 3+
no ale jak to obliczyc ? Bo nadal nie mam tego jak podstawic do w/w funkcji :/

ehh... po prostu nie mam pojecia na temat ONP i jak mozna by ją zastosowac :/

Prosze was o pomoc.

0

Wiem, czytalem to, ale nadal nie wiem jak moge zastosowac ONP do mojego problemu ! Wrr...
Ze musze podstawic wyrazenie np. 2x+3 ktore user wpisuje do TEdit
do :

function TForm1.WartoscFunkcji(x:real):double;
var znak : array
begin
result:=TUTAJ_WYRAZENIE_Z_TEDIT;
end;

a to potem jest wykorzystywane do rysowania funkcji. Jezeli na zywca wpisze 2x+3 to zadziala - ale jak skonwertowac tego stringa, zeby zadzialal w tej funkcji skoro zwraca ona typ DOUBLE :/

// zeby bylo jasne :
co mam zrobic zeby tekst z TEdit := '2x+3' podstawic w miejsce result:= TUTAJ_WYRAZENIE_Z_TEDIT -> jak do tego wykorzystac ONP.

0

Trzeba "wymusić" od usera wprowadzanie danych w ONP. Zrób mu interfejs jak w kalkulatorze na przykład.

0

po pierwsze wymuś na userze zapis 2*x+3 a nie 2x+3, po drugie jeśli user ma mieć możliwość używania nawiasów to ONP jest najprostszym z sensownych wyjść. Co daje ONP - nie ma nawiasów, nie ma kolejności działań - lecisz odlewej do prawej i tyle. Mały przykład:

2x+3
x 2 * 3 +
a dla komputera (i Ciebie jako programisty) lepszy byłby taki zapis
$x$2$
$3$+$
$ to oczywiście dowolny znak, ważne jednak aby nie mógł on wystąpić w wyrażeniu podawanym przez usera. Zapobiega to błędą przy zamianie np.
2*3, w ONP
2 3 *, gdzie spacje to śliska sprawa i może Ci wyjść 23 *

Potem mając wyrażenie w ONP jedziesz od lewej i szukasz pierwszego znaku działania, jak go znajdziesz to szukasz pierwszej na lewo liczby oraz następnej na lewo i wykonujesz odpowiednie działanie a wynik wpisujesz w miejsce tych dwóch liczn i znaku i tak w kółko aż zostanie CI tylko jedna liczba - wynik. Na przykładzie będzie jaśniej

4 2 * 3 +
^ ^ ^
| | | 4*2
-----
    8 3 +
    ^ ^ ^
    | | | 8+3
    -----
      11
0

Dzieki Misiekd, mniej wiecej zczailem o co chodzi, jutro jeszcze nad tym poglowkuje bo dzis juz mi mozg szwankuje :/ i nie moge racjonalnie myslec, thx jeszcze raz.

0

Ew. musisz zrobić funkcję zmieniającą zawartość Edita na ONP. Co do spacji tabulacji i innych badziewów możesz przed konwersją notacji użyć prostej funkcji wycinajacej wszystkie "białe" znaki. Akurat twój problem to klasyczna ONP, chyba że program będzie robił wykresy tylko 1 lub 2 rodzajów funkcji np liniowa i kwadratowa (wówczas możesz użyć jakiegoś przełacznika i udostępnić użytkownikowi gotowy wzór z pustymi polami edit do wprowadzenia wartości, a następnei podstawić do z góry ustalonego wzoru). Jeśli nie masz ejdnak tego drugiego przypadku to ONP jest koniecznością - a właściwie uproszczeniem.
Gość może wpisać:
a2+2ab+b2
aa+a(2b)+bb
(a+b)^2
b*(a*(2+a/b)+b)
Niby to samo a ile kłopotu, jeśli nie zmusi się użytkownika do ustalonego formatu to rozpoznawanie typu równania może przyprawić o ból głowy - ONP załatwia sprawę.
Andrzej Dąbrowski

1 użytkowników online, w tym zalogowanych: 0, gości: 1