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

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Rogoda (dyskusja | edycje)
Nie podano opisu zmian
Rogoda (dyskusja | edycje)
Nie podano opisu zmian
Linia 10: Linia 10:


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 przybliż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 <math>P<N</math>.  Logarytm z liczby <math>\displaystyle N</math> przy podstawie <math>\displaystyle P</math>
oznaczany <math>\displaystyle \log_P (N)</math> to rozwiązanie równania:
oznaczany <math>\displaystyle \log_P (N)</math> to rozwiązanie równania:
<center><math>\displaystyle  
<center><math>\displaystyle  
Linia 18: Linia 18:
}}
}}
<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">
<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ą (całkowitą)  
potęgę liczby całkowitej.
potęgę liczby całkowitej.
</div></div>
</div></div>
Linia 32: Linia 32:
{{cwiczenie|4||  
{{cwiczenie|4||  


Napisz szablon generujący, pierwsze <code><nowiki>N</nowiki></code> wyrazów rozwinięcia funkcji
Napisz szablon generujący, pierwsze <math>N</math> wyrazów rozwinięcia funkcji
<code><nowiki>sin(x)</nowiki></code>:
<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>
}}
}}
Linia 41: Linia 41:


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ść możonych szablonów.  
Parametrem szablonu ma być dlugość mnożonych szablonó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 49: Linia 49:


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:
<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>
Linia 61: Linia 61:
\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ą <math>C</math>, 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 <math>A[M*i+j]</math>.
}}
}}

Wersja z 14:36, 12 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 przybliż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ść mnoż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].