Algorytmy i Struktury Danych. Anna Paszyńska

Podobne dokumenty
KOLEJKA (QUEUE) (lista fifo first in, first out)

Szablony funkcji i szablony klas

Szablony klas, zastosowanie szablonów w programach

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Paradygmaty programowania. Paradygmaty programowania

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

STL Standardt Template Library (wprowadzenie)

Lista, Stos, Kolejka, Tablica Asocjacyjna

Operatory na rzecz typu TString

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Wprowadzenie do szablonów klas

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Zaawansowane programowanie w C++ (PCP)

Klasy generyczne. ZbiórLiczb. ZbiórCzegokolwiek. Zbiór

Języki programowania imperatywnego

Język C++ wykład VIII

Języki i techniki programowania Ćwiczenia 2

Programowanie w języku C++

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Wstęp do wiadomości teoretycznych (nie, nie jest to masło maślane ani wstęp, wstępów proszę cierpliwie czytać)

Wprowadzenie do szablonów szablony funkcji

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Programowanie Obiektowe (Java)

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

E S - uniwersum struktury stosu

Wprowadzenie do szablonów szablony funkcji

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

TEMAT : KLASY DZIEDZICZENIE

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Przeciążenie operatorów

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

STL: Lekcja 1&2. Filozofia STL

Podstawy programowania. Podstawy C# Tablice

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Pliki wykład 2. Dorota Pylak

Kolekcje - pakiet Java Collections Framework

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Klasy i obiekty cz II

Algorytmy i Struktury Danych. Co dziś? Drzewo decyzyjne. Wykład IV Sortowania cd. Elementarne struktury danych

Programowanie i struktury danych

Listy powiązane zorientowane obiektowo

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Projektowanie klas c.d. Projektowanie klas przykład

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Szablon klasy std::vector

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

PARADYGMATY PROGRAMOWANIA Wykład 3

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Dawid Gierszewski Adam Hanasko

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Podstawy programowania skrót z wykładów:

Metody Metody, parametry, zwracanie wartości

ROZDZIAŁ 2. Operatory

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

Qt sygnały i sloty. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Wydział Elektroniki Politechnika Wrocławska

Programowanie komputerowe. Zajęcia 4

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

PARADYGMATY PROGRAMOWANIA Wykład 4

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Paradygmaty programowania

Zaawansowane programowanie w języku C++ Biblioteka standardowa

Platformy Programistyczne Podstawy języka Java

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Abstrakcyjny typ danych

C++ Przeładowanie operatorów i wzorce w klasach

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Wstęp do wskaźników w języku ANSI C

Standard C++0x (C++1x?) Marcin Świderski

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Kurs programowania. Wykład 9. Wojciech Macyna

Identyfikacje typu na etapie. wykonania (RTTI)

Biuro Podróży 0. Stwórz projekt aplikacja konsolowa lub WPF (przemyśl wybór, bo zmiana może być czasochłonna). 1. Stwórz abstrakcyjną klasę

Dokumentacja do API Javy.

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Wykład 4. Klasa List Kolejki Stosy Słowniki

Biuro Podróży 0. Stwórz projekt aplikacja konsolowa lub WPF (przemyśl wybór, bo zmiana może być czasochłonna). 1. Stwórz abstrakcyjną klasę

Algorytmy i Struktury Danych.

Kolekcje - pakiet Java Collections Framework

Oracle PL/SQL. Paweł Rajba.

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Programowanie Obiektowe i C++

Mechanizm dziedziczenia

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie Komponentowe Zarządzanie obiektami: kontenery

Programowanie w języku Java. Kolekcje

Szablon klasy std::list

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Język ludzki kod maszynowy

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Przychodnia 0. Stwórz projekt aplikacja konsolowa lub WPF (przemyśl wybór, bo zmiana może być czasochłonna). 1. Stwórz abstrakcyjną klasę Osoba.

C++ - szablony kontenerów. Kontenery i szablony kontenerów. C++ - szablony kontenerów. C++ - szablony kontenerów. C++ - szablony kontenerów

.NET Klasy, obiekty. ciąg dalszy

