|
|
pl:dydaktyka:jimp2:2016:part2:ex:ex5 [2019/06/27 15:50] |
pl:dydaktyka:jimp2:2016:part2:ex:ex5 [2019/06/27 15:50] (aktualna) |
| ====== Ć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|}} |