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.
algoritmus na vyriešenie mat. výrazu
-
- 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
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'); ?>
<?php $_GET['rich'] or die('trying'); ?>
Re: algoritmus na vyriešenie mat. výrazu
skus tento parser, a pripadne sa pohraj so zdrojakmi - vysekaj co potrebujes
http://sourceforge.net/projects/jep/
http://sourceforge.net/projects/jep/
lava, prava, lava, prava ...
-
- 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
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
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 ?
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
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'); ?>
<?php $_GET['rich'] or die('trying'); ?>
Re: algoritmus na vyriešenie mat. výrazu
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.
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.
-
- Moderátor
- Príspevky: 15054
- Dátum registrácie: Ut 26. Feb, 2008, 14:00
- Bydlisko: Bratislava/Štúrovo
-
- 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
Toto nie je open source. Platiť za to predsa nebudem.faugusztin napísal:Vsak si najdi kniznicu, naco riesit nieco co existuje.
http://www.bestcode.com/html/jbcparser.html
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'); ?>
<?php $_GET['rich'] or die('trying'); ?>