Zaawansowane CPP/Ćwiczenia 8: Metaprogramowanie: 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 20: Linia 20:
powinno mieć wartość 81.
powinno mieć wartość 81.
}}
}}
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </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">Podpowiedź</span><div class="mw-collapsible-content" style="display:none">
Najpierw zaimplementuj szablon liczący dowolną (całkowitą)  
Najpierw zaimplementuj szablon liczący dowolną (całkowitą)  
potęgę liczby całkowitej.
potęgę liczby całkowitej.
</div></div>
</div></div>
{{cwiczenie|3||   
{{cwiczenie|3||   


Wymyśl i zaimplementuj jako metaprogramszybszy algorytm funkcji <code><nowiki>pow(x)</nowiki></code>.
Wymyśl i zaimplementuj jako metaprogram szybszy algorytm funkcji <code><nowiki>pow(x)</nowiki></code>.
}}
}}
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </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">Podpowiedź</span><div class="mw-collapsible-content" style="display:none">
<center><math>\displaystyle  
<center><math>\displaystyle  
x^{(2 n)} = (x^2)^n,\quad x^{(2 n+1)} = x (x^2)^n
x^{(2 n)} = (x^2)^n,\quad x^{(2 n+1)} = x (x^2)^n
Linia 35: Linia 36:
{{cwiczenie|4||  
{{cwiczenie|4||  


Napisz szablon generujący, pierwsze <math>N</math> wyrazów rozwinięcia funkcji
Napisz szablon generujący pierwsze <math>N</math> wyrazów rozwinięcia funkcji
<math>sin(x)</math>:
<math>sin(x)</math>:
<center><math>\displaystyle  
<center><math>\displaystyle  
\sin</math> <N> <math> \displaystyle  (x)=x-\frac{x^3}{3!}+\cdots +(-1)^{N+1}\frac{(x)^{2N-1}}{(2N-1)!}
\sin</math> <N> <math> \displaystyle  (x)=x-\frac{x^3}{3!}+\cdots +(-1)^{N+1}\frac{(x)^{2N-1}}{(2N-1)!}
</math></center>
</math></center>
Możesz skorzystać z rozwiązania wcześniejszych zadań.
}}
}}
{{cwiczenie|5||  
{{cwiczenie|5||  


Napisz szablon generujący funkcję implementującą iloczyn skalarny dwu wektorów.
Napisz szablon generujący funkcję implementującą iloczyn skalarny dwu wektorów.
Parametrem szablonu ma być dlugość mnożonych szablonów.  
 
template<size_t N> double inner(double *x, double *y);
 
Parametrem szablonu ma być dlugość mnożonych wektorów.  
<center><math>\displaystyle  
<center><math>\displaystyle  
\operatorname{inner} </math> <N> <math>\displaystyle  (x,y)=x_1 y_1+\cdots y_N x_N
\operatorname{inner} </math> <N> <math>\displaystyle  (x,y)=x_1 y_1+\cdots y_N x_N
Linia 51: Linia 56:
{{cwiczenie|6||  
{{cwiczenie|6||  


Napisz szablon generujący funkcję implementujący iloczyn macierzy
Rozszerz powyższy szablon tak, aby również typ elementów wektora był parametrem szablonu:
 
template<size_t N, typename T> T dot(T *x, T *y);
 
}}
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Podpowiedź</span><div class="mw-collapsible-content" style="display:none">
Konieczne będzie użycie specjalizacji częściowej. W tym celu użyj pomocniczej klasy (specjalizacja częściowa jest niedozwolona dla funkcji).
</div></div>
 
{{cwiczenie|7||
 
Napisz szablon generujący funkcję implementującą iloczyn macierzy
<math>NxM</math> i wektora o <math>M</math> elementach:
<math>NxM</math> i wektora o <math>M</math> elementach:


  <nowiki> void matrix_v<N>(double *A,double *v,double *u)</nowiki>
  <nowiki> void matrix_v<N>(double *A,double *v,double *u)</nowiki>
powoduje obliczenie:


<center><math>\displaystyle \aligned u_0&= A_{0,0} v_0+A_{0,1} v_1+\cdots+A_{0,M-1} v_{M-1}\\
<center><math>\displaystyle \aligned u_0&= A_{0,0} v_0+A_{0,1} v_1+\cdots+A_{0,M-1} v_{M-1}\\
Linia 64: Linia 78:
\endaligned</math></center>
\endaligned</math></center>


Tablica <math>\displaystyle A</math> jest reprezentowana w pamięci zgodnie z konwencją <math>C</math>, tzn.
Tablica <math>\displaystyle A</math> jest reprezentowana w pamięci zgodnie z konwencją <math>C</math>, tzn. wiersz po wierszu:
elementowi <math>\displaystyle A_{i,j}</math> odpowiada <math>A[M*i+j]</math>.
elementowi <math>\displaystyle A_{i,j}</math> odpowiada <math>A[M*i+j]</math>.
}}
}}

Wersja z 10:19, 21 wrz 2006

Ćwiczenie 1

Napisz szablon funkcji lub klasy wyliczający funkcję silnia:

n!=n(n1)(n2)1
Rozwiązanie

Ćwiczenie 2

Zaimplementuj szablon Pow<N,M> obliczający NM. Np.:

Pow<3,4>::val;

powinno mieć wartość 81.

Podpowiedź

Ćwiczenie 3

Wymyśl i zaimplementuj jako metaprogram szybszy algorytm funkcji pow(x).

Podpowiedź

Ćwiczenie 4

Napisz szablon generujący pierwsze N wyrazów rozwinięcia funkcji sin(x):

sin <N> (x)=xx33!++(1)N+1(x)2N1(2N1)!

Możesz skorzystać z rozwiązania wcześniejszych zadań.

Ćwiczenie 5

Napisz szablon generujący funkcję implementującą iloczyn skalarny dwu wektorów.

template<size_t N> double inner(double *x, double *y);

Parametrem szablonu ma być dlugość mnożonych wektorów.

inner <N> (x,y)=x1y1+yNxN

Ćwiczenie 6

Rozszerz powyższy szablon tak, aby również typ elementów wektora był parametrem szablonu:

template<size_t N, typename T> T dot(T *x, T *y);
Podpowiedź

Ćwiczenie 7

Napisz szablon generujący funkcję implementującą iloczyn macierzy NxM i wektora o M elementach:

 void matrix_v<N>(double *A,double *v,double *u)
Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \displaystyle \aligned u_0&= A_{0,0} v_0+A_{0,1} v_1+\cdots+A_{0,M-1} v_{M-1}\\ u_1&= A_{1,0} v_0+A_{1,1} v_1+\cdots+A_{1,M-1} v_{M-1}\\ &\vdots&\\ u_{N-1}&= A_{N-1,0} v_0+A_{N-1,1} v_1+\cdots+A_{N-1,M-1} v_{M-1}\\ \endaligned}

Tablica A jest reprezentowana w pamięci zgodnie z konwencją C, tzn. wiersz po wierszu: elementowi Ai,j odpowiada A[M*i+j].