Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++



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

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

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++

Šablony, kontejnery a iterátory

Pokročilé programování v jazyce C pro chemiky (C3220) Vstup a výstup v C++

Vector datový kontejner v C++.

Šablony, kontejnery a iterátory

Konstruktory a destruktory

Funkční objekty v C++.

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

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

Programování v jazyce C pro chemiky (C2160) 6. Funkce, struktury

Více o konstruktorech a destruktorech

Jazyk C++ I. Šablony

Množina v C++ (set, multiset).

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

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

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

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

Šablony funkcí a tříd (Templates) Genericita

Mělká a hluboká kopie

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

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

Jazyk C++ I. Šablony 2

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

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

PREPROCESOR POKRAČOVÁNÍ

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Standardní algoritmy v C++.

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

Množina čísel int stl-set-int.cpp

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

Hornerovo schéma. je algoritmus výpočtu hodnoty polynomu P(x) v bodě x 0. eliminuje výpočet i-té mocniny převodem na postupné násobení.

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

Úvod do programovacích jazyků (Java)

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

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.

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

8. Načítání a zápis PDB souboru

Programování v jazyce C pro chemiky (C2160) 5. Čtení dat ze souboru

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

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

8 Třídy, objekty, metody, předávání argumentů metod

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

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Základy C++ I. Jan Hnilica Počítačové modelování 18

Abstraktní datové typy

Hrátky s funkcemi. PV173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 29.

Pokročilé programování v jazyce C pro chemiky (C3220) Úvod do jazyka C++

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

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

Standardní algoritmy vyhledávací.

Programování v jazyce C a C++

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

První kapitola úvod do problematiky

Jazyk C# (seminář 6)

Jazyk C++ II. Šablony a implementace

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

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

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

Programování v C++ VI

Kolekce, cyklus foreach

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

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

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

Programování v jazyce C a C++

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

OOPR_05. Případové studie

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

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Operační systémy. Cvičení 4: Programování v C pod Unixem

Kolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín

Programování v jazyce C pro chemiky (C2160) 4. Textové řetězce, zápis dat do souboru

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

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

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

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

Abstraktní třídy, polymorfní struktury

7. Datové typy v Javě

Výčtový typ strana 67

konstruktory a destruktory (o)

PROGRAMOVÁNÍ V C++ CVIČENÍ

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

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

Konec a tak. PB173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 15.

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

typová konverze typová inference

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Úvod do programování - Java. Cvičení č.4

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

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

PROGRAMOVÁNÍ V C++ URČENO PRO VZDĚLÁVÁNÍ V AKREDITOVANÝCH STUDIJNÍCH PROGRAMECH ROSTISLAV FOJTÍK

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

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

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

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

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Transkript:

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

Globální konstantní proměnné Konstantní proměnné specifikujeme s klíčovým slovem const, tyto konstantní proměné musí mít hodnotu inicializovanou při definici, jejich hodnotu nelze v průběhu programu měnit Konstantní proměnné mohou být lokální, globální nebo členy třídy V C++ používáme globální konstantní proměnné namísto symbolických konstant definovaných direktivou #define používaných v jazyce C Globální konstantní proměnné lze využívat např. pro specifikaci velikosti polí Názvy konstantních proměnných často píšeme velkými písmeny const int MAX_ITEMS = 1000; int itemsarray[max_items]; return 0; 2

Statické členy třídy Statické členy třídy deklarujeme s klíčovým slovem static. Statické proměnné se chovají podobně jako globální proměnné, program pro ně alokuje paměť ihned po spuštění programu, při vytváření objektových proměnných se již pro ně žádná další paměť nealokuje. Statické proměnné tedy můžeme použít aniž bychom vytvořili příslušný objekt (tj. definovali objektovou proměnnou). Ke statickým proměnným přistupujeme přes jméno třídy a :: (Jmeno_tridy::jmeno_promenne). Pokud však k nim přistupujeme z metod téže třídy, stačí použít přímo jméno proměnné. Statické proměnné inicializujeme v samostatné definici mimo třídu (narozdíl od nestatických proměnných, které musíme inicializovat v konstruktoru). Statické proměnné často definujeme v sekci public aby byly přístupné i z funkcí a metod jiných tříd (pokud však toto nepotřebujeme, mohou být protected nebo private). 3

Statické členy třídy - příklad class Vector3D public: // Nasledujici staticka promenna bude obsahovat celkovy pocet // aktualne existujicich promennych typy Vector3D static int totalvectcount; Vector3D(); // Konstruktor ~Vector3D(); // Destruktor ; int Vector3D::totalVectCount = 0; // Inicializace staticke promenne Vector3D::Vector3D() totalvectcount++; Vector3D::~Vector3D() totalvectcount ; Vector3D v1, v2, v3; // Vola se trikrat konstruktor Vector3D() // Pokud volame staticke promenne mimo metody tridy, musime // pred jmeno promenne uvest jemno tridy oddelene dvema dvojteckama cout << "Celkovy pocet vektoru" << Vector3D::totalVectCount << endl; return 0; 4

