Ćwiczenie 3: Pojemniki - wektor

Ćwiczenie to jest częścią większego zadania, które będzie polegać na zaprojektowaniu szablonów kilku rodzajów klas pojemnikowych z wykorzystaniem mechanizmu dziedziczenia oraz iteratora dla tych klas.
Ćwiczenie 3. polegać będzie na zaprojektowaniu szablonu pojemnika typu wektor.

Po co

  • Doskonalenie umiejętności definiowania szablonów.
  • Utrwalenie umiejętności posługiwania się mechanizmami dziedziczenia, polimorfizmu.
  • Zapoznanie się z podstawowymi strukturami danych.

Oddawanie ćwiczenia

  • Przed oddaniem ćwiczenia, program należy przetestować używając następującego pliku main: ex3.zip
  • Powyższy plik wymaga istnienia pliku aghInclude.h poprzez który włączane są wszystkie niezbędne pliki.

Przebieg ćwiczenia

  1. Definiujemy szablon klasy bazowej (aghContainer), od której będą się wywodzić pozostałe klasy pojemnikowe
  2. Klasa bazowa nie może posiadać żadnych pól składowych ponieważ w klasach pochodnych sposób gromadzenia i przechowywania danych może być różny (porównaj: wektor, lista, stos, drzewo).
  3. Indeksowanie elementów rozpoczynamy od zera.
  4. Obowiązkowe metody jakie muszą znaleść się w definicji szablonu klasy podstawowej to:
    • Metodę dodawania elementu do pojemnika:
      • 
        
        

        dodająca podany jako argument obiekt typu T do pojemnika.

    • Metoda wstawiania elementu do pojemnika:
      • 
        
        

        wstawiająca obiekt typu T w wybrane miejsce. Zwraca true jeżeli podane miejsce wstawienia jest prawidłowe, w przeciwnym wypadku zwraca false.

    • Metoda podmiany elementu w pojemniku:
      • 
        
        

        podmienia obiekt typu T z obiektem na wybranym miejscu. Zwraca true jeżeli podane miejsce podmiany jest prawidłowe, w przeciwnym wypadku zwraca false.

    • Metoda zwracająca wartość elementu:
      • 
        
        

        zwraca wartość w pojemniku. Zakładamy że indeksowanie wartości rozpoczynamy od zera.

    • Metoda zwracająca ilość elementów:
      • 
        
        

        zwraca ilość elementów w pojemniku.

    • Metoda usuwająca wybrany element:
      • 
        
        

        usuwa element na danym miejscu. Zwraca true jeżeli podane miejsce usunięcia jest prawidłowe, w przeciwnym wypadku zwraca false.

    • Metoda opróżniająca pojemnik:
      • 
        
        

        usuwa wszystkie elementy pojemnika.

    • Metoda sprawdzająca czy pojemnik jest pusty:
      • 
        
        

        zwraca true jeżeli pojemnik jest pusty, inaczej false.

    • Metoda wyszukująca element w pojemniku przez wartość od zadanego momentu:
      • 
        
        

        wyszukuje i zwraca indeks pierwszego elementu o wartości _value zaczynając od elementu _from. Jeżeli takiego elementu nie ma to zwraca -1.

    • Metoda sprawdzająca czy dany element jest już w pojemniku:
      • 
        
        

        zwraca true jeżeli element o wartości _value znajduje się w pojemniku inaczej zwraca false. Wyszukiwanie rozpoczyna się od elelmetnu _from.

    • Oraz operatory:
      • Operator przypisania.
      • Operator porównania:
        
        
        

        sprawdza czy zawartość pojemników jest taka sama.

      • Operator nierówności:
        
        
        

        sprawdza czy zawartość pojemników jest różna.

      • Operator []:
        
        
        

        zwraca element o indeksie n.

      • Operator +=:
        
        
        

        dopisuje wszystkie elementy z pojemnika right i zwraca referencje do this.

      • Operator +=:
        
        
        

        dodaje element do pojemnika i zwraca referencje do this.

      • Operator «:
        
        
        

        dodaje element do pojemnika i zwraca referencje do this.

      • Operator «:
        
        
        

        dopisuje wszystkie elementy z pojemnika right i zwraca referencje do this.

      • Operator «:
        
        
        

        wypisuje zawartość pojemnika na strumień.

    • Inne konieczne metody i/lub operatory wedle uznania.
  5. W klasie abstrakcyjnej (aghContainer) definiujemy wszystkie możliwe do zdefiniowania metody. Zaoszczędzi to sporo czasu w kolejnych ćwiczeniach przy tworzeniu klas pochodnych. Metody których ciało nie może zostać zdefiniowane w klasie abstrakcyjnej to: destruktor, remove, size, insert, at. Pozostałem metody definiujemy przy pomocy wyżej wymienionych.
  6. Budujemy klasę aghVector, która będzie dziedziczyć powyższą klasę abstrakcyjną w sposób publiczny. Klasa powinna obsługiwać wszystkie powyższe metody.
  1. Nie ma przymusu tworzenia metod czy też klas specjalizowanych.
  2. Rozmiar wektora powinien być zmieniany dynamicznie.
  3. Program powinien mieć budowę modułową.
  4. Nie dublujemy kodu, tzn. nie piszemy dwa i więcej razy kodu, który wykonuje podobne zadania - ta kwestia będzie ważnym kryterium oceny jakości kodu.
  5. Do realizacji ćwiczenia nie można wykorzystywać już gotowych rozwiązań (STL, boost, Qt, itp.).
  6. Zaistniałe nieprawidłowe sytuacje powinny zostać obsłużone poprzez wyrzucenie wyjątku przy pomocy klasy aghException.
  7. Program powinien się poprawnie kompilować i uruchomić wraz z dostarczonymi plikami z paczki ex3.zip.

Plik catch.h jest to jedna z najlepszych bibliotek do pisania testów kodu w C++. Plik ex3main.cpp korzysta z niej do testowania dostarczonych implementacji.

Podczas implementacji klasy aghVector proszę stosować się do, tzw. reguły trzech

pl/dydaktyka/jimp2/2016/part2/ex/ex3.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0