Zaawansowane CPP/Ćwiczenia 8: Metaprogramowanie: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Rogoda (dyskusja | edycje)
Rogoda (dyskusja | edycje)
Nie podano opisu zmian
Linia 1: Linia 1:
'''Zadanie 1 '''  Napisać szablon funkcji lub klasy wyliczający  
{{cwiczenie|1||
 
Napisać szablon funkcji lub klasy wyliczający  
funkcję silnia:
funkcję silnia:
<center><math>\displaystyle  
<center><math>\displaystyle  
n!=n(n-1)(n-2)\cdots 1
n!=n(n-1)(n-2)\cdots 1
</math></center>
</math></center>
}}
{{cwiczenie|2||


'''Zadanie 2 '''  Zmodyfikować szablon <code><nowiki>Sqrt</nowiki></code> tak aby liczył
Zmodyfikować szablon <code><nowiki>Sqrt</nowiki></code> tak aby liczył
całkowite przyliżenie logarytmu liczby <math>\displaystyle N</math> o dowolnej całkowitej
całkowite przyliżenie logarytmu liczby <math>\displaystyle N</math> o dowolnej całkowitej
podstawie <code><nowiki> P<N</nowiki></code>.  Logarytm z liczby <math>\displaystyle N</math> przy podstawie <math>\displaystyle P</math>
podstawie <code><nowiki> P<N</nowiki></code>.  Logarytm z liczby <math>\displaystyle N</math> przy podstawie <math>\displaystyle P</math>
Linia 12: Linia 16:
P^{\log_P(N)}=N
P^{\log_P(N)}=N
</math></center>
</math></center>
 
}}
'''Wskazówka '''
<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">
Najpierw zaimplementuj szablon liczący dowolną (calkowitą)  
Najpierw zaimplementuj szablon liczący dowolną (calkowitą)  
potęgę liczby całkowitej.
potęgę liczby całkowitej.
 
</div></div>
'''Zadanie 3 '''  
{{cwiczenie|3||  


Wymyśl i zaimplementuj jako metaprogram,  szybszy algorytm funkcji <code><nowiki>pow(x)</nowiki></code>.
Wymyśl i zaimplementuj jako metaprogram,  szybszy algorytm funkcji <code><nowiki>pow(x)</nowiki></code>.
 
}}
'''Wskazówka ''' 
<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">
<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
</math></center>
</math></center>
 
</div></div>
'''Zadanie 4 '''
{{cwiczenie|4||


Napisz szablon generujący, pierwsze <code><nowiki>N</nowiki></code> wyrazów rozwinięcia funkcji
Napisz szablon generujący, pierwsze <code><nowiki>N</nowiki></code> wyrazów rozwinięcia funkcji
Linia 33: Linia 37:
\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>
 
}}
'''Zadanie 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.
Linia 41: Linia 45:
\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
</math></center>
</math></center>
 
}}
'''Zadanie 6 '''
{{cwiczenie|6||


Napisz szablon generujący funkcję implementujący iloczyn macierzy
Napisz szablon generujący funkcję implementujący iloczyn macierzy
Linia 59: Linia 63:
Tablica <math>\displaystyle A</math> jest reprezentowana w pamięci zgodnie z konwencją <code><nowiki>C</nowiki></code>, tzn.
Tablica <math>\displaystyle A</math> jest reprezentowana w pamięci zgodnie z konwencją <code><nowiki>C</nowiki></code>, tzn.
elementowi <math>\displaystyle A_{i,j}</math> odpowiada <code><nowiki>A[M*i+j]</nowiki></code>.
elementowi <math>\displaystyle A_{i,j}</math> odpowiada <code><nowiki>A[M*i+j]</nowiki></code>.
}}

Wersja z 18:56, 10 wrz 2006

Ćwiczenie 1

Napisać szablon funkcji lub klasy wyliczający funkcję silnia:

n!=n(n1)(n2)1

Ćwiczenie 2

Zmodyfikować szablon Sqrt tak aby liczył całkowite przyliżenie logarytmu liczby N o dowolnej całkowitej podstawie P<N. Logarytm z liczby N przy podstawie P oznaczany logP(N) to rozwiązanie równania:

PlogP(N)=N
Wskazówka

Ćwiczenie 3

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

Wskazówka

Ć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)!

Ćwiczenie 5

Napisz szablon generujący funkcję implementującą iloczyn skalarny dwu wektorów. Parametrem szablonu ma być dlugość możonych szablonów.

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

Ćwiczenie 6

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

 void matrix_v<N>(double *A,double *v,double *u)

powoduje obliczenie:

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. elementowi Ai,j odpowiada A[M*i+j].