Konstantní statické členy třídy Statické proměnné můžeme zároveň definovat jako konstantní tam kde je to vhodné. Pokud jsou typu int, můžeme je inicializovat přímo ve třídě. class Graphic public: // Nasledujici konstantni staticka promenna bude pouzita // pro cislo modre barvy static const int COLOR_BLUE = 3; void draw(int dev); ; void Graphic::draw(int dev) g2_pen(dev, COLOR_BLUE); // Dalsi kod metody Graphic g1; cout << "Modra barva ma cislo: " << Graphic::COLOR_BLUE << endl; return 0; 5

Statické metody Statické metody deklarujeme s klíčovým slovem static Klíčové slovo static uvádíme pouze v deklaraci ve třídě, v definici mimo třídu již ne Statické metody se chovají se podobně jako nečlenské funkce, tj. můžeme je volat aniž bychom vytvořili objekt (tj. definovali objektovou proměnnou) Ke statickým metodám přistupujeme přes jméno třídy a :: (Jmeno_tridy::jmeno_metody() ), pokud je však voláme z metod třídy, stačí použít přímo jméno metody Statické metody mohou operovat pouze nad statickými daty dané třídy Výhodou statických metod oproti nečlenským funkcím je vyšší přehlednost programu a zejména zabránění kolizím v názvech (několik tříd může mít statickou metodu se stejným názvem) 6

Statické metody - příklad class Graphic public: static int getcolornumberfromstring(const string &colorname); // Definice dalsich clenu tridy ; // Tady jiz slovo static neuvadime int Graphic::getColorNumberFromString(const string &colorname) if (colorname == "blue") return 3; return 0; // Pokud je nazev barvy neznamy, vrati 0 // Metodu Graphic::getColorNumberFromString() muzeme volat aniz // bychom definovali promennou tridy Graphic cout << "Cislo modre barvy: " << Graphic::getColorNumberFromString("blue") << endl; return 0; 7

Šablony funkcí Šablony funkcí používáme tam kde potřebujeme použít stejnou funkci pro odlišné typy argumentů a návratových hodnot Šablonu definujeme podobně jako funkci ale před hlavičkou funkce uvedeme template <typename T> nebo template <class T> kde T je volitelný symbol zastupující jméno typu Typů můžeme specifikovat i více: template <typename T1, typename T2, typename T3> V okamžiku volání jména šablony posoudí překladač typ předávaných argumentů a vygeneruje příslušnou funkci Šablony funkcí se v praxi používají jen v malé míře, ve standardní knihovně jsou však definovány některé užitečné šablonové funkce (např. swap(), min(), max()) Šablony lze definovat také pro metody (podobným způsobem jako pro funkce) 8

Šablony funkcí příklad 1 // Klasicke reseni bez pouziti sablon (pouzivame pretizeni funkci) int getmax(int value1, int value2) if (value1 > value2) return value1; else return value2; double getmax(double value1, double value2) if (value1 > value2) return value1; else return value2; int i1 = 3, i2 = 5, imax = 0; double d1 = 2.12, d2 = 6.78, dmax = 0.0; imax = getmax(i1, i2); // Tady se vola prvni funkce dmax = getmax(d1, d2); // Tady se vola druha funkce return 0; // Reseni s pouzitim sablony funkce template <typename T> T getmax(t value1, T value2) if (value1 > value2) return value1; else return value2; int i1 = 3, i2 = 5, imax = 0; double d1 = 2.12, d2 = 6.78, dmax = 0.0; imax = getmax(i1, i2); // Na zaklade sablony vygeneruje funkci pro int dmax = getmax(d1, d2); // Na zaklade sablony vygeneruje funkci pro double return 0; 9

Šablony funkcí příklad 2 // Sablona funkce pro zamenu dvou hodnot template <typename T> void swapitems(t &item1, T &item2) T itemaux; itemaux = item1; item1 = item2; item2 = itemaux; int i1 = 3, i2 = 5; string s1 = "Prvni retezec", s2 = "Druhy retezec"; Vector3D v1(3.1, 4.7, 9.0), v2(6.4, 1.2, 7.8); swapitems(i1, i2); // Vygeneruje se funkce pro typ int swapitems(s1, s2); // Vygeneruje se funkce pro typ string swapitems(v1, v2); // Vygeneruje se funkce pro typ Vector3D return 0; 10

Šablony tříd Šablony tříd fungují podobným způsobem jako šablony funkcí, ale na jejich základě se generují celé třídy Šablony tříd se v praxi používají jen v malé míře, standardní knihovna však šablony tříd hojně využívá Příslušné objektové proměnné deklarujeme: jmeno_sablony<jmeno_typu> jmeno_promenne template <typename T> class Vector3D // Sablona tridy pro 3D vektor public: Vector3D() x = 0; y = 0; z = 0; ; Vector3D(T ax, T ay, T az) x = ax; y = ay; z = az; ; // Zde budou definovany dalsi cleny sablony tridy private: T x, y, z; ; Vector3D<int> vectint; Vector3D<double> vectdouble; // Zde je mozne pracovat s objektovymi promennymi vectint a // vectdouble obvyklym zpusobem 11

