Warning
This page is located in archive.

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
courses:b6b36pjc:ukoly:symcalc [2018/12/05 13:23]
jerabma7 Autoupdate to version 62486f0a0e06
courses:b6b36pjc:ukoly:symcalc [2018/12/17 00:37] (current)
jerabma7 Autoupdate to version 0993fcd1fd3b
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