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

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

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) Statické proměnné a metody, šablony v C++

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

Více o konstruktorech a destruktorech

Konstruktory a destruktory

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

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

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

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

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

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

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

Mělká a hluboká kopie

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

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

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

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

16. února 2015, Brno Připravil: David Procházka. Konstruktory a destruktory

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

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.

Programování v C++ VI

Algoritmizace a programování

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

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

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

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

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

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

Programování v jazyce C a C++

Programování v jazyce C a C++

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

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

PREPROCESOR POKRAČOVÁNÍ

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

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

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

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

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

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

Jazyk C++ I. Šablony 2

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

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

Připravil: David Procházka. Programovací jazyk C++

konstruktory a destruktory (o)

1. Téma 03 - Rozhodování

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

Struktury a dynamická paměť

DUM 06 téma: Tvorba makra pomocí VBA

Objektové programování

C++ objektově orientovaná nadstavba programovacího jazyka C

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

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

Virtuální metody - polymorfizmus

Struktura programu v době běhu

Projekt Obrázek strana 135

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

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

2 Datové typy v jazyce C

Generické programování

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

IRAE 07/08 Přednáška č. 1

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

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

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

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

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í jako nástroj porozumění matematice (seriál pro web modernivyuka.cz)

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

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

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

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

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

Objektově orientované programování

Dědění, polymorfismus

Objektově orientované programování v jazyce Python

Abstraktní třída a rozhraní

Programování II. Objektová dekompozice Třída jako objekt 2018/19

Jazyk C++ I. Polymorfismus

Objekty a třídy. Procedurální a objektově orientované programování. V této kapitole se naučíte: Procedurální a objektově orientované programování

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

Základy programování (IZP)

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Martin Flusser. December 15, 2016

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

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

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

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Úvod do programování. Lekce 1

Paměť počítače. alg2 1

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

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

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

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

Transkript:

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

Třídy v C++ Třídy jsou uživatelsky definované typy podobné strukturám v C, kromě datových položek (proměnných) však mohou obsahovat i funkce sloužící k manipulaci s datovými položkami dané třídy Proměnné definované uvnitř třídy se nazývají členská data, funkce se nazývají metody, společně se označují jako členy třídy Třídy definujeme pomocí klíčového slova class za kterým uvádíme název třídy, potom následují složené závorky mezi kterými jsou uvedeny členy třídy Definice třídy je ukončena středníkem int x, y; int radius; // Trida reprezentujici kruznici // Souradnice stredu kruznice // Polomer kruznice void printvalues(); void draw(); // Deklarace metody // Deklarace dalsi metody ; // Na konci musi byt strednik 2

Definice metod třídy Metody se definují podobně jako funkce, jejich příslušnost ke třídě se vyjádří uvedením jména třídy před jménem funkce oddělené dvěma dvojtečkama :: int x, y; int radius; // Trida reprezentujici kruznici // Souradnice stredu kruznice // Polomer kruznice void printvalues(); void draw(); // Deklarace metody // Deklarace dalsi metody ; // Na konci musi byt strednik void Circle::printValues() // Zde bude kod pro vypsani souradnic stredu a polomeru void Circle::draw() // Zde bude kod pro vykresleni kruznice 3

Instance Třídy Třída je datový typ a proto se jménem třídy pracujeme podobně jako se jmény základních datových typů (int, float, double, char...) Jmého třídy lze požít k definici proměnné, taková proměnná se nazývá instance třídy nebo objekt nebo objektová proměnná K datovým položkám a k metodám přistupujeme pomocí operátoru tečka // Na zacatku programu je definovana trida Circle int main() Circle circ; // Definice promenne, instance tridy (tj. objektu) circ.x = 120; circ.y = 150; circ.radius = 80; circ.draw(); // Volame metodu draw() cout << "Souradnice stredu: " << circ.x << ", " << circ.y << endl; return 0; 4

Přístup ke členům třídy z metod Uvnitř metod lze ke členům dané třídy přistupovat přímo int x, y; int radius; ; void printvalues(); void draw(); void Circle::draw() printvalues(); // Volame metodu dane tridy // Zde by byl dalsi kod pro vykresleni kruznice void Circle::printValues() cout << "Stred kruznice: " << x << ", " << y << endl; cout << "Polomer kruznice: " << radius << endl; 5

Metody s parametry Metody mohou přijímat parametry podobně jako ostatní funkce Názvy parametrů volíme odlišné od členů třídy int x, y; int radius; void setcentre(int ax, int ay); void printvalues(); void draw(); ; void Circle::setCentre(int ax, int ay) x = ax; y = ay; int main() Circle circ; // Definice promenne, instance tridy (tj. objektu) circ.setcentre(120, 150); circ.printvalues(); return 0; 6