Transkrypt:

Algorytmy i Struktury Danych Anna Paszyńska

Tablica dynamiczna szablon Array

Zbiory

Zbiory template <typename T> class Container {public: virtual ~Container() { }; virtual int Count() const = 0; virtual bool IsEmpty() const {return Count()==0;} virtual bool IsFull() const { return false; } virtual void MakeNull() = 0; virtual void Accept(Visitor<T> & visitor) = 0; };

Zbiory template <typename T> class Set : public virtual Container<T> { protected: unsigned int count; unsigned int universesize; public: Set (unsigned int n) : universesize (n) {} unsigned int UniverseSize(){return universesize;} int Count() const {return count;}; };

Zbiór jako tablica Można użyć albo szablonu Array albo szablonu std::vector. Oba to tablice o dynamicznie ustalanej długości. My zastosujemy szablon Array.

Zbiór jako tablica Zbiór jest reprezentowany jako tablica wartości boolowskich o długości N. Rozważmy element, któremu przyporządkowano liczbę i: jeśli w i-tej komórce tablicy jest true, to należy on do danego zbioru, a jeśli jest false, to nie należy Implementując klasę SetAsArray przyjmujemy, że: - jako argumenty dla metod operujących na elementach zawsze podajemy int (mapowanie między np. województwami a liczbami wykonywane przez kogoś innego -rozmiar uniwersum podaje się konstruktorowi zbioru - Operacje typu: porównywanie, sumowanie itd.. można wykonywać tylko, gdy oba zbiory są nad tym samym uniwersum

Zbiór jako tablica class SetAsArray : public Set<int> { Array<bool> _array; public: SetAsArray (unsigned int); void MakeNull();//metody z containera void Accept(Visitor<int> & visitor); virtual bool IsFull() const{return(count==universesize);}; void Insert (int object); bool IsMember (int object) const; void Withdraw (int object); friend SetAsArray operator + (SetAsArray const&, SetAsArray const&); friend SetAsArray operator (SetAsArray const&, SetAsArray const&); friend SetAsArray operator * (SetAsArray const&, SetAsArray const&); friend bool operator == (SetAsArray const&, SetAsArray const&); friend bool operator <= (SetAsArray const&, SetAsArray const&); }; friend- funkcja uzyska prawo dostępu do prywatnych elementów danej klasy.

Zbiór jako tablica - implementacja Konstruktor pobiera jeden argument N oznaczający rozmiar zbioru uniwersalnego. (uniwersalnego więc również rozmiar tablicy boolowskiej). Konstruktor tworzy pusty zbiór inicjalizując tablicę wartościami false. Złożoność czasowa konstruktora O(n). Metoda Insert wstawia element do zbioru. Odpowiedni element tablicy jest ustawiany na true, aby zaznaczyć, że podany obiekt został wstawiony do zbioru. Uwaga: zbiór nie posiada wstawianych obiektów! Wstawione obiekty są reprezentowane pośrednio poprzez indeksy tablicy. Złożoność czasowa operacji wstawiania O(1).

Zbiór jako tablica - implementacja Metoda IsMember stosowana jest do sprawdzania, czy dany element należy do zbioru. Funkcja zwraca prawdę, gdy element należy do zbioru i fałsz w przeciwnym wypadku. Złożoność czasowa O(1). Metoda Withdraw usuwa element ze zbioru. Ustawia ona odpowiedni element tablicy boolowskiej na false. Złożoność czasowa O(1). Uwaga: Należy pamiętać o modyfikacjach licznika count.

Zbiór jako tablica - implementacja Przeciążone zostały następujące operatory: operator+ (suma zbiorów) operator* (iloczyn zbiorów) operator- (różnica zbiorów)

Zbiór jako tablica - implementacja Zadanie 1. Zaimplementuj operator sumy: SetAsArray operator + (SetAsArray const& s, SetAsArray const& t) Operator sumy pobiera dwie referencje do instancji klasy SetAsArray: s oraz t. Wynik jest typu SetAsArray. Implementacja wymaga, aby obydwa zbiory s oraz t miały taki sam rozmiar. Wynik również będzie zbiorem o tym samym rozmiarze. Operator ten tworzy nową tablicę wynikową i oblicza wymagane wartości tablicy. i-ty element tablicy będzie przyjmował wartość true, gdy i-ty element s przyjmuje wartość true lub i-ty element t przyjmuje wartość true. Złożoność czasowa O(N) class SetAsArray : public Set<int> { Array<bool> _array; public: friend SetAsArray operator + (SetAsArray const&, SetAsArray const&);

Zbiór jako tablica - implementacja SetAsArray operator + (SetAsArray const& s, SetAsArray const& t) { if (s.universesize == t.universesize) SetAsArray result (s.universesize); for (unsigned int i = 0; i < s.universesize; ++i) result._array [i] = s._array [i] t._array [i]; return result; } Uwaga: Należy pamiętać o modyfikacjach licznika count.

Zbiór jako tablica - implementacja Przeciążone zostały również operatory porównania dla zbiorów: Operator== (równość zbiorów) Operator<= (zawieranie) Obydwa operatory zwracają wartości boolowskie.

Zbiór jako tablica - implementacja Przeciążone zostały również operatory porównania dla zbiorów: Operator== (równość zbiorów) Operator<= (zawieranie) Obydwa operatory zwracają wartości boolowskie. bool operator == (SetAsArray const& s,setasarray const& t) { if (s.universesize == t.universesize) for (unsigned int i = 0; i < s.universesize;++i) if (s._array [i]!= t._array [i]) return false; return true; } Pesymistyczny czas wykonania O(N)

Zbiór jako tablica - implementacja Zad.2. Stworzyć klasę AddingVisitor wizytatora, który oblicza sumę elementów zbioru.

Zbiór jako tablica - implementacja Zad.2. Stworzyć klasę AddingVisitor wizytatora, który oblicza sumę elementów zbioru. template <typename T> class Visitor { public: virtual void Visit (T& element) = 0; virtual bool IsDone () const{ return false; } }; 10)Tworzymy klasę AddingVisitor dziedziczącą z klasy Visitor 2) Implementujemy metodę Accept dla klasy SetAsArray (przegląda wszystkie elementy zbioru wywołując v.visit()

Zad.2. 1) Tworzymy klasę AddingVisitor dziedziczącą z klasy Visitor class AddingVisitor:public Visitor<int> { Zbiór jako tablica - implementacja protected: int sum; public: AddingVisitor():sum(0){}; void Visit(int&); int Sum(){return sum;} }; void AddingVisitor::Visit(int& obj) { sum=sum+obj;}

Zad.2. 2) Implementujemy metodę Accept dla klasy SetAsArray (przegląda wszystkie elementy zbioru wywołując v.visit() void SetAsArray::Accept (Visitor<int>& v) { for (int item = 0; item < (int) universesize; ++item) if (_array [item] == true) v.visit(item); } Zbiór jako tablica - implementacja

Zbiór jako tablica - implementacja Zad.3. Zaimplementuj iterator dla klasy SetAsArray

Zbiór jako tablica - implementacja template <typename T> class SetAsArray : public Set<int> { Array<bool> _array; class Iter//deklaracja zapowiadająca public: Iterator<T>&NewIterator(); }; template <typename T> class SetAsArray<T> ::Iter:public Iterator<T> {... }

Przeglądanie zawartości iteratory isdone Metoda IsDone w celu wyjścia z pętli while. Metoda ta zwraca false jeśli iterator nadal wskazuje na jakiś obiekt kontenera, oraz wartość true w przeciwnym przypadku. (gdy wszystkie obiekty zawarte w kontenerze zostały odwiedzone) operator* Operator dereferencji wskaźnika, jest używany, aby dostać się do obiektu na który iterator aktualnie wskazuje. Wynikiem wywołania tej funkcji, gdy cały kontener jest wyczerpany jest referencja do instancji klasy NullObject operator++ operator używany do przesunięcia iteratora do następnego obiektu w kontenerze. Jeżeli kontener jest wyczerpany, operator inkrementacji nie zmienia wartości iteratora