Šablony tříd - příklad // Nasledujici priklad ukazuje jak definovat metodu mimo sablonu template <typename T> class Vector3D public: Vector3D() x = 0; y = 0; z = 0; void printvalues(); // Metoda bude definovana mimo sablonu tridy // Zde budou definovany dalsi cleny sablony tridy private: T x, y, z; ; template<typename T> void Vector3D<T>::printValues() cout << "Souradnice vektoru:" << x << y << z << endl; Vector3D<int> vectint; Vector3D<double> vectdouble; vectint.printvalues(); vectdouble.printvalues(); return 0; 12

STL standardní šablonová knihovna Součástí standardní knihovny jazyka C++ je standardní šablonová knihovna STL (standard template library) STL obsahuje například šablony funkcí implementující některé algoritmy nad souborem dat (třídění, vyhledávání, kopírování) Z šablonových tříd jsou nejpoužívanější kontejnery (zásobníky), které slouží k ukládání objektů libovolného typu Nejpoužívanějším kontejnerem je šablona vector, která je zobecněním polí, narozdíl od klasických polí není počet prvků v kontejnerech vector fixní, ale zvyšuje se podle počtu vložených prvků (velikost je limitována pouze dostupnou pamětí) Podrobnější dokumentace k STL na http://www.cppreference.com/wiki/ 13

Kontejner vector Pro použití kontejneru vector, musíme vložit hlavičkový soubor #include <vector> a deklarovat using namespace std; Kontejner vector obsahuje následující metody: operator[] - vrací příslušný prvek podobně jako klasické pole front() - vrací první prvek back() - vrací poslední prvek push_back() - vloží prvek na konec (resp. jeho kopii) pop_back() - vyjímá poslední prvek (nevrací nic) clear() - vyjímá všechny prvky (kontejner je pak prázdný) insert() vkládá na prvek na specifikovanou pozici size() - vrací aktuální počet prvků empty() - vrací informaci o tom, zda je kontejner prázdný (totéž jako size() == 0) Operátor [] a metody front() a back() vracejí prvky formou referencí a nekontrolují meze (při překročení mezí pole je jejich chování nedefinované) Podrobnější výčet všech metod kontejneru vector lze najít na: http://www.cplusplus.com/reference/stl/vector/ 14

#include <iostream> #include <vector> using namespace std; Kontejner vector - příklad class Circle // Tady by byly data a metody tridy Circle viz drive ; Circle circle; vector<circle> circlescontainer; // Definice kontejneru pro // objekty Circle circle.readfile(sstream); // Nactou se data do promenne circle circlescontainer.push_back(circle); // Kopie prvku se vlozi na konec // Cyklus pres prvky kontejneru vector for (int i=0; i < circlescontainer.size(); i++) circlescontainer[i].draw(dev); // Dalsi kod 15

Cvičení část 1 1. Vytvořte program vycházející z programu z úlohy 1 z minulého cvičení s následujícími úpravami: Program bude používat globální konstantní proměnné pro specifikaci meze polí (tj. např. const int MAX_GRAPHIC = 100;) Ve třídě Graphic vytvořte statické konstantní proměnné pro čísla barev (pro barvy: 0 white, 1 black, 3 blue, 7 green, 19 red, 25 yellow) Metodu getcolornumberfromstring() ve třídě Graphic předělejte na statickou metodu V programu dále vytvořte šablonu pro funkci která v cyklu vykreslí grafické objekty daného typu. Bude přijímat tři argumenty: pole grafických prvků, počet platných prvků v poli a číslo grafického zařízení. Tuto šablonu využijte pro vykreslení grafických objektů. Program otestujte se souborem graphic2.dat (v adresáři /home/martinp/c3220/data/). 1 bod 16

Cvičení část 2 2. Modifikujte program následujícím způsobem: Vytvořte šablonu třídy (s názvem např. Container) která bude obsahovat pole objektů a počet platných prvků v poli a dále následující metody Container() - konstruktor bez parametrů int add(const T &item) - přidá prvek (který přijme jako argument) na konec pole vrátí pořadí prvku v poli T get(int pos) const - vrátí prvek na dané pozici (pozici prvku přijme jako argument) T &operator[](int pos) - totéž jako get() ale prvek vrátí referencí int count() const - vrátí počet prvků pole Program upravte tak aby pro uložení grafických objektů používal výše uvedenou šablonu Container namísto obyčejných polí. Pozn.: Pro vykreslování objektů nyní nepoužívejte šablonovou funkci z předchozí úlohy ale vykreslujte podobně jako jako v podobně jako v původní verzi programu. Pro správné fungování programu je potřeba, aby metoda ve které se provádí vykreslování (Drawing::draw()) nebyla konstantní, protože se z ní volá nekonstantní operátor [] šablony Container. 3 body 3. Program modifikujte tak, že místo výše uvedené šablony Container bude používat kontejner vector ze standardní knihovny. 1 bod 17