Zaawansowane CPP/Ćwiczenia 8: Metaprogramowanie

Z Studia Informatyczne
Wersja z dnia 13:35, 1 wrz 2006 autorstwa Arek (dyskusja | edycje)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacjiPrzejdź do wyszukiwania

Uwaga: przekonwertowane latex2mediawiki; prawdopodobnie trzeba wprowadzi� poprawki

{Metaprogramowanie}

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

n!=n(n1)(n2)1

Zadanie 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

Wskażówka Najpierw zaimplementuj szablon liczący dowolną (calkowitą) potęgę liczby całkowitej.

Zadanie 3

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

Wskażówka

x(2n)=(x2)n,x(2n+1)=x(x2)n

Zadanie 4

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

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

Zadanie 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

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