![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 78 Pomógł: 9 Dołączył: 2.02.2011 Skąd: undefined Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Chciałem sobie zrobić prosty kalkulator który będzie pobierał od użytkownika wyrażenie arytmetyczne i zwracał jego wynik. Np: Podaję: Kod (10+9)/(11*8) Otrzymuję Kod 0.215909090 Myślałem nad wykorzystaniem do tego wyrażeń regularnych, ale pojawia się pewien problem. Otóż nie bardzo wiem jak wymusić na kwantyfikatorach, aby dzielił mi wyrażenie tylko względem najwyższego znaku tzn. powyższe wyrażenie powinno mi podzielić na: Kod l=(10+9); r=(11*8); sign=/; oczywiście powyższe wyrażenia mogą wyglądać także inaczej. Np można używać na nich prostych funkcji: Kod sin(10+4)/cos(8-11) l=sin(10+4); sign=/; r=cos(8-11); Do tej pory używałem wyrażenia regularnego: Kod /^(?<l>[[:print:]]+)(?<sign>[\*\/\-\+]{1})(?<r>[[:print:]]+)/ Każdą ze stron wyrażenia arytmetycznego będę rozpoznawał rekurencyjnie, i do analizy funkcji mam już wyrażenie regularne Jak można by to najrozsądniej rozwiązać? Ten post edytował shinuexx 27.11.2011, 14:10:33 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Wyrażenia regularne kompletnie nie nadają się do czegoś takiego, tutaj powinieneś wykorzystać normalny parser wyrażeń matematycznych (taki który najpierw rozbija ciąg na tokeny, a następnie tworzy z nich drzewo wyrażeń):
Kod sin(10+4)/cos(8-11) Dzięki temu będziesz mieć możliwość wyłapywania błędów składni, ustalania pierwszeństwa operatorów itd.
Tokeny: sin, (, 10, +, 4, ), /, cos, (, 8, -, 11, ) Drzewo wyrażeń: "/" / \ sin cos | | 10 + 4 8 - 11 Ten post edytował Crozin 27.11.2011, 14:07:31 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 14.10.2025 - 02:55 |