Zaawansowane CPP/Ćwiczenia 1: Szablony I: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
m
 
(Nie pokazano 19 wersji utworzonych przez 6 użytkowników)
Linia 7: Linia 7:
 
"<code><nowiki><</nowiki></code> ".
 
"<code><nowiki><</nowiki></code> ".
  
'''Zadanie 1 '''
+
{{cwiczenie|1||
 +
 
 
Przypomnij sobie z wykładu odpowiednią składnię, a następnie zaimplementuj
 
Przypomnij sobie z wykładu odpowiednią składnię, a następnie zaimplementuj
 
szablon funkcji <code><nowiki> minimum()</nowiki></code> , wybierającej mniejszy z dwóch argumentów.
 
szablon funkcji <code><nowiki> minimum()</nowiki></code> , wybierającej mniejszy z dwóch argumentów.
 +
}}
 +
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
 +
Patrz plik [[media:Minimum.cpp | minimum.cpp]].
 +
</div></div>
  
'''Zadanie 2 '''
+
{{cwiczenie|2||
 +
 
Zaimplementuj funkcję uogólnioną <code><nowiki> minimum_z_tablicy()</nowiki></code> .
 
Zaimplementuj funkcję uogólnioną <code><nowiki> minimum_z_tablicy()</nowiki></code> .
 
Informację o początku i rozmiarze tablicy przekazuj przy pomocy dwóch
 
Informację o początku i rozmiarze tablicy przekazuj przy pomocy dwóch
 
wskaźników, pokazujących na pierwszy element w tablicy oraz miejsce
 
wskaźników, pokazujących na pierwszy element w tablicy oraz miejsce
 
w pamięci tuż za końcem tablicy.
 
w pamięci tuż za końcem tablicy.
Wyglądać to powinno mniej więcej tak: <br>
+
Wyglądać to powinno mniej więcej tak:
<code><nowiki>    int tab[10];</nowiki></code>  <br>
+
 
<code><nowiki>    tab[0]   =     7;  tab[1]   =     33;   .....</nowiki></code>  <br>
+
<Source>
<code><nowiki>    int m   =     minimum_z_tablicy(tab, tab + 10);</nowiki></code>  
+
int tab[10];
 +
tab[0] = 7;  tab[1] = 33; .....
 +
int m = minimum_z_tablicy(tab, tab + 10);</Source>
 +
}}
 +
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
 +
Patrz plik [[media:Min_tablicy.cpp | min_tablicy.cpp]].
 +
</div></div>
 +
 
  
 +
{{cwiczenie|3||
 
Jednym z historycznych sposobów szyfrowania tajnych wiadomości jest tzw.
 
Jednym z historycznych sposobów szyfrowania tajnych wiadomości jest tzw.
 
kod Cezara.
 
kod Cezara.
 
Opiera się on na przesunięciu liter o trzy pozycje w przód: 'a' w 'd',
 
Opiera się on na przesunięciu liter o trzy pozycje w przód: 'a' w 'd',
'B' w 'E', 'z' w 'b'.
+
'B' w 'E', 'z' w 'c'.
 
Z matematycznego punktu widzenia jest to dodawanie modulo.
 
Z matematycznego punktu widzenia jest to dodawanie modulo.
 
Ponieważ kod ASCII ma wszystkie litery ułożone obok siebie, można to
 
Ponieważ kod ASCII ma wszystkie litery ułożone obok siebie, można to
 
wykorzystać i zapisać algorytm szyfrujący tak:
 
wykorzystać i zapisać algorytm szyfrujący tak:
  
<nowiki>   char c, z; /* oryginalna i zaszyfrowana litera */
+
<Source>
    if (c jest małą literą ASCII)
+
char c, z; /* oryginalna i zaszyfrowana litera */
        z   =     (c - 'a' + 3) else if (c jest wielką literą ASCII)
+
if (c jest małą literą ASCII)
        z   =     (c - 'A' + 3) else
+
    z = (c - 'a' + 3) % 26 + 'a';
        z   =     c;</nowiki>
+
else if (c jest wielką literą ASCII)
 +
    z = (c - 'A' + 3) % 26 + 'A';
 +
else
 +
    z = c;
 +
</Source>
  
 
Jak widać, szyfrowane są tylko litery; spacje, znaki przestankowe i inne
 
Jak widać, szyfrowane są tylko litery; spacje, znaki przestankowe i inne
Linia 40: Linia 58:
 
Zdekodowanie wiadomości wymaga wykonania tego samego algorytmu, ale tym razem
 
Zdekodowanie wiadomości wymaga wykonania tego samego algorytmu, ale tym razem
 
z przesunięciem wynoszącym -3.
 
z przesunięciem wynoszącym -3.
Oczywiście nic nie stoi na przeszkodzie, aby zamiast przesunięć o 3/-3
+
Oczywiście nic nie stoi na przeszkodzie, aby zamiast przesunięć o 3/-3,
stosować przesunięcia o dowolną inną liczbę uzgodnioną pomiędzy nadawcą
+
stosować przesunięcia o dowolną inną liczbę, uzgodnioną pomiędzy nadawcą
 
a odbiorcą tajnych komunikatów.
 
a odbiorcą tajnych komunikatów.
  
'''Zadanie 3 '''
+
 
 +
 
 +
 
 +
 
 
Zaimplementuj szablony funkcji szyfrujących i deszyfrujących łańcuchy.
 
Zaimplementuj szablony funkcji szyfrujących i deszyfrujących łańcuchy.
 
Wielkość przesunięcia ma być podawana jako parametr szablonu.
 
Wielkość przesunięcia ma być podawana jako parametr szablonu.
 
Rozdziel kod na dwa pliki źródłowe - jeden zawierający funkcje szyfrujące
 
Rozdziel kod na dwa pliki źródłowe - jeden zawierający funkcje szyfrujące
 
(będący swego rodzaju mini-biblioteką), drugi zawierający main().
 
(będący swego rodzaju mini-biblioteką), drugi zawierający main().
 +
}}
 +
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
 +
