Programování v C++ 2, 8. cvičení

Podobné dokumenty
Programování v C++ 2, 7. cvičení

Programování v C++ 1, 17. cvičení

Programování v C++ 3, 3. cvičení

Programování v C++, 2. cvičení

Programování v C++ 1, 16. cvičení

Programování v C++ 1, 5. cvičení

Programování v C++ 1, 6. cvičení

Programování v C++ 2, 4. cvičení

Programování v C++ 1, 1. cvičení

Konstruktory a destruktory

Programování v C++ 1, 14. cvičení

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Kolekce, cyklus foreach

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

Objektov orientované programování. C++ Akademie SH. 7. Objektov orientované programování. Michal Kvasni ka. Za áte níci C++ 2.

Abstraktní datové typy

Standardní algoritmy vyhledávací.

Martin Flusser. December 15, 2016

Více o konstruktorech a destruktorech

Šablony, kontejnery a iterátory

Šablony, kontejnery a iterátory

Mělká a hluboká kopie

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

24. listopadu 2013, Brno Připravil: David Procházka

Chování konstruktorů a destruktorů při dědění

PB161 Programování v jazyce C++ Přednáška 9

map, multimap - Asociativní pole v C++.

PB161 Programování v jazyce C++ Přednáška 8

Jazyk C++, některá rozšíření oproti C

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Jazyk C++ I. Šablony 2

Jazyk C++ I. Šablony

Virtuální metody - polymorfizmus

Dynamické datové struktury III.

Dědění, polymorfismus

PB161 Programování v jazyce C++ Přednáška 10

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

ADT/ADS = abstraktní datové typy / struktury

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Abstraktní třídy, polymorfní struktury

Spojová implementace lineárních datových struktur

PB161 Programování v jazyce C++ Přednáška 10

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PB161 Programování v jazyce C++ Přednáška 4

Úvod do programovacích jazyků (Java)

PŘETĚŽOVÁNÍ OPERÁTORŮ

Cvičení z programování v C++ ZS 2016/2017 Přemysl Čech

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března

Funkční objekty v C++.

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Algoritmizace prostorových úloh

Standardní algoritmy v C++.

PB161 Programování v jazyce C++ Přednáška 7

Pole a kolekce. v C#, Javě a C++

PB161 Programování v jazyce C++ Přednáška 7

Generické programování

Dynamické datové struktury I.

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

PB161 Programování v jazyce C++ Přednáška 9

Jazyk C++ I. Šablony 3

, Brno Připravil: David Procházka Návrhové vzory

Dynamické datové struktury IV.

přetížení operátorů (o)

Iterator & for cyklus

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

7. Dynamické datové struktury

Přetěžování operátorů

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

Mnohotvarost (polymorfizmus)

PB161 Programování v jazyce C++ Přednáška 9

Práce s polem a pamětí

Algoritmizace prostorových úloh

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

Lineární datové struktury

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. December 7, 2016

PREPROCESOR POKRAČOVÁNÍ

Iterátory v C++. int pole[20]; for (int *temp = pole, temp!= &pole[20]; temp++) { *temp = 0;

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

Programování v C++ VI

Programování v jazyce C a C++

Dynamická identifikace typů v C++.

PB161 Programování v jazyce C++ Přednáška 1

Vector datový kontejner v C++.

PB přednáška (12. října 2015)

Jazyk C++ I. Polymorfismus

10. března 2015, Brno Připravil: David Procházka. Programovací jazyk C++

Jazyk C++ I. Polymorfismus

Problém, jehož různé instance je třeba často řešit Tyto instance lze vyjádřit větami v jednoduchém jazyce

PB161 Programování v jazyce C++ Přednáška 4

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 23, 2016

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

SYSTÉMOVÉ PROGRAMOVÁNÍ Cvičení č.1

NMIN201 Objektově orientované programování 1 / :36:09

NPRG031 Programování II 1 / :25:46

Transkript:

Programování v C++ 2, 8. cvičení návrhový vzor iterátor 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019

Přehled 1 2

Shrnutí minule procvičené látky Zadání dědění potomek může zastoupit předka časná a pozdní vazba virtuální metody čistě virtuální metody a abstraktní třídy příklad: spojový seznam iterátor seznamu Do třídy List přidejte veřejnou metodu, která ze seznamu odstraní prvek se zadanými daty.

Nalezení prvku se zadanými daty hledaná data ulož do zarážky prohledávej prvky seznamu od hlavy: dokud nenajdeš hledaná data, posuň se na další prvek našla-li se data v zarážce, vrat nullptr, jinak vrat ukazatel na nalezený prvek 1 Item* List::find(Data &what){ 2 last->setdata(what); 3 Item *p = first->next; 4 for(;p->getdata()!=what;p=p->next); 5 return (p == last? nullptr : p); 6 }

Smazání prvku se zadanými daty nalezni prvek, který má být smazán za předchůdce nalezeného prvku napoj jeho následníka před následníka nalezeného prvku napoj jeho předchůdce prvek smaž a sniž počítadlo prvků 1 bool List::remove(Data &what){ 2 Item *p = find(what); 3 if(!p){ return false; } 4 p->prev->next = p->next;} 5 p->next->prev = p->prev; 6 delete p; 7 counter--; 8 return true; 9 }

