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

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
 
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ć (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 jest reprezentowana w pamięci zgodnie z konwencją C, tzn. elementowi odpowiada A[M*i+j].