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
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
Next 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
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
i
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
i
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