Zaawansowane CPP/Ćwiczenia 9: Szablony wyrażeń: Różnice pomiędzy wersjami
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 39: | Linia 39: | ||
| 1 | 0 || 0 | | | 1 | 0 || 0 | | ||
| 1 | 1 || 1 | | | 1 | 1 || 1 | | ||
-------------- | --------------</nowiki> | ||
</nowiki> | |||
a | a | ||
Linia 98: | Linia 97: | ||
| 0 || 0 | | | 0 || 0 | | ||
| 1 || 1 | | | 1 || 1 | | ||
---------- | ---------- | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none"> | ||
Linia 130: | Linia 129: | ||
Patrz plik [http://osilek.mimuw.edu.pl/images/9/9c/Pown.h pown.h]. | Patrz plik [http://osilek.mimuw.edu.pl/images/9/9c/Pown.h pown.h]. | ||
</div></div> | </div></div> | ||
}} | }}</nowiki> |
Wersja z 12:49, 21 wrz 2006
Ćwiczenie 1
Zaimplementuj szablony funkcji table1, table2 i table3, generujące tabele prawdy dla jednej, dwu lub trzech zmiennych logicznych. Argumentem tych funkcji ma być funkcja przyjmująca, w zależności od funkcji, od 1 do 3 argumentów typu bool, np.:
bool And(bool q,bool r) {return q && r;} table2(And2) ;
powinno wygenerować :
-------------- | 0 | 0 || 0 | | 0 | 1 || 0 | | 1 | 0 || 0 | | 1 | 1 || 1 | --------------
Podobnie dla table1 i table3.
Ćwiczenie 2
Ćwiczenie 3
Zaimplementuj szablon funkcji, który będzie przyjmował jako jeden z parametrów szablonu ilość zmiennych logicznych i będzie łączył działanie funkcji table1, table2 i table3. Np.:
table<2>(And);
powinno być równoważne wywołaniu:
table2(And);
{{cwiczenie|2||
Napisz szablony wyrażeń, które będzie można użyć
z powyższymi szablonami. Zaimplementuj trzy klasy First, Second i Third, oznaczające odpowiednio pierwszy, drugi i trzeci argument funkcji logicznej. Zaimplementuj operatory &&
(i), ||
(lub), !
(zaprzeczenie),
>>
(implikacja) i ==
(równoważność) oraz możliwość korzystania ze stałych logicznych True i False. Np.:
First q; Second r; table2(q >> r);
powinno wygenerować:
-------------- | 0 | 0 || 1 | | 0 | 1 || 1 | | 1 | 0 || 0 | | 1 | 1 || 1 | --------------
a
table1(True == q);
powinno wygenerować:
---------- | 0 || 0 | | 1 || 1 | ---------- <div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none"> Implementujemy rekurencyjną definicję potęgi: <center><math>\displaystyle N^M=N*N^{M-1},\quad N^0=1 </math></center> template<size_t N,size_t M> struct pow { enum {val=N*pow<N,M-1>::val}; };<br> template<size_t N> struct pow<N,0> { enum {val=1}; }; Dla przyspieszenia dodajemy dwie specjalizacje: template<size_t M> struct pow<1,M>{ enum {val=1}; };<br> template<size_t M> struct pow<0,M>{ enum {val=0}; }; Powyższa specjalizacja spowoduje, że konkretyzacja <tt>Pow<0,0></tt> będzie niejednoznaczna. Możemy to tak zostawić, bo <math>0^0</math> jest nieokreślone. Jeśli jednak zdecydujemy się na jakąś wartość, np. zero, to należy dodać jeszcze jedną specjalizację: template<> struct pow<0,0>{ enum {val=0}; }; Patrz plik [http://osilek.mimuw.edu.pl/images/9/9c/Pown.h pown.h]. </div></div> }}