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

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian
 
Nie podano opisu zmian
Linia 1: Linia 1:
''Uwaga: przekonwertowane latex2mediawiki; prawdopodobnie trzeba wprowadzi� poprawki''
{Metaprogramowanie}
'''Zadanie 1 '''  Napisać szablon funkcji lub klasy wyliczający  
'''Zadanie 1 '''  Napisać szablon funkcji lub klasy wyliczający  
funkcję silnia:
funkcję silnia:
Linia 10: Linia 5:
</math></center>
</math></center>


'''Zadanie 2 '''  Zmodyfikować szablon <code><nowiki> Sqrt</nowiki></code> tak aby liczył
'''Zadanie 2 '''  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 18: Linia 13:
</math></center>
</math></center>


'''Wskażówka '''  
'''Wskazówka '''  
Najpierw zaimplementuj szablon liczący dowolną (calkowitą)  
Najpierw zaimplementuj szablon liczący dowolną (calkowitą)  
potęgę liczby całkowitej.
potęgę liczby całkowitej.
Linia 24: Linia 19:
'''Zadanie 3 '''   
'''Zadanie 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>.


'''Wskażówka '''   
'''Wskazówka '''   
<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 33: Linia 28:
'''Zadanie 4 '''  
'''Zadanie 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
<code><nowiki> sin(x)</nowiki></code>:
<code><nowiki>sin(x)</nowiki></code>:
<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)!}
Linia 50: Linia 45:


Napisz szablon generujący funkcję implementujący iloczyn macierzy
Napisz szablon generujący funkcję implementujący iloczyn macierzy
<code><nowiki> NxM</nowiki></code> i wektora o <code><nowiki> M</nowiki></code> elementach:
<code><nowiki>NxM</nowiki></code> i wektora o <code><nowiki>M</nowiki></code> elementach:


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


powoduje obliczenie:
powoduje obliczenie:
Linia 63: Linia 57:
\endaligned</math></center>
\endaligned</math></center>


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 09:28, 3 wrz 2006

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

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

Wskazó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).

Wskazówka

Zadanie 4

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

<N>

Zadanie 5

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

<N>

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ć (SVG (MathML może zostać włączone przez wtyczkę w przeglądarce): Nieprawidłowa odpowiedź („Math extension cannot connect to Restbase.”) z serwera „https://wazniak.mimuw.edu.pl/api/rest_v1/”:): {\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 jest reprezentowana w pamięci zgodnie z konwencją C, tzn. elementowi odpowiada A[M*i+j].