Zaawansowane CPP/Ćwiczenia 9: Szablony wyrażeń: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Mirek (dyskusja | edycje)
Nie podano opisu zmian
Mirek (dyskusja | edycje)
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 |     
----------</nowiki>
----------


<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.

Rozwiązanie

Ćwiczenie 2

{{{3}}}

Ć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);
Podpowiedź
Rozwiązanie

{{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>
}}