Diskuze: Vyhodnocení aritmetického výrazu v céčku
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 4 zpráv z 4.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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í).
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.
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
Zobrazeno 4 zpráv z 4.