====== Ćwiczenie 2: Szablony klas ====== ===== Po co ===== * Ogólne doskonalenie posługiwania się C++. * Poznanie sposobu interpretacji szablonu klas. * Zapoznanie się z mechanizmem działania szablonów klas. * Definiowanie szablonów klas: * Definiowanie metod specjalizowanych. * Umiejętność zastosowania szablonów klas dla typów wbudowanych, jak również typów definiowanych przez użytkownika. ===== Oddawanie ćwiczenia ===== * Przed oddaniem ćwiczenia, program należy przetestować używając następującego pliku ''ex2main.cpp'' zawartego w paczce: {{:pl:dydaktyka:jimp2:2016:part2:ex:ex2.zip|}} * Powyższy plik wymaga istnienia pliku ''aghInclude.h'' poprzez który włączane są wszystkie niezbędne pliki. ===== Przebieg ćwiczenia ===== - Definiujemy szablon klasy **''aghMatrix''** która będzie reprezentowała macierz danych. - Klasa powinna umożliwiać tworzenie macierzy o różnych wymiarach (także prostokątnych). - Indeksowanie wierszy i kolumn rozpoczyna się od **zera**. - Typem przechowywanym w macierzy jest **typ parametryczny**. - W klasie należy: - Zdefiniować metodę **''setItem''** ustawiającą wartość elementu macierzy która przyjmie trzy argumenty: pierwszy numer wiersza, drugi numer kolumny, trzeci wartość elementu na przecięciu podanego wiersza i kolumny. - Zdefiniować **dwie** metody o nazwie **''setItems''** które jako argument/argumenty przyjmą wartości wszystkich współczynników macierzy niezależnie od jej wymiarów: * Pierwsza przyjmuje tylko jeden argument, którym jest wskaźnik do początku jednowymiarowej tablicy z której pobierane są wszystkie współczynniki macierzy. * Druga metoda jako pierwszy argument przyjmuje ilość wierszy (''r'') macierzy, następnie jako drugi argument ilość kolumn (''c'') macierzy, oraz jako pozostałe, ''r*c'' argumentów będących współczynnikami macierzy. - Przeładować operatory: * Przypisania ''='' * Dodawania ''+'' * Mnożenia ''*'' * Porównaia ''=='', ''!='' * ''()'' - służący do odnoszenia się do poszczególnych elementów macierzy. Operator ten definiujemy jako dwuargumentowy przyjmujący dwie liczy całkowite będące odpowiednio indeksem wiersza i kolumny. - Zdefiniować dla klasy **''aghMatrix''** operatory **specjalizowane** ''+'',''*'' dla typu **''char''** które kolejne małe litery alfabetu będą traktowały jako kolejne liczby naturale: ''a=0, b=1, c=2, d=3,...'' np.: * ''a+b=b'' co odpowiada to działaniu: ''0+1=1'' * ''d*c=g'' co odpowiada to działaniu: ''3*2=6'' * Działania powinny dawać **poprawne** wyniki w zakresie **małych** liter: * Chcąc **utrzymać** wynik zawsze **w zakresie**, po przekroczeniu zakresu można wykonywać działanie **modulo**: * Podczas **dodawania** macierzy pierwszym argumentem działania modulo jest **suma odpowiednich elementów macierzy wejściowych**. * Podczas **mnożenia** macierzy pierwszym argumentem działania modulo jest **suma wszystkich iloczynów elementów macierzy wejściowych**. - Zdefiniować dla klasy **''aghMatrix''** operator specjalizowany ''+'' dla typu **''std::string''**: * Operator ten wykonuje dodawanie macierzy wg. powszechnie znanego algorytmu. * Argumentami tego operatora są wyrazy (napisy), które traktujemy jako **zbiory** liter. * Wynikiem dodawania dwóch wyrazów jest zbiór liter które należą do co najmniej jednego ze składników. - Zdefiniować dla klasy **''aghMatrix''** operator specjalizowany ''*'' dla typu **''std::string''**: * Operator ten wykonuje mnożenie macierzy wg. powszechnie znanego algorytmu. * Obliczenie pojedynczego elementu macierzy **wyjściowej** wymaga obliczenia **sumy iloczynów** wyrazów z odpowiedniego wiersza i odpowiedniej kolumny macierzy **wejściowych**. * Argumentami iloczynu są wyrazy (napisy), które traktujemy jako **zbiory** liter. * Wynikiem mnożenia dwóch wyrazów jest zbiór liter należących do **obu** wyrazów. * Sumowanie przebiega tak jak opisano powyżej. - Definiujemy klase **''aghComplex''** która reprezentuje liczby zespolone. - Przyjmujemy że wartości zarówno części rzeczywistej jak też urojonej są **zmiennoprzecinkowe**. - Klasa powinna być tak zdefiniowana aby mogła zostać użyta jako parametr szablonu klasy **''aghMatrix''!** - Wewnątrz szablonu klasy **''aghMatrix''** nie definiujemy żadnych metod/operatorów specjalizowanych dla klasy **''aghComplex''**. - Zaistniałe nieprawidłowe sytuacje powinny zostać obsłużone poprzez wyrzucenie wyjątku przy pomocy klasy **''[[..:org:codepolicy#obsluga_wyjatkow|aghException]]''**. - Program powinien się poprawnie kompilować i uruchomić wraz z dostarczonym plikiem ''ex2main.cpp''