====== 3. úkol - Calculator ======
Vaším třetím úkolem bude vytvoření plnohodnotné kalkulačky. Soubor se kalkulačkou nazvěte: ''calculator.py'' a nahrajte do [[https://cw.felk.cvut.cz/upload|Odevzdávacího systému]].
===== Zadání =====
Vytvořte soubor ''calculator.py'', v kterém naimplementujte následující funkce/operace (v závorce název funkce a počet parametrů, která funkce potřebuje):
- Sčítání (''addition'' 2)
- Odčítání (''subtraction'' 2)
- Násobení (''multiplication'' 2)
- Dělení (''division'' 2)
- Výpočet modula (''modulo'' 2, v našem případě mohou být použita pouze varianty při kterých platí ''x >= y'' a ''y > 0'')
- Výpočet druhé mocniny čísly (''secondPower'' 1)
- Výpočet n-té mocniny čísla (''power'' 2, pořadí: mocněnec, mocnitel, v našem případě mohou být použiti pouze kladní mocnitelé (nula je kladná)) - vracejte typ ''float''.
- Výpočet druhé odmocniny z čísla (''secondRadix'' 1, odmocninu lze provést pouze z kladného celého čísla splňující: ''x > 0'')
- Magický výpočet (''magic'' 4) - operace bude vysvětlena
- Hlavní ovládací funkce (''control'' 5) - funkce bude vysvětlena
Každá z výše uvedených funkcí vrací na výstupu výpočet. V případě, že výpočet nelze provést tak funkce vyhodí **výjímku** ''ValueError('This operation is not supported for given input parameters')''.
K implementaci použijte tuto šablonu: {{:courses:b6b36zal:zadani:calculator.py|}}
* Zamyslete se jaké jsou situace, za kterých nelze výpočet provést u všech výše zmíněných funkcí. Berte v úvahu i mezi výpočty.
* Jelikož některé operace nejsou komutativní, tak pořadí operandů odpovídá pořadí parametrů v hlavičce funkce (např.: ''substraction(a, b)'' provádí ''(a - b)'' a ne ''(b - a)'').
* Nezapomeňte na řádné přetypování proměnných.
==== Magický výpočet ====
Na vstupu přijímá 4 parametry ''x'', ''y'', ''z'', ''k''. Funkce nejprve spočítá ''x + k = l'', ''y + z = m'' a pote vypočte ''((l / m) + 1) = n''. Hodnotu v proměnné ''n'' vrátí na výstupu.
==== Hlavní ovládací funkce ====
Na vstupu přijímá 5 parametrů: ''a'',''x'',''y'',''z'' a ''k'', na výstupu je výsledek konkrétní operace. Funkce vždy obdrží v parametru ''a'' textovou hodnotu na jejím základě se rozhodne co za funkci zavolat. Mapování je následující:
* "ADDITION" = ''addition()''
* "SUBTRACTION" = ''subtraction()''
* "MULTIPLICATION" = ''multiplication()''
* "DIVISION" = ''division()''
* "MOD" = ''modulo()''
* "POWER" = ''power()''
* "SECONDRADIX" = ''secondRadix()''
* "MAGIC" = ''magic()''
Parametry ''x'',''y'',''z'' a ''k'' se poté předají konkrétní funkci v pořadí v jakém byly obdrženy. Pokud funkce vyžaduje pouze jeden parametr předá se jí proměnná ''x'', pokud dva parametry předají se jí ''x'' a ''y'', pokud čtyři parametry, předají se ji ''x'',''y'',''z'' a ''k''. Příklad volání:
''control('ADDITION', 2,3,4,5)'' zavolá funkci ''addition(2,3)'', která spočítá 2+3 = 5. Funkce control tedy vrátí hodnotu 5.
''control('SUBTRACTION', 2,3,4,5)'' zavolá funkci ''subtraction(2,3)'', která spočítá 2-3 = -1. Funkce control tedy vrátí hodnotu -1.
''control('DIVISION', 1,0,4,5)'' zavolá funkci ''division(1,0)'', která zjistí, že dělení nelze provést. Funkce tedy vyvolá výjimku dle zadání: ''ValueError('This operation is not supported for given input parameters')''
Funkce control podporuje pouze funkce vypsané v mapování - pokud by chtěl uživatel volat jakoukoliv jinou funkce tak systém vyvolá opět výjimku: ''ValueError('This operation is not supported for given input parameters')''
==== Hodnocení ====
Za úlohu lze získat maximálně **2 body**.
* Kalkulátor obsahuje všechny potřebné funkce včetně vstupů a výstupů a tyto funkce provádí správně výpočty včetně správnosti magické funkce. (**1 bod**)
* Kalkulátor má správně implementovanou kontrolní funkci control a tato funkce produkuje správné výsledky (**1 bod**)
Za každý započatý týden po deadline (termínu odevzdání) je penalizace 2 body. Záporné body neudělujeme.
Aby jste nemuseli chodit na cvičení, v kterém je tato úloha zadána, tak je potřeba úlohu odevzdat před cvičením a mít za ní plný počet bodů.