Seminář 9

Témata

Kolekce

Výjimky

Checked vs unchecked

Úkoly

  1. Implementujte ji nejprve jako metodu int rpnCalc(String expr), kde jako argument bude předaný výraz v postfixové notaci (např. “1 2 3 + +” nebo “1 32 + 42 * 5 + 66 -”) a na výstupu bude hodnota výrazu. Kalkulačka by měla fungovat následovně:
    • Výraz je rozložen na jednotlivé atomy a potom je procházen zleva doprava.
    • Pokud je nejlevější prvek číslo, je jeho hodnota uložena na zásobník, je-li to operátor, jsou odebrány ze zásobníku dvě hodnoty a je provedena příslušná operace.
    • Výsledná hodnota je uložena na zásobník.
    • Zatím uvažujme pouze celá čísla a binární operace +, -, *, /.
  2. Rozšiřte předchozí úkol tak, aby metoda int rpnCalc(String expr, Map <String, Integer> variables) měla ještě jeden argument představující vazby proměnných. Pokud bude nalezen atom představující proměnnou, bude příslušná hodnota uložena na zásobník.
    Např. 1 foo + přečte hodnotu foo z argumentu variables, zvýší ji o jedna a vrátí výsledek.
  3. Rozšiřte/upravte RPN kalkulačku tak, aby měla následující vlastnosti:
    1. Metoda by měla umět vyhodnocovat výrazy s celými čísly (např. 1, 12, -123) i s čísly s plovoucí řádovou čárkou (např. 1.0, 2.23, 45.56, -78.123). Pokud dojde k sečtení (odečtení, atd.) dvou čísel, kde jedno je číslo s plovoucí řádovou čárkou, výsledkem je číslo s plovoucí řádovou čárkou.
    2. Přidejte podporu pravdivostních hodnot reprezentovaných literály (#t, #f) a přidejte operátory <, > =, !=, <=, >=, porovnávající čísla a pravdivostní hodnoty. Pokud hodnoty nejde porovnat, skončí metoda vyjímkou.
    3. Přidejte ternární operátor ?, který odebere z vrcholu zásobníku pravdivostní hodnotu a dvě další hodnoty. Pokud byla na vrcholu zásobníku hodnota #t, vrátí druhou odebranou hodnotu, jinak vrátí třetí. Pokud na vrcholu zásobníku nebude pravdivostní hodnota, skončí metoda vyjímkou.
  4. Program napište tak, aby adekvátně ošetřil i další chybové stavy, např. dělení nulou, špatně zapsaný výraz, atd. a aby nebyl realizován jako jedna metoda, byl řádně rozčleněn a dokumentován.
  5. Výsledek odevzdejte emailem s předmětem jj1-09 na tomas.urbanec@upol.cz do 12.12.2023, 14:59 CEST. Odevzdávejte pouze zdrojové kódy, nikoliv celé projekty vygenerované IDE.

Příklady použití:

Výraz Výsledek Komentář
1.1 2 + 3.1
1 2 + 3
1 2 + 4 * 6 + 18 (((1 + 2) * 4) + 6)
1 foo + 3 Pokud variables obsahují klíč foo s hodnotou 2
1.1 2 < #t
#f #t < #t
#f #t > #f
1 foo + Exception Pokud variables neobsahují klíč foo
1 #f = Exception Neporovnatelné hodnoty
1 2 3 4 < ? 2
1 2 3 4 + ? Exception 7 není pravdivostní hodnota
1 0 / Exception Dělení nulou