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

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

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

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

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

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

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

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

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

Abstraktní datové typy

Konstruktory a destruktory

OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů Standardně zavedené proudy

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

Dynamické datové struktury I.

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

Virtuální metody - polymorfizmus

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

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

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

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.

specifikuje vytvářené objekty pomocí prototypické instance nový objekt vytváří kopírováním prototypu

konstruktory a destruktory (o)

Dědění, polymorfismus

ADT/ADS = abstraktní datové typy / struktury

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

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

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

Více o konstruktorech a destruktorech

Jazyk C++ I. Šablony 2

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

Základní datové struktury

Šablony, kontejnery a iterátory

Jazyk C++ I. Polymorfismus

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

Programování v C++ VI

Šablony, kontejnery a iterátory

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

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

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

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

Kolekce, cyklus foreach

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

PREPROCESOR POKRAČOVÁNÍ

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

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

Generické programování

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

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

Programování v jazyce C a C++

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Lineární datové struktury

Programování II. Návrh programu II

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

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

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

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

Abstraktní třídy, polymorfní struktury

20. Projekt Domácí mediotéka

Jazyk C++ II. STL knihovna kontejnery část 1

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

Dynamické datové struktury IV.

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

Ukazka knihy z internetoveho knihkupectvi

Programování II. Abstraktní třída Vícenásobná dědičnost 2018/19

Abstraktní datové typy: zásobník

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

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

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

Základy objektové orientace I. Únor 2010

PB přednáška (21. září 2015)

Jazyk C++ I. Šablony

Lineární datové struktury

Dynamická identifikace typů v C++.

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

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

1. Dědičnost a polymorfismus

Datové struktury. alg12 1

Da D to t v o é v ty t py IB111: Datové typy

Algoritmizace prostorových úloh

Martin Flusser. December 15, 2016

Teoretické minimum z PJV

Abstract Factory úvod

Dědičnost (inheritance)

Objektové programování

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

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Programování II. Polymorfismus

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

PB071 Programování v jazyce C Jaro 2013

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

Jazyk C++ I. Šablony 3

Programování II. Návrh programu I 2018/19

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

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

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

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

Abstraktní datové typy FRONTA

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

Anotace. Spojové seznamy, haldy. AVL-stromy, A-B stromy. Martin Pergel,

Transkript:

Programování v C++ 2, 7. cvičení spojový seznam 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 Dědění a polymorfismus potomek může zastoupit předka ukazatel na potomka může zastoupit ukazatel na předka časná a pozdní vazba virtuální metody čistě virtuální metody a abstraktní třídy grafické objekty abstraktní třída Go jako společný předek obsahuje čistě virtuální metodu nakresli() odvozené třídy (Bod, Usecka) ji musí implementovat použití ukazatele na společného předka Go*

Zadání Zadání příkladu Napište třídu List, která bude implementovat jednosměrně zřetězený seznam se zarážkou. Do třídy doplňte metody pro vložení prvku na konec seznamu a metodu, která odstraní ze seznamu všechny prvky. Dále napište abstraktní třídu Iterator a od ní odvod te třídu ListIterator, která bude implementovat iterátor nad seznamem.

Prvek seznamu potřeba použít deklaraci friend vytvoření nového typu přejmenování 1 typedef int Data; 2 class Item{ 3 Data data; 4 Item *prev. *next; 5 public: 6 Item(Data d); 7 void setdata(data &d); 8 Data getdata() const; 9 void print() const; 10 friend class List; 11 };

Vytvoření seznamu 1 class List{ 2 Item *first, *last; 3 unsigned int counter; //pocet prvku 4 void init(); //inicializace seznamu 5 public: 6 List(); //konstruktor 7 List(const List &other); //kopirovaci 8 //dalsi verejne metody... 9 }; 1 vytvoř nový prvek a jeho adresu ulož do hlavy 2 vytvoř nový prvek a jeho adresu ulož do zarážky 3 hlavu zapoj před zarážku, za hlavu zapoj zarážku 4 nastav počet prvků na 0 5 využití inicializační části konstruktoru

Vytvoření seznamu 1 void List::init(){ 2 first->next = last; 3 last->prev = first; 4 } 5 6 List::List() 7 : first(new Item(0)), last(new Item(0)), 8 counter(0) 9 { 10 init(); 11 }

Kopírovací konstruktor implicitní kopírovací konstruktor vytváří mělkou kopii potřeba hluboká kopie - zkopírovat data prvek po prvku z originálu 1 List::List(const List &other) 2 : first(new Item(0)), last(new Item(0)), counter(0) 3 { 4 init(); 5 copyfrom(other); 6 } 7 8 void List::copyFrom(const List &source){ 9 Item *curr = source.first->next; 10 while(curr!=source.last){ 11 this->pushback(curr->data); 12 curr=curr->next; 13 } 14 }

Přidání prvku na konec seznamu 1 data ulož do zarážky 2 vytvoř nový prvek a zapoj jej za zarážku 3 před nově vytvořený prvek zapojte zarážku 4 zarážku posuň na nově vytvořený prvek 1 void List::pushBack(Data &d){ 2 last->setdata(d); 3 last->next = new Item(0); 4 last->next->prev = last; 5 last=last->next; 6 counter++; 7 } alokace paměti může selhat!

Odstranění posledního prvku 1 posuň zadní zarážku na předchůdce 2 smaž původní zadní zarážku 3 v nové zarážce vynuluj ukazatel na následníka 1 void List::popBack(){ 2 last = last->prev; 3 delete last->next; 4 last->next = nullptr; 5 counter--; 6 } Přidání na začátek a smazání ze začátku: nahradit first za last a naopak nahradit prev za next a naopak

Tisk seznamu 1 pomocný ukazatel p nastavte na hlavu seznamu 2 dokud je p různé od zarážky: 1 tiskni data z prvku p 2 prvek p posuň na následníka 1 void List::print() const{ 2 for(item *p = first->next; p!=last; 3 p = p->next){ 4 p->print(); 5 } 6 }

Čištění seznamu čištění = vymazání všech prvků s užitečnými daty dokud není seznam prázdný, maž první prvek 1 bool List::empty() const{ 2 return (counter == 0); 3 } 4 5 void List::clear(){ 6 while(!empty()) 7 popfront(); 8 } Destruktor: smaž všechny prvky s užitečnými daty smaž obě zarážky

Implementace fronty možnosti implementace fronty: 1 pomocí pole 2 pomocí spojového seznamu návrhový vzor adaptér využití seznamu jako podkladové datové struktury skládání objektů seznam jako soukromý atribut fronty metody fronty využívají metody seznamu

Implementace fronty 1 class Queue{ 2 List *list; 3 public: 4 Queue(){list = new List;} 5 ~Queue(){delete list;} 6 bool empty() const{ 7 return list->empty(); 8 } 9 void push(data &d){ 10 list->pushback(d); 11 } 12 Data front() const{ 13 return list->front(); 14 } 15 void pop(){ 16 list->popfront(); 17 } 18 };

Závěr Shrnutí objektová implementace spojového seznamu konstruktor, kopírovací konstruktor destruktor přidání prvků na konec a začátek seznamu odstranění prvků z konce a začátku seznamu tisk seznamu implementace fronty návrhový vzor adaptér využití skládání objektů