Více instancí třídy Pro každý objekt (tj. instanci třídy) je v paměti alokován prostor pro datové členy; jednotlivé metody pracují nad daty objektu pro nejž jsou volány Metody proto nikdy nemůžeme volat samostatně, ale voláme je vždy ve spojení se jménem objektu nad jehož daty mají operovat // Na zacatku je definovana trida Circle a jeji metody int main() Circle circ1, circ2; // Pro kazdou ze dvou objektovych // promennych se v pameti alokuje misto // pro datove cleny x, y, a radius // Nasledujici dve metody budou operovat nad daty objektu circ1 circ1.setcentre(100, 90); circ1.draw(); // Nasledujici dve metody budou operovat nad daty objektu circ2 circ2.setcentre(200, 120); circ2.draw(); return 0; 7

Veřejné a soukromé členy třídy Členy třídy rozdělujeme na veřejné a soukromé; v definici třídy je rozlišujeme pomocí klíčových slov public a private K soukromým členům lze přistupovat pouze z metod dané třídy K veřejným členům lze přistupovat z libovolných funkcí nebo metod // Verejne cleny tridy void setcentre(int ax, int ay); void draw(); private: // Soukrome cleny tridy int x, y; int radius; void printvalues(); ; 8

Veřejné a soukromé členy třídy // Verejne cleny tridy void setcentre(int ax, int ay); void draw(); private: // Soukrome cleny tridy int x, y; int radius; void printvalues(); ; int main() Circle circ; circ.setcentre(120, 150); circ.draw(); // setcentre() je verejna metoda // draw() je verejna metoda // Nasledujici by nefungovalo!!! Prekladac by ohlasil chybu! circ.radius = 80; // radius je soukromy clen tridy circ.printvalues(); // printvalues() je soukromy clen tridy return 0; 9

Veřejné vs. soukromé členy třídy Jako veřejné ponecháme pouze metody ke kterým potřebujeme přistupovat z funkcí nebo z metod jiných tříd, ostatní ponecháme soukromé Datové položky ponecháváme téměř vždy jako soukromé, pro nastavení nebo získání jejich hodnoty použijeme veřejné metody void setcentre(int ax, int ay); void setradius(int r); int getcentrex(); int getcentrey(); int getradius(); private: int x, y; int radius; ; void Circle::setCentre(int ax, int ay) x = ax; y = ay; void Circle::setRadius(int r) radius = r; int Circle::getCentreX() return x; int Circle::getCentreY() return y; int Circle::getRadius() return radius; 10

Konstruktor Konstruktor je metoda, která je zavolána automaticky po definici instance třídy (nejdříve se přidělí paměť pro datové členy třídy, pak se volá konstruktor) Konstruktor má vždy stejné jméno jako třída (podle toho překladač pozná že to je konstruktor) Konstruktory se využívají zejména pro inicializaci datových členů třídy (tj. nastavení jejich výchozích hodnot) Konstruktory nemají žádnou návratovou hodnotu Circle(); // Deklarace konstruktoru private: int x, y, radius; ; Circle::Circle() x = 0; y = 0; radius = 100; int main() Circle circ; // V tomto okamziku se alokuje pamet pro promennou // a pote se automaticky zavola konstruktor Circle() 11

Konstruktor s parametry Konstruktor může přijímat parametry, které mu lze předat při definici instance třídy (předávané hodnoty uvádíme v závorkách za jménem definované proměnné) Circle(int ax, int ay, int r); // Konstruktor s parametry private: int x, y, radius; ; Circle::Circle(int ax, int ay, int r) x = ax; y = ay; radius = r; int main() Circle circ(120, 150, 80); // Definice promenne s inicializaci. // Parametry jsou predany konstruktoru. 12

Destruktor Destruktor je metoda, která je automaticky zavolána po zrušení instance třídy (např. lokální proměnné jsou rušeny po opuštění funkce) Jméno destruktoru je tvořeno znakem ~ a jménem třídy (podle toho překladač pozná že to je destruktor) Destruktory se využívají zejména pro uvolnění dynamicky alokované paměti Destruktory nemají žádnou návratovou hodnotu ani nemohou přijímat žádné parametry Circle(); ~Circle(); private: int x, y, radius; ; // Konstruktor // Destruktor Circle::~Circle() // Tady muze byt kod napr. pro uvolneni dynamicky alokovane pameti 13

Předávání instancí třídy jako parametry funkcí a metod S instancemi třídy se pracuje podobně jako s běžnými proměnnými, lze je předávat jako parametry do funkcí a metod // Nekde na zacatku je definovana trida Circle a jeji metody // Funkce vykresli dve kruznice, ktere jsou ji predany jako // parametr void drawcircles(circle circ1, Circle circ2) circ1.draw(); circ2.draw(); int main() Circle circ1, circ2; drawcircles(circ1, circ2); return 0; 14

Instance třídy jako návratová hodnota funkce nebo metody Instance třídy lze vrátit z funkce příkazem return // Tady nekde na zacatku je definovana trida Circle // Funkce vrati kruznici s vetsim polomerem Circle getlargercircle(circle circ1, Circle circ2) if (circ1.getradius() > circ2.getradius()) return circ1; else return circ2; int main() Circle circ1, circ2; Circle largercirc; largercirc = getlargercircle(circ1, circ2); return 0; 15

Funkce vs. metody Metody upřednostňujeme před funkcemi, zejména pokud funkce/metoda pracuje s datovými položkami dané třídy void printvalues(); ; void Circle::printValues() // Metoda tridy Circle cout << "Stred kruznice: " << x << ", " << y << endl; cout << "Polomer kruznice: " << radius << endl; void printcirclevalues(circle circ) // Funkce cout << "Stred kruznice: " << circ.getcentrex() << ", " << circ.getcentrey() << endl; cout << "Polomer kruznice: " << circ.getradius() << endl; int main() Circle circ; circ.printvalues(); // Optimalni reseni volani metody printcirclevalues(circ); // Mene vhodne reseni volani funkce return 0; 16

Konvence ve jménech Standard jazyka C++ nepředepisuje žádná pravidla pro používání velkých a malých písmen v názvech Existuje několik neoficiálních konvencí Pro naše účely budeme používat následující konvenci: Jména tříd začínáme velkým písmenem Jména datových položek a metod začínáme malým písmenem (s vyjímkou konstruktorů a destruktorů) Pokud se název proměnné nebo metody skládá z více slov, začínáme každé nové slovo velkým písmenem (bez mezery) Circle(int ax, int ay, int r); ~Complex(); void setcentre(int newx, int newy); int getradius(); int getcolornumberfromstring(string str); private: int x, y, radius; void printvalues(); ; 17

Dodržujte následující pravidla Na konci definice třídy nezapomeňte uvádět středník. Pro každou třídu definujte její konstruktor. V konstruktoru vždy inicializujte všechny datové členy třídy (pokud konstruktor přijímá parametry, budou zpravidla inicializovány pomocí nich, jinak je inicializujeme vhodnou hodnotou, zpravidla nulou a pod.). Datové členy třídy uvádějte vždy jako soukromé (tj. v sekci private). 18

Cvičení 1. část 1. Vytvořte program pro kreslení kružnice. V programu definujte třídu Circle která bude mít konstruktor (bez parametrů), a následující veřejné metody: setcentre() nastavující souřadnice kružnice setradius() nastavující poloměr kružnice setcolor() nastavující číslo barvy kružnice printvalues() vypisující hodnoty datových členů (souřadnice středu, poloměr, číslo barvy) draw() vykreslující kružnici na obrazovku (pomocí knihovny g2) Ve funkci main() definujte objektovou proměnnou pro kružnici. Potom si program si vyžádá od uživatele souřadnice středu kružnice (v pixelech), poloměr kružnice (v pixelech) a číslo barvy (1, 3, 7, 19 nebo 25). Hodnoty se načtou do lokálních proměnných a potom se nastaví příslušné hodnoty v objektové proměnné kružnice. Nakonec se zavolá metoda printvalues(), která vypíše hodnoty a pak metoda draw(), která vykreslí kružnici. 2 body 19

Cvičení 2. část 2. Program modifikujte tak aby konstruktor přijímal čtyři parametry (souřadnice středu, poloměr, číslo barvy). Při definici proměnné kružnice předejte do konstruktoru vhodné hodnoty. Dále implementujte ve třídě Circle metody readcentre(), readradius() a readcolor() které od uživatele vyžádají příslušné hodnoty. Dále implementujte metodu readvalues(), ktrá postupně zavolá tři výše zmíněné metody. Tuto metodu použijte v programu pro načtení dat od uživatele. 1 bod 3. Modifikujte program z úlohy 2 tak, aby barva nebyla zadávána jako číslo ale formou textu (black, blue, green, red, yellow). Podobně při výpisu hodnot se barva vypíše jako text. Ve třídě Circle však bude bude hodnota barvy uchovávána i nadále jako číslo. Pro tento účel implementujte ve třídě Circle dvě soukromé metody getcolornumberfromstring() a getcolorstringfromnumber(). nepovinná, 1 bod 20

Cvičení 3. část 4. Vytvořte program, který si od uživatele vyžádá souřadnice a poloměr pro dvě kružnice. Potom v jednom okně vykreslí tyto dvě kružnice a navíc třetí kružnici, jejíž střed bude ležet na spojnici středů těchto dvou kružnic a velikost poloměru bude průměrem z poloměru dvou zadaných kružnic. Použijte stejnou třídu Circle jako v předchozí úloze. Navíc v ní implementujte metody getcentrex(), getcentrey() a getradius() pro získání hodnot příslušných členských proměnných. Dále mplementujte metodu setaveragecircle(), která přijme jako parametr dvě kružnice a z nich spočítá hodnoty svého středu a poloměru, jak je uvedeno výše. První kružnice bude vždy zelená, druhá modrá a třetí zprůměrovaná kružnice bude červená. 1 bod 21