Avatar
Lukáš Vámoš:13. března 11:56

Ahoj,

chtěl bych vás poprosit o radu jak vyhodnotit aritmetický výraz z řetězce s operátory +-*/, se závorkami a případně i jednoduchými jedno a dvouparametrovými funkcemi. Vím, že by bylo dobré uložit jednotlivé výrazy do binárního stromu, ale dělá mi problém pochopit, cokde v tom stromu má být a jak pak probíhá ten výpočet. Upozornuji, že jsem nevidomý, takže obrázky mi nepomůžou.

Budu vděčný za každou pomoc.
Luky

 
Odpovědět 13. března 11:56
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Lukáš Vámoš
patrik.valkovic:13. března 12:20

Zdravím,
nejjednodušším přístupem je rozdělit řetězec na jednotlivé entity - čísla, + - * /, závorky, funkce atd.
To uložit do nějakého pole a toto pole opakovaně procházet podle priority operátorů. Například pole [1 + 3 * 2 + 5]. Největší prioritu má násobení, tedy provedeš operaci a nahradíš za hodnotu, vznikne ti pole [1 + 6 + 5], teď zase nahradíš první plus [7 + 5] a nakonec zbývající plus [12] a máš výsledek. To je taková dřevorubecká metoda.
Mnohem lepší je použít formální gramatiky, které ti rovnou vytvoří strom. Tady je spousta teorie, kterou už si určitě najdeš sám (hledej formal grammars). https://github.com/…ooleanParser tady najdeš co jsem psal parser logických výrazů (v Javě) a https://gist.github.com/…24d2d9148b64 tady parser aritmetických výrazů (v Pythonu, ale je tam špatná gramatika, takže úplně nefungují priority vyhodnocení).

Nahoru Odpovědět  +1 13. března 12:20
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
LacoS.
Člen
Avatar
Odpovídá na Lukáš Vámoš
LacoS.:22. dubna 20:48

Vhodne riesenie je nastudovat si polsku notaciu zapisu vyrazov. Vysledkom bude, ze vies vyhodnotit vyraz az po vysledok. Ak vyhodnotenie nebude mozne, vyraz ma nespravny zapis.

 
Nahoru Odpovědět 22. dubna 20:48
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na LacoS.
Martin Dráb:22. dubna 22:23

Ano, výraz můžeš převést do postfixu (reverzní polské notace) a následně vyhodnotit. Jaksi nás učí zapisovat výrazy v infixu, což není zrovna ideální formát pro vyhodnocování.
https://en.wikipedia.org/…ish_notation

Nahoru Odpovědět 22. dubna 22:23
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.