====== Ćwiczenie 5: Iteratory ====== **Ćwiczenie 5.** polega na zaimplementowaniu **iteratora o dostępie swobodnym** dla pojemników wykonywanych podczas ćwiczeń [[ex3|3]], [[ex4|4]]. ===== Po co ===== * Doskonalenie umiejętności definiowania szablonów. * Zapoznanie się z podstawowymi strukturami danych. * Doskonalenie umiejętności przeładowywania operatorów. * Zapoznanie się z konstrukcją iteratorów. ===== Oddawanie ćwiczenia ===== * Przed oddaniem ćwiczenia, program należy przetestować używając następującego pliku main: {{:pl:dydaktyka:jimp2:2016:part2:ex:ex5.zip|}} * Powyższy plik wymaga istnienia pliku ''aghInclude.h'' poprzez który włączane są wszystkie niezbędne pliki. ===== Przebieg ćwiczenia ===== - Wykonanie ćwiczenia polega na zdefiniowaniu szablonu **iteratora** dla pojemników wykonanych w trakcie poprzednich ćwiczeń. - Budujemy klasę **''aghIterator''**, która będzie reprezentować szablon iteratora. - Do realizacji ćwiczenia **nie można** wykorzystywać już gotowych rozwiązań (STL, Qt, tip). - Klasa powinna umożliwiać "pokazywanie" iteratorem na **dowolny** z zaprojektowanych trakcie poprzednich ćwiczeń pojemników. - Obiekt klasy **''aghIterator''** powinien wykazywać zachowanie maksymalnie zbliżone do zwykłego wskaźnika. - Klasa powinna implementować następujące metody: * **''first()''** - zwraca iterator pokazujący na **pierwszy** element w pojemniku. * **''last()''** - zwraca iterator pokazujący na **ostatni** element w pojemniku. * **''next()''** - przesuwa iterator na **następny** element. * **''prev()''** - przesuwa iterator na **poprzedni** element. * **''current()''** - zwraca **aktualnie** pokazywany element w pojemniku, oraz umożliwia zmianę wartości tego elementu. * **''atFirst()''** - przenosi iterator na pierwszy element w pojemniku. * **''atLast()''** - przenosi iterator na ostatni element w pojemniku. * **''size()''** - zwraca ilość elementów od aktualnie pokazywanego do ostatniego elementu w pojemniku. - Staramy się aby obiekt iteratora zachowywał się jak **zwyczajny wskaźnik**, tzn. powinien umożliwiać następującą składnię zapisu: \\ (''iterator'' - obiekt iteratora, ''pojemnik'' - obiekt pojemnika na który pokazuje iterator, ''i'' - dowolna liczba całkowita, ''b'' - typ parametryczny przechowywany przez obiekt pojemnika): * ''iterator = &pojemnik'' - ustawia pojemnik na który iterator pokazuje. * ''if((int)iterator == NULL)'' - sprawdzenie czy iterator pokazuje na pojemnik, ewentualnie czy pojemnik zawiera przynajmniej jeden element oraz czy aktualnie pokazywany element jest poprawny. * ''*iterator'' - zwraca aktualnie pokazywany element. * ''*iterator = b'' - zapisuje wartość zmiennej ''b'' pod **aktualnie** pokazywany element. * ''iterator[i]'' - zwraca element znajdujący się o ''i'' pozycji **dalej** względem **aktualnego** elementu. * ''iterator[i] = b'' - zapisuje wartość zmiennej ''b'' jako element znajdujący się ''i'' pozycji **dalej** względem **aktualnego** elementu. * ''iterator + i'' - zwraca iterator przesunięty o ''i'' elementów **dalej**. * ''iterator += i'' - przesuwa iterator o ''i'' elementów **dalej**. * ''iterator - i'' - zwraca iterator przesunięty o ''i'' elementów **bliżej**. * ''iterator -= i'' - przesuwa iterator o ''i'' elementów **wcześniej**. * ''iterator++'' - zwraca iterator pokazujący na ''i''-ty element a następnie przesuwa iterator na ''i+1'' element. * ''++iterator'' - przesuwa iterator na ''i+1'' element i zwraca iterator pokazujący na ''i+1'' element. * ''iterator--'' - zwraca iterator pokazujący na ''i-ty'' element a następnie przesuwa iterator na ''i-1'' element. * ''--iterator'' - przesuwa iterator na ''i-1'' element i zwraca iterator pokazujący na ''i-1'' element. * ''iterator1 == iterator2'' - porównanie dwóch iteratorów - są sobie równe tylko wtedy gdy pokazują na ten sam element. * ''iterator1 != iterator2'' - analogicznie jak powyżej. - Wszystkie metody zwracające wartość elementu powinny wyrzucać wyjątek typu **''aghException''** jeżeli żądany element jest poza zakresem :!: - Nie ma przymusu tworzenia metod czy też klas specjalizowanych. - 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 {{:pl:dydaktyka:jimp2:2016:part2:ex:ex5.zip|}}