Patrz pliki [[media:Cezar.h | cezar.h]] oraz [[media:Szyfry.cpp | szyfry.cpp]].
 +
</div></div>
  
'''Zadanie 4 '''
+
{{cwiczenie|4||
 +
 
Wykład przedstawia prościutki stos jako przykład pojemnika.
 
Wykład przedstawia prościutki stos jako przykład pojemnika.
 
Zaimplementuj jego zmodyfikowaną wersję, zawierającą następujące metody:
 
Zaimplementuj jego zmodyfikowaną wersję, zawierającą następujące metody:
  
<nowiki>   bool empty()
+
<Source>
    void push(const T & data)
+
bool empty()
    T & top();
+
void push(const T & data)
    void pop();</nowiki>
+
T & top();
 +
void pop();
 +
</Source>
 +
}}
 +
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
 +
Patrz plik [[media:Stos.h | stos.h]]. Zauważ, że są tam dwie wersje metody <tt>top()</tt> - ta z modyfikatorem <tt>const</tt> jest wywoływana wtedy, gdy kompilator ma do czynienia z obiektem stałym (np. przekazanym do funkcji jako referencja do stałej).
 +
</div></div>

Aktualna wersja na dzień 21:07, 27 wrz 2020

Szablony pozwalają na tzw. programowanie uogólnione, czyli pisanie fragmentów kodu, które następnie mogą zostać użyte dla danych różnych typów. Oczywiście, podczas tworzenia danego fragmentu programista musi przyjąć pewne założenia co do operacji możliwych do wykonania na danych podlegających przetwarzaniu; raczej ciężko byłoby zapisać algorytm sortowania tablicy, jeśli przechowywanych w niej danych nie dałoby się porównywać przy pomocy "< ".

Ćwiczenie 1

Przypomnij sobie z wykładu odpowiednią składnię, a następnie zaimplementuj szablon funkcji minimum() , wybierającej mniejszy z dwóch argumentów.

Rozwiązanie

Ćwiczenie 2

Zaimplementuj funkcję uogólnioną minimum_z_tablicy() . Informację o początku i rozmiarze tablicy przekazuj przy pomocy dwóch wskaźników, pokazujących na pierwszy element w tablicy oraz miejsce w pamięci tuż za końcem tablicy. Wyglądać to powinno mniej więcej tak:

int tab[10];
tab[0] = 7;   tab[1] = 33; .....
int m = minimum_z_tablicy(tab, tab + 10);
Rozwiązanie


Ćwiczenie 3

Jednym z historycznych sposobów szyfrowania tajnych wiadomości jest tzw. kod Cezara. Opiera się on na przesunięciu liter o trzy pozycje w przód: 'a' w 'd', 'B' w 'E', 'z' w 'c'. Z matematycznego punktu widzenia jest to dodawanie modulo. Ponieważ kod ASCII ma wszystkie litery ułożone obok siebie, można to wykorzystać i zapisać algorytm szyfrujący tak:

char c, z; /* oryginalna i zaszyfrowana litera */
if (c jest małą literą ASCII)
    z = (c - 'a' + 3) % 26 + 'a';
else if (c jest wielką literą ASCII)
    z = (c - 'A' + 3) % 26 + 'A';
else
    z = c;

Jak widać, szyfrowane są tylko litery; spacje, znaki przestankowe i inne takie pozostają bez zmian. Do "innych takich" zaliczają się również polskie ogonki. Zdekodowanie wiadomości wymaga wykonania tego samego algorytmu, ale tym razem z przesunięciem wynoszącym -3. Oczywiście nic nie stoi na przeszkodzie, aby zamiast przesunięć o 3/-3, stosować przesunięcia o dowolną inną liczbę, uzgodnioną pomiędzy nadawcą a odbiorcą tajnych komunikatów.



Zaimplementuj szablony funkcji szyfrujących i deszyfrujących łańcuchy. Wielkość przesunięcia ma być podawana jako parametr szablonu. Rozdziel kod na dwa pliki źródłowe - jeden zawierający funkcje szyfrujące (będący swego rodzaju mini-biblioteką), drugi zawierający main().

Rozwiązanie

Ćwiczenie 4

Wykład przedstawia prościutki stos jako przykład pojemnika. Zaimplementuj jego zmodyfikowaną wersję, zawierającą następujące metody:

bool empty()
void push(const T & data)
T & top();
void pop();
Rozwiązanie