Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Lukáš Vámoš:13.3.2018 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.3.2018 11:56
Avatar
Odpovídá na Lukáš Vámoš
Patrik Valkovič:13.3.2018 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
13.3.2018 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.4.2018 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.4.2018 20:48
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na LacoS.
Martin Dráb:22.4.2018 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.4.2018 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.