zobecnění indexovacího operátoru objekt, který poskytuje konzistentní prostředek pro procházení různých typů kontejnerů odstiňuje uživatele kontejneru od detailu implementace umožňuje psát znovupoužitelný kód základní operace třídy Iterator: 1 reset: vrátí iterátor před začátek datové struktury 2 next: posune se na další prvek a oznámí, zda je k dispozici další prvek 3 data: vráti data z aktuálního prvku tyto metody jsou ve třídě Iterator čistě virtuální implementace závisí na konkrétní datové struktuře, proto napsána až v odvozených třídách

Třídy Iterator a ListIterator 1 class Iterator{ //abstraktni trida 2 public: 3 Iterator(); 4 virtual ~Iterator(){} 5 virtual void reset() = 0; //ciste virtualni metody 6 virtual Data& data() = 0; //referencni funkce 7 virtual bool next() = 0; 8 }; 9 10 class List; //dopredna deklarace 11 class Item; 12 13 class ListIterator: public Iterator{ 14 List *list; 15 Item *current; 16 public: 17 ListIterator(List *l); 18 virtual ~ListIterator(){} 19 virtual void reset(); 20 virtual Data& data(); 21 virtual bool next(); 22 };

Implementace metod 1 ListIterator::ListIterator(List *l) 2 : list(l), current(list->first) 3 {} 4 5 void ListIterator::reset(){ 6 current = list->first; 7 } 8 9 Data& ListIterator::data(){ 10 return current->data; 11 } 12 13 bool ListIterator::next(){ 14 if(current==list->last){ 15 current = list->first->next; 16 } else{ 17 current = current->next; 18 } 19 if(current==list->last){ return false; } 20 else{ return true; } 21 }

Použití iterátoru Do seznamu doplníme metodu, která vytvoří iterátor: 1 ListIterator* List::getIterator(){ 2 return new IteratorSeznamu(this); 3 } Použití: 1 void processsequence(iterator *i){ //parametrem je 2 i->reset(); //ukazatel na predka 3 while(i->next()) 4 cout << i->data() << endl; 5 } 6 int main(){ 7 List l; ListIterator *it = l.getiterator(); 8 //zadej do seznamu data a seznam pak zpracuj 9 processsequence(it); 10 delete it; Funkce processsequence umí pracovat s libovolnou posloupností, ke které existuje iterátor

Příklad: dynamické pole 1 class Array{ 2 unsigned int capacity; 3 Data *data; 4 public: 5 Array(unsigned int N); 6 Array(const Array &original); 7 ~Array(); 8 Data& at(unsigned int idx){return data[idx];} 9 unsigned int size() const {return capacity;} 10 ArrayIterator* getiterator(); 11 }; vhodné přetížit operátor indexování

Implementace metod 1 Array::Array(unsigned int N) 2 : capacity(n), data(new Data[capacity]) 3 { 4 memset(this->data, 0, capacity*sizeof(data)); 5 } 6 7 Array::Array(const Array &original) 8 : capacity(original.capacity), 9 data(new Data[capacity]) 10 { 11 std::memcpy(this->data, original.data, capacity*sizeof(data)); 12 } 13 14 Array::~Array(){ delete [] data; } 15 16 ArrayIterator* Array::getIterator(){ 17 return new ArrayIterator(this); 18 } funkce memset vyplní blok paměti zadanou hodnotou funkce memcpy zkopíruje blok paměti

Iterátor pole 1 ArrayIterator::ArrayIterator(Array *a) 2 : array(a), index(array->size()){} 3 4 void ArrayIterator::reset(){ 5 index = array->size(); 6 } 7 8 Data& ArrayIterator::data(){ 9 return array->at(index); 10 } 11 12 bool ArrayIterator::next(){ 13 if(index == array->size()){ 14 index = 0; 15 } else{ 16 index++; 17 } 18 return (index < array->size()); 19 }

Příklad: hledání nejmenšího prvku 1 #include <climits> 2 #include "iterator.h" 3 4 Data findmin(iterator *it){ 5 Data min = INT_MAX; 6 while(it->next()){ 7 if(it->data() < min) 8 min = it->data(); 9 } 10 it->reset(); 11 return min; 12 } opět bude fungovat pro libovolnou posloupnost, pro kterou je implementován iterátor

Závěr Shrnutí práce se spojovým seznamem přidání prvku na začátek seznamu smazání všech prvků destruktor nalezení prvku odstranění prvku návrhový vzor iterátor abstraktní iterátor iterátor seznamu použití iterátoru: nalezení nejmenšího prvku posloupnosti