Warning
This page is located in archive. Go to the latest version of this course pages.

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
courses:b6b36pjc:ukoly:symcalc [2018/11/27 14:29]
jerabma7 Autoupdate to version 47549b6b6497
courses:b6b36pjc:ukoly:symcalc [2018/12/17 00:37]
jerabma7 Autoupdate to version 0993fcd1fd3b
Line 47: Line 47:
 /* keep the long lines, dokuwiki is stupid */ /* keep the long lines, dokuwiki is stupid */
  
-  * Vytvořte potomky třídy ''​expr_base''​ pro každou operaci (můžete ​samozřejmě ​použít ​pomocné mezičlánky). [''​expr_impl.cpp''​ a ''​expr_impl.hpp''​]+  * Vytvořte potomky třídy ''​expr_base''​ pro každou ​matematickou ​operaci (samozřejmě ​to mohou být nepřímí potomci, tedy "vnoučata"). [''​expr_impl.cpp''​ a ''​expr_impl.hpp''​]
     * Implementujte metodu ''​write''​. Všechny ostatní implementujte pomocí dummy kódu ''​throw std::​logic_error("​not implemented yet"​);''​.     * Implementujte metodu ''​write''​. Všechny ostatní implementujte pomocí dummy kódu ''​throw std::​logic_error("​not implemented yet"​);''​.
   * Implementujte přetížené operátory (+, -, *, /, ==, %%<<​%%) a funkce (sin, cos, log, pow) pro třídu ''​expr''​. Dále implementujte statické metody ''​expr::​number''​ a ''​expr::​variable''​ [''​expr.cpp''​]   * Implementujte přetížené operátory (+, -, *, /, ==, %%<<​%%) a funkce (sin, cos, log, pow) pro třídu ''​expr''​. Dále implementujte statické metody ''​expr::​number''​ a ''​expr::​variable''​ [''​expr.cpp''​]
Line 61: Line 61:
  
   * Implementujte metodu ''​evaluate''​. Měly by začít procházet testy ze sekce "​Evaluate"​.   * Implementujte metodu ''​evaluate''​. Měly by začít procházet testy ze sekce "​Evaluate"​.
-  * Definujte konstanty ''​expr::​ZERO'',​ ''​expr::​ONE''​.+  * <del>Definujte konstanty ''​expr::​ZERO'',​ ''​expr::​ONE''​.</​del>​ Konstanty ''​expr::​ZERO'',​ ''​expr::​ONE''​ jsou už definované v ''​expr.cpp''​.
   * Implementujte metodu ''​derive''​. Příslušné testy by měly začít procházet.   * Implementujte metodu ''​derive''​. Příslušné testy by měly začít procházet.
   * Implementujte metodu ''​equals''​. Zde se bude hodit ''​dynamic_cast''​.   * Implementujte metodu ''​equals''​. Zde se bude hodit ''​dynamic_cast''​.
Line 258: Line 258:
 (+ x x) (+ x x)
 > sin(0.5*x) > sin(0.5*x)
 +0.841471
 (* (cos (* 0.5 x)) 0.5) (* (cos (* 0.5 x)) 0.5)
 > x/y > x/y
Line 272: Line 272:
 chyba a další příkazy se pro tento výraz již nevykonávají. Program ale pokračuje chyba a další příkazy se pro tento výraz již nevykonávají. Program ale pokračuje
 dál čtením dalšího výrazu ze standardního vstupu. dál čtením dalšího výrazu ze standardního vstupu.
 +
 +==== Příklad výrazového stromu ====
 +
 +/* mezery kolem názvu způsobí zarovnání na střed */
 +{{ :​courses:​b6b36pjc:​ukoly:​symcalc_expr_tree.png }}
 +Takto vypadá výrazový strom (expression tree) pro výraz "​sin(x) + 2*6". Každý
 +uzel stromu je sám o sobě výrazem (a tedy jde vypsat, zderivovat, vyhodnotit,
 +atd.) a obsahuje své podvýrazy (pokud nějaké má).
  
 ===== Bonusy ===== ===== Bonusy =====
Line 392: Line 400:
 s temi, co běží v odevzdávacím systému, ale jsou jednodušší a flexibilnější k použití. s temi, co běží v odevzdávacím systému, ale jsou jednodušší a flexibilnější k použití.
 V CMakeLists jsou definované jako target ''​tests-runner-direct''​. V CMakeLists jsou definované jako target ''​tests-runner-direct''​.
 +
 +===== Rady =====
 +
 +==== Rozdíl mezi expr a expr_base ====
 +
 +V šabloně úkolu jsou dvě třídy výrazů -- ''​expr''​ a ''​expr_base''​. Třída ''​expr_base''​
 +slouží jako vlastní //​interface//​ -- definuje (čistě) virtuální metody, které
 +musí její potomci (jednotlivé typy výrazů) implementovat.
 +
 +Naproti tomu třída ''​expr''​ slouží jako tenký wrapper nad ''​std::​shared_ptr<​expr_base>'',​
 +který je její jedinou datovou položkou. Význam této třídy je dvojí:
 +  * Umožnit intuitivní psaní ''​expr''​ místo ''​std::​shared_ptr<​expr_base>''​.
 +  * Umožnit použití přetížených operátorů a funkcí.
 +
 +Pro první účel by se alternativně dalo využít typových aliasů (''​typedef''​),​
 +nicméně ''​expr''​ by pak byl identický s ''​std::​shared_ptr<​expr_base>''​ -- měl
 +by všechny jeho veřejné metody a přetížené operátory by pracovaly nad tímto
 +''​shared_ptr''​ (a potenciálně by nám překážely operátory definované už pro
 +obecný ''​shared_ptr''​). Toto zapouzdření pomocí kompozice vytváří nový typ a
 +máme plnou kontrolu nad tím, jaké operace bude podporovat. V C%%++%% toto navíc
 +nemá žádný //​performance overhead//. Třída ''​expr''​ je tedy ta, kterou by měla
 +používat většina kódu.
  
courses/b6b36pjc/ukoly/symcalc.txt · Last modified: 2018/12/17 00:37 by jerabma7