2. seminář - Platforma iOS, Jazyk Swift 2

TEACHINGTMAI

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> jako struct (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)

  • neg změ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 je trueValue
  • jinak výsledkem je falseValue

Pořadí odebírání ze zásobníku při ?::

  1. odeber falseValue
  2. odeber trueValue
  3. odeber condition
  4. 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, pak x 2 *)
  • Jednotkové testy pro operátory a chybové stavy
  • Výpis stavu zásobníku po každém tokenu (trace mód)