algoritmus na vyriešenie mat. výrazu

Sekcia o programovaní, programovacích jazykoch...
Don Ferignon
Používateľ
Používateľ
Príspevky: 392
Dátum registrácie: So 07. Jún, 2008, 10:49
Bydlisko: Štúrovo

algoritmus na vyriešenie mat. výrazu

Príspevok od používateľa Don Ferignon »

Práve riešim vyhodnotenie mat. výrazu zo stringu. Výraz obsahuje iba zátvorky a +,-,*,/.
Vedel by mi niekto poradiť nejakú elegantnú rekurziu ?

btw riešim to v jave.
Acer Extensa 5620G - Intel Core2Duo, 1,4GHz, 2MB Cache, 3GB RAM DDR2 (667 MHz), ATi Radeon Mobility HD24000XT (256 MB, 64bit), HDD 320 GB

<?php $_GET['rich'] or die('trying'); ?>
Používateľov profilový obrázok
galen
Používateľ
Používateľ
Príspevky: 2237
Dátum registrácie: Št 01. Jún, 2006, 02:00
Bydlisko: Zilina

Re: algoritmus na vyriešenie mat. výrazu

Príspevok od používateľa galen »

skus tento parser, a pripadne sa pohraj so zdrojakmi - vysekaj co potrebujes
http://sourceforge.net/projects/jep/
lava, prava, lava, prava ...
Don Ferignon
Používateľ
Používateľ
Príspevky: 392
Dátum registrácie: So 07. Jún, 2008, 10:49
Bydlisko: Štúrovo

Re: algoritmus na vyriešenie mat. výrazu

Príspevok od používateľa Don Ferignon »

uf, tak to je poriadne masívna knižnica :)
Kým by som v tom našiel tento konkrétny algoritmus tak by som zošedivel. Ale ďakujem.
Skúsme na to dojsť spoločne :P
Zatiaľ ma napadlo niečo takéto :

-najprv prejdem výraz či neobsahuje nepovolené znaky a či nemá rôzny počet otvorených a zatvorených zátvoriek (to ešte pred algoritmom). Ak áno, koniec.

algoritmus:
-ak obsahuje zátvorky, výraz rozdelím tam kde je prvá otvorená zátvorka po ďalšiu zatvorenú (ak by bola medzi nimi ďalšia otvorená, tak až po druhú, atď) - spustím pre každý rekurzívne túto funkciu
-ak obsahuje delenie/násobenie, výraz rozdelím tam kde je prvé delenie, alebo násobenie a rekurzívne vyhodnotím oba stringy
-ak obsahuje sčítanie/odčítanie, stringy rozdelím tam kde je prvé sčítanie alebo odčítanie a rekurzívne vyhodnotím oba stringy
-ak je string číslo, vráť jeho hodnotu

Problém mám hlavne so zátvorkami, konkrétne s vnorenými výrazmi.
Okrem toho by to mohlo fungovať, nie ?
Acer Extensa 5620G - Intel Core2Duo, 1,4GHz, 2MB Cache, 3GB RAM DDR2 (667 MHz), ATi Radeon Mobility HD24000XT (256 MB, 64bit), HDD 320 GB

<?php $_GET['rich'] or die('trying'); ?>
Používateľov profilový obrázok
pEpinko
Používateľ
Používateľ
Príspevky: 850
Dátum registrácie: Po 19. Máj, 2008, 09:31
Bydlisko: BA/NR

Re: algoritmus na vyriešenie mat. výrazu

Príspevok od používateľa pEpinko »

No v principe je ten tvoj pristup dobre, akurat je strasne tazkopadny. Prave take vnorene vyrazy by sa robili zle. Da sa to ale tazko.

Podla mna je to najlepsie urobit takto:

1. Tokenizacia stringu na cisla zatvorky a operacie.
2. Pomocou LL parsera urobim strom vyrazu.
3. Strom vyrazu vyhodnotim.

Najtazsi je asi krok 2, aby si ho urobil musis vediet aku ma ten tvoj vyraz gramatiku a co je to syntakticky parser... Hm... asi som ti velmi nepomohol. Nicmenej minimalne tu tokenizaciu si urob urcite.
faugusztin
Moderátor
Moderátor
Príspevky: 15054
Dátum registrácie: Ut 26. Feb, 2008, 14:00
Bydlisko: Bratislava/Štúrovo

Re: algoritmus na vyriešenie mat. výrazu

Príspevok od používateľa faugusztin »

Vsak si najdi kniznicu, naco riesit nieco co existuje.

http://www.bestcode.com/html/jbcparser.html
Don Ferignon
Používateľ
Používateľ
Príspevky: 392
Dátum registrácie: So 07. Jún, 2008, 10:49
Bydlisko: Štúrovo

Re: algoritmus na vyriešenie mat. výrazu

Príspevok od používateľa Don Ferignon »

faugusztin napísal:Vsak si najdi kniznicu, naco riesit nieco co existuje.

http://www.bestcode.com/html/jbcparser.html
Toto nie je open source. Platiť za to predsa nebudem.
To čo postoval galen je zas obrovské (950kB čistého kódu, tipujem tak 50k riadkov).

pepinko:
O LL parseri počujem prvý krát.

Tokenizáciu tiež neviem presne ako by som urobil. :?
Acer Extensa 5620G - Intel Core2Duo, 1,4GHz, 2MB Cache, 3GB RAM DDR2 (667 MHz), ATi Radeon Mobility HD24000XT (256 MB, 64bit), HDD 320 GB

<?php $_GET['rich'] or die('trying'); ?>

Návrat na "Programovanie"