Programátorská úloha 3 – Kalkulačka 1

Termín odovzdania – 7.12.2018 22:00

V pythone existuje veľmi šikovná funkcia eval(), ktorá vyhodnocuje pythonovské príkazy, ktoré jej vo forme reťazca dáme. Tým pádom by v podstate zadarmo vyriešila väčšinu nasledujúcich podúloh. Vo vašom riešení preto nepoužívajte túto funkciu, v podstate sa tvárite, že túto funkciu idete programovať.

Zadanie

Podúloha 1 (3 body)

Na vstupe dostanete reťazec obsahujúci čísla a aritmetické znamienka + (plus) a - (mínus), ktorý popisuje korektný matematický výraz. Vypíšte výsledok tohto výrazu. Pre vstup by ste teda vypísali , pre vstup by ste vypísali . Môžete predpokladať, že zadaný reťazec je korektný a pekný – neobsahuje napríklad žiadne medzery alebo + na začiatku.

Podúloha 2 (4 body)

Na vstupe dostanete reťazec obsahujúci čísla, aritmetické znamienka + a - a písmeno x, ktorý popisuje korektný matematický výraz obsahujúci premennú . Vypíšte výsledok tohto výrazu pre niekoľko náhodne zvolených hodnôt . Opäť predpokladajte, že reťazec je korektný a pekný.

Vašou úlohou je teda naprogramovať funkciu vyhodnot(vyraz, x), ktorej ako argument vložíte zadaný výraz a hodnotu premennej x a ona vám vráti výsledok daného výrazu. Na otestovanie vygenerujte 10 náhodných (aj záporných) celých čísel a vyhodnoťte pre ne výraz.

Napríklad pre reťazec by ste pre vrátili 7, ale pre by ste vypísali 3. Zadané reťazce však môžu byť aj alebo (kedy je výsledok 15 pre ľubovoľné ).

Podúloha 3 (4 body)

Na vstupe dostanete reťazec obsahujúci znaky ( a ), ktorý tvorí korektne uzátvorkovaný výraz. Pre každú otváraciu zátvorku ( nájdite jej prislúchajúcu zatváraciu zátvorku ).

Na korektne uzátvorkovaná výrazy sa môžete pozerať nasledovným spôsobom, ktorý iba formalizuje naše intuitívne chápanie uzátvorkovanosti:

Na výstup vypíšte dvojice čísel, pozíciu otváracej a zatváracej zátvorky, a taktiež uzátvorkovaný výraz, ktorý tvoria. Pre vstup ()(()()) by ste teda vypísali:

0 1 ()
2 7 (()())
3 4 ()
5 6 ()

Optimálne riešenie dokáže nájsť prislúchajúce zátvorky pri jednom prechode zľava doprava, stačí, že si počas toho pamätá správne veci. Pri programovaní nezabudnite, že do listu viete hodnoty pridávať pomocou pole.append(x), ale takisto viete z konca listu ľahko hodnoty vyhadzovať buď pomocou del pole[-1] alebo použitím funkcie pole.pop(), ktorá odstráni posledný prvok poľa. Takisto si určite spomeniete, že časť reťazca vieme vypísať cez print(retazec[zaciatok:koniec]).

Bonusová podúloha (2 body)

Predstavte si, že reťazec, ktorý dostanete v predchádzajúcej podúlohe nemusí byť korektný. Vedeli by ste napísať program/funkciu, ktorá overí korektnosť uzátvorkovania takéhoto výrazu skladajúceho sa zo znakov ( a ). Pre reťazec ()(()) by teda vyhlásil, že je korektný, ale pre ())( by ale povedal, že nie je.

Riešenie a odovzdávanie

Vašou úlohou je vyriešiť všetky zadané podúlohy a naprogramovať program, ktorý ich rieši. K riešeniu mi môžete poslať aj slovný popis, v ktorom vysvetlíte, ako ste pri riešení postupovali. Toto odporúčam hlavne ak sa vám riešenie nepodarilo vymyslieť, alebo si ním nie ste istý.

Jednotlivé programy mi zozipujte a pošlite prostredníctvom mailu s predmetom [5EVL-2018] DU3-prog.

Bodovanie

Za úlohu je možné získať 11 bodov rozdelených medzi jednotlivé podúlohy. Samozrejme, je možné získať čiastočné body, napríklad ak vidím, že ste s riešením išli správnym smerom.

Čo môžete (ne)použiť pri riešení

Samozrejme, neodpisujte jeden od druhého! Kód, ktorý odovzdávate by mal byť váš. Naďalej platí, že ak ste zaseknutý, tak mi treba napísať. No a ako vždy, odporúčam to riešiť skôr ako večer pred deadlinom a poriadne si čítať zadanie. Okrem toho si kreslite, píšte a neprogramujte kým si to poriadne nerozmyslíte. Takisto by som povedal, že občas vám pomôže začať spisovať riešenie, ktoré máte. Lepšie si myšlienky sformulujete, keď ich naozaj spíšete.