CourseWare Wiki
Switch Term
Winter 2021 / 2022
Winter 2020 / 2021
Winter 2019 / 2020
Winter 2018 / 2019
Older
Search
Log In
b181
courses
b6b36pjc
ukoly
symcalc
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.
View differences:
Side by Side
Inline
Go
Link to this comparison view
Both sides previous revision
Previous revision
2018/12/17 00:37 jerabma7 Autoupdate to version 0993fcd1fd3b
2018/12/05 13:23 jerabma7 Autoupdate to version 62486f0a0e06
2018/11/27 14:29 jerabma7 Autoupdate to version 47549b6b6497
Go
2018/12/17 00:37 jerabma7 Autoupdate to version 0993fcd1fd3b
2018/12/05 13:23 jerabma7 Autoupdate to version 62486f0a0e06
2018/11/27 14:29 jerabma7 Autoupdate to version 47549b6b6497
Go
courses:b6b36pjc:ukoly:symcalc [2018/12/05 13:23]
jerabma7
Autoupdate to version 62486f0a0e06
courses:b6b36pjc:ukoly:symcalc [2018/12/17 00:37]
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