Zaawansowane CPP/Ćwiczenia 1: Szablony I
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.
Ć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);
Ć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().
Ć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();