Zaawansowane CPP/Ćwiczenia 8: Metaprogramowanie: Różnice pomiędzy wersjami
Nie podano opisu zmian |
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"> | <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 metaprogram | 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"> | <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 | 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 | |||
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ę | 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> | ||
<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:
Ćwiczenie 2
Zaimplementuj szablon Pow<N,M>
obliczający
. Np.:
Pow<3,4>::val;
powinno mieć wartość 81.
Ćwiczenie 3
Wymyśl i zaimplementuj jako metaprogram szybszy algorytm funkcji pow(x)
.
Ćwiczenie 4
Napisz szablon generujący pierwsze wyrazów rozwinięcia funkcji :
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.
Ć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);
Ćwiczenie 7
Napisz szablon generujący funkcję implementującą iloczyn macierzy i wektora o elementach:
void matrix_v<N>(double *A,double *v,double *u)
Tablica jest reprezentowana w pamięci zgodnie z konwencją , tzn. wiersz po wierszu: elementowi odpowiada .