Materiály k semináři
Úkoly
Vyřešené úkoly budou zkontrolovány na semináří.
RPN kalkulačka
Napište program, který vezme vstupní řetězec (tokeny oddělené mezerou) a vyhodnotí jej jako RPN výraz. Program pracuje se zásobníkem. Čísla se na zásobník ukládají, operátory odebírají potřebný počet operandů, spočítají výsledek a ten vrátí zpět na zásobník.
Požadavky na implementaci
-
Implementujte generickou datovou strukturu
Stack<T>jakostruct(min. metody:push,pop,peek).
Podporované tokeny
3.1 Čísla
Podporujte Int, Double (např. 3, 3.14, -2).
3.2 Binární operátory (2 operandy)
+součet-rozdíl*součin/dělení (dělení nulou musí vyhodit chybu)
3.3 Relační operátory (2 operandy)
Relační operátory vrací 1 pro pravdu a 0 pro nepravdu.
>,<,==
3.4 Unární operátor (1 operand)
negzměna znaménka (např.5 neg→-5)
3.5 Ternární operátor (3 operandy)
Podporujte token ?: ve tvaru:
condition trueValue falseValue ?:
Význam:
- pokud
condition != 0, výsledkem jetrueValue - jinak výsledkem je
falseValue
Pořadí odebírání ze zásobníku při ?::
- odeber
falseValue - odeber
trueValue - odeber
condition - vlož výsledek zpět na zásobník
Validace a chyby
Program musí detekovat a vhodně ošetřit alespoň tyto chyby (přes throws):
- neznámý token (např.
abc) - nedostatek operandů na zásobníku pro daný operátor
- dělení nulou
- po zpracování výrazu nezůstane na zásobníku přesně jedna hodnota (chybný výraz)
Příklady vstupů a očekávané výstupy
5 1 2 + 4 * + 3 - → 14
1 10 20 ?: → 10
0 10 20 ?: → 20
5 3 4 > 100 200 ?: → chyba (zůstane hodnota navíc)
2 3 4 > 100 200 ?: + → 202
10 0 / → chyba (divisionByZero)
Bonus (nepovinné)
- Podpora víceřádkového vstupu a průběžné vyhodnocování
- Podpora proměnných (např.
x=10, pakx 2 *) - Jednotkové testy pro operátory a chybové stavy
- Výpis stavu zásobníku po každém tokenu (trace mód)