Objektově orientované programování v jazyku C++

Rozměr: px
Začít zobrazení ze stránky:

Download "Objektově orientované programování v jazyku C++"

Transkript

1 Objektově orientované programování v jazyku C++ Ing. David Procházka, Ph.D., Ing. Ondřej Popelka, Ph.D., Mgr. Tomáš Foltýnek, Ph.D., Ing. Jan Kryštof, Ph.D., Ing. Hana Netrefová, Ph.D.

2 2 Obsah Obsah Cíl kurzu 3 Návaznost 3 Motivace 3 Poučení 3 Úvod 3 1 Základy jazyka C++ 5 Historie a vývoj jazyka C Překlad a základy jazyka Řídící struktury Funkce a rekurze Vstupní a výstupní proudy Objektově orientované programování 19 Základní pojmy a koncepty OOP Test Konstruktor, destruktor Test Vztahy Asociace Test Agregace Dědičnost Test Příklady Pokročilé techniky OON Složitější případy dědičnosti a polymorfismus Test Návrhové vzory Příklady Souhrn Příklady Práce s pokročilými vývojovými nástroji 22 Co v této kapitole naleznete Animace: Visual Paradigm vytvoření diagramu tříd a základní třídy Animace: Visual Paradigm tvorba a nastavení základním vazeb v diagramu tříd.. 22 Animace: Visual Paradigm generování kódu z diagramu tříd a rekonstrukce diagramu tříd z kódu Práce s řetězci, soubory a výjimky 23 Soubory pomocí proudů Práce s řetězci třída String Výjimky Příklady Knihovna STL a vybrané nástroje OOP 44 Datové kontejnery Algoritmy Vybrané nástroje OOP Příklady Grafické knihovny 69 OpenGL, DirectX, XNA a ti další OpenGL Příklady

3 Obsah 3 Závěr 75 Slovníček pojmů 76

4 4 Obsah Cíl kurzu Cílem tohoto elearningového kurzu je seznámit studenty se základními myšlenkami objektově orientovaného návrhu a jejich implementací převážně v jazyku C++. Po absolvování kurzu by měl být student schopen převést určitý programátorský problém do podoby objektového modelu a ten umět zapsat v jazyku C++. Důraz bude kladen na využívání knihoven C++ jakými jsou STL, aj. Návaznost Tento kurz nemá žádné přímé prerekvizity, je však přínosné, pokud se čtenář orientuje v základech programování v jakémkoliv jazyku. Motivace Motto tohoto kurzu jsem vybral z knihy o objektově orientovaném návrhu pana Boocha: Hvězda v kolapsu, dítě učící se číst, buňka bílé krvinky útočící na virus, jsou tři objekty světa. Každý z nich je děsivě složitý. Einstein tvrdil, že každé vysvětlení přírody musí být jednoduché, protože Bůh není ani ješitný ani panovačný. Programátoři však nejsou tak důvěryhodní. Vystihuje hlavní myšlenku kurzu. Vytváření programů je velmi složitá činnost, která leží na pomezí vědy a umění. Metodika tvorby programů prochází neustále evolucí. Aktuálním trendem je objektově orientované programování a z něj vycházející techniky. Důvodů pro studium OOP je celá řada. Jen namátkou: Vychází z něj mnoho dalších metodik - návrhové vzory, programování řízené testy, atp. Většina rozsáhlejších programátorských projektů je založena právě na této metodice. Programovací jazyky, které jsou dnes nejprogresivnější - Java, C#, C++, PHP, Python - jsou čistě objektové nebo objekty přímo podporují. Pro studenty informatických oborů je proto nezbytné osvojit si základy práce v této oblasti. Cílem tohoto kurzu je seznámit Vás se základy této metodiky. Poučení Programování se nelze naučit čtením, jen zase programováním. Chápejte tuto oporu jako návod, jaké problémy si máte prakticky vyzkoušet. Každou část knihy si po přečtení vyzkoušejte, abyste si problém skutečně osvojili. Čtěte pozorně! Pokud Vám nebude něco jasné nebo naleznete chybu, prosím, napište nám. Opora je stále ve vývoji. Snažíme se ji postupně doplňovat o výstižnější příklady a eliminovat typografické zrůdnosti, kterých se díky elearningovému prostředí (a našim chybám) dopouštíme. Úvod Vývoj programů Problémy při vývoji programů V okamžiku, kdy začnete tvořit rozsáhlejší programy, narazíte na řadu problémů. Složitost řešeného zadání (komplexní systémy, složitá funkčnost, Problém vývoje (synchronizace pracovníků, změny v zadání,...) Program je stavový automat (Svět je spojitý systém - na malou změnu na vstupu dostanu malou změnu na výstupu. Program se chová diskrétně - mění stavy skokově. ) Důsledky těchto problémů budou chyby v softwaru, zpoždění projektů, nespokojenost zákazníků atp. Velké části těchto problémů se dá předejít zvolením vhodné metodiky vývoje. Nad vývojem programu se dá uvažovat ve dvou rovinách. Prvním krokem je analýza problému a jeho pochopení. Teprve potom se aplikuje postup podle zvolené metodiky.

5 Obsah 5 Řešení problémů V průběhu analýzy zadání, i při jeho implementaci, používáme pro zjednodušení naší práce obvykle tři nástroje: Dekompozici: Rozdělení problému na menší části a jejich postupné řešení. Abstrakci: Ignorování nedůležitých detailů. Vytváření zjednodušených modelů. Hierarchii: Nalézt hierarchické závislosti v systému není vždy jednoduché. Umožní však lépe popsat vzájemné vazby mezi částmi systému, a tím ho výrazně zjednodušit. Jakkoliv se tyto pojmy mohou zdát v tomto okamžiku poněkud abstraktní, bez přímé vazby na programátorskou praxi, ukáže se, že většina postupů používaných při objektově orientovaném programování jsou aplikacemi těchto obecných myšlenek. Velmi krátká historie vývoje programovacích technik Nestrukturované programování (jeden kontinuální program, globální data) Procedurální programování (části kódu jsou uloženy do procedur, kontrola funkce jednotlivých procedur - menší chybovost, jeho rysy jsou de facto používány při implementaci metod tříd) Modulární programování (Program je rozdělen na více malých částí, které spolu komunikují pomocí volání procedur. Každý modul má svoje data.) Objektově orientované programování (Program je rozdělen na objekty. Každý objekt obsahuje jak data, tak procedury na jejich obsluhu.) Metody vycházející z OOP (Tím se dostáváme do současnosti. Patří sem zejména techniky jako jsou programování řízené testy, programování řízené modely, extrémní programování a další.) Post-objektové techniky (Toto označení je velmi diskutabilní, ale lze se např. zařadit SOA (Service Oriented Architecture), která uvažuje, podle jedné z definic, jako základní kámen programu nikoli třídu, ale skupinu tříd, které vykonávají společně určitou funkci službu.) Vedení projektu založeného na OOP Objektově orientované programování, které je předmětem tohoto tutoriálu, se skládá z o. o. analýzy a o. o. návrhu. Obecné fáze projektu (částečně podle Bruce Eckela) jsou následující: 1. Příprava plánu (vrhnu se na to vs. příprava) 2. Základní téma (loď připluje, naloží, odpluje) 3. Co budeme vytvářet (Use Case Diagram) 4. Jak budeme systém budovat (Class-Responsibility-Collaboration karty) 5. Vytvoření jádra systému 6. Iterace případů použití a evoluce Existuje samozřejmě mnoho různých metodik vedení projektů, jejich studium by si dokonce zasloužilo samostatný kurz. Tyto body jsou ale poměrně univerzální a velká část různých metod vedení projektů tím či oním způsobem rozvíjí tuto základní myšlenku. Chtěl jsem tím v zásadě upozornit na fakt, že obvykle je doporučováno postupovat při vývoji softwaru trochu jiným, uvážlivějším, způsobem, než hrrrr na to, ať je to za námi.

6 6 Základy jazyka C++ 1 Základy jazyka C++ Historie a vývoj jazyka C++ Historie jazyků rodiny C Jazyk C Historie C++, který je v tomto kurzu používán se odvíjí od jazyku C. Kolem roku 1970 byl tým programátorů kolem Dennise Ritchieho v Bellových laboratořích pověřen vývojem nového operačního systému pro telekomunikační AT&T. Tím systémem se měl stát Unix. Programátoři ale naznaly, že nemají k dispozici programovací jazyk, který by odpovídal jejich potřebám, proto se rozhodly napsat si vlastní jazyk - C. Název C má poměrně prozaický původ. V té době existoval jazyk B a proto padla volba na C - následující volné písmeno. Podrobnosti o vývoji jazyka můžete najít přímo na stránkách Bellových laboratoří 1. V průběhu doby se jazyk C silně měnil. Jeho evoluci lze ve stručnosti popsat takto: 1978: Brian Kernighan a Dennis Ritchie vydávají The C Programming Language. Tato kniha určila první neoficiální standard pro C označovaný jako C podle Kernighama a Ritchieho (K-R C). ANSI C: Existuje několik verzí normy, nejrozšířenější verze je z r ISO/IEC C (ISO 99): Poslední verze normy ISO/IEC 9899:1999. V roce 2001 byly vydány opravy. Jazyk C lze popsat jako: relativně nízkoúrovňový (systémový) jazyk, ideální pro vývoj operačních systémů, driverů, překladačů, podporuje obrovské množství knihoven, nižší efektivita vývoje, která je vykoupena rychlým a elegantním kódem, podporuje objekty Objective C (Na vývoji Objective C se podílí velkou mírou firma Apple. Koncepce objektů je silně odlišná od ostatních jazyků rodiny C. V současné době je k dispozici nová verze jazyka Objective C 2). Jazyk C++ Tímto se pomalu dostáváme k jazyku C++. Začněme jeho názvem - C++. Je evidentní, že vychází z názvu svého předchůdce - C. ++ je v C operátor pro inkrementaci nebo následníka. C++ tedy znamená následník C. C++ je jazyk od počátku orientovaný na objektový návrh. Vznik C++ můžeme datovat přibližně do roku 1985 a opět do Bellových laboratoří. Jeho autorem je Bjarne Stroustrup. C++ se stal vzorem pro implementaci mnoha jiných objektových jazyků - C#, Java, aj. Jako správný následník si C++ snaží zachovat kompatibilitu s C. Jakýkoliv program v C by měl být platným programem v C++ a měl by jít přeložit překladačem pro C++. První překladače C++ byly preprocesory, které překládaly z C++ do C. Dnes již některé programy v jazyku C překladači pro C++ překládat nelze, ale zpětná kompatibilita s C je pořád velmi dobrá. Pokud je program napsán podle současných norem C, je z 99% přeložitelný překladačem C++. Tohoto jevu je v praxi stále hojně využíváno, protože nové moduly mnoha programů v C chtějí využívat např. STL, objekty, či jiné nástroje, které poskytuje pouze C++. C++ je v současné době samořejmě také standardizován - viz popis standardů 2. Základní vlastnosti C++: jazyk od počátku orientovaný na OOP, rychlejší vývoj aplikací oproti C, abstraktní datové typy, výjimky, odlišná filozofie práce se soubory, terminálem, atp. jakkoliv je zpětně podporována většina konstrukcí C, není dobré plést dohromady C a C++ kód

7 Základy jazyka C++ 7 Jazyk C# C# (sí šarp) označuje hudební předznamenání, které zvyšuje notu o půl tónu. C# tedy v hudební nauce značí cis zvýšené C. C# je vysoko úrovňový objektově orientovaný jazyk vyvinutý firmou Microsoft (Andersem Hejlsbergem) pro platformu.net. Byl schválen standardizačními komisemi ECMAa ISO. Založen na jazycích C++ a Java. Jedná se prakticky o přímého konkurenta Javy, ze kterého silně čerpá (na druhou stranu v současné době Java také čerpá ze C#). C# se využívá hlavně k tvorbě databázových programů, webových aplikací, webových služeb, ale i desktopových aplikací. Původně existoval pouze oficiální překladač firmy Ms pro platformu Windows, ale dnes je již k dispozici projekt Mono 3, který je otevřenou multiplatformní implementací překladače (interpreta) pro C# a další jazyky.net frameworku. Projekt je pod patronací firmy Novell. Zásadními rysy C# jsou: jazyk C# může být transformován jak do strojového kódu, tak do Common Intermediate Language 4, resp. Common Language Runtime 5 (v současné době ale překladač do strojového kódu neznám), automatický garbage collector, orientace na rychlost vývoje, zvláště webových aplikací, neexistují globální proměnné, ukazatele mohou být použity pouze v blocích kódu explicitně označených jako unsafe, silně typový jazyk (hlídá si konverze mezi typy ještě více, než C++), nevýhodou je, že oficiálně je podporován pouze na platformě Ms Windows. Překlad a základy jazyka Překlad programů v C++ a základy syntaxe Překlad pomocí GNU C++ překladače Způsob překladu se liší podle překladače, který je použit a případně podle vývojového prostředí. Existuje řada vývojových prostředí, ve kterých lze překlad realizovat prakticky zmáčnutím tlačítka. My budeme v rámci této opory pracovat překladačem GNU C++. Byl zvolen z toho důvodu, že je zdarma a že je dostupný prakticky pro všechny platformy. Přesto je však nutné zdůraznit, že GNU C++ není jedinou nebo obecně nejlepší volnou. Velmi kvalitní je např. překladač firmy Microsoft, který je poměrně rychlý a produkuje dobře optimalizovaný kód. Naučme se ale nyní základním příkazům umožňujícím překlad kódu z příkazové řádky. (Jako ideální prostředí pro zkoušení programování v C++ doporučuji UNIXové systémy, které mají dobrou ochranu paměti a velmi dobře si rozumí s terminálem, který budeme pro překlad a ladění používat.) Základní příkaz pro překlad kódu v GNU C++ je: c++ zdrojovy kod.cc -o binarni soubor "c++ je samozřejmě příkaz pro překlad (ekvivalentem je příkaz g++). "-o" je parametr určující název výstupního souboru. V případě platformy Windows je to obvykle jmeno souboru.exe, v UNIXových systémech je to prostě jméno souboru. Soubor se zdrojovým kódem je důrazně doporučeno pojmenovávat s příponou cc, případně cpp. Další informace naleznete na stránkách překladače nebo manuálových stránkách. Základní informace Jazyk C++ rozlišuje malá a velká písmena. MojePromenna je tedy něco zcela jiného, než mojepromenna Intermediate Language 5 Language Runtime

8 8 Základy jazyka C++ Komentování Komentování kódu, aby jej překladač nebral v potaz, lze dělat pomocí dvou lomítek // nebo pomocí dvojce /* a */. Je důrazně doporučeno používat pro komentování jednoho, dvou řádků pouze // a ne druhý způsob. Připravili byste se tak o možnost zakomentovat pomocí nich větší část kódu. // takto zakomentuji vetsi cast kodu /* int promenna, operand1, operand2; operand1 = 10; // sem jsem pridal komentar //operand2 = 20; // tento radek jsem zakomentoval operand2 = 30; /* pokud sem napisu tento komentar, tak "velky komentar" skonci zde a ne az dole */ promenna = operand1 + operand2; / // zde skoncil velky komentar Hello world /* nasledujici program vypise na obrazovku napis "Ahoj svete" */ #include<iostream> // nacteni knihovny pro vypisovani na terminal using namespace std; // urceni pracovniho jmenneho prostoru // hlavni funkce programu, ktera se automaticky zavola jako prvni int main(){ // vypis textu do terminalu, prozatim tise akceptujme cout << "Ahoj svete" << endl; Datové typy a proměnné Základní Celočíselné: int, longint, short int Reálné: float, double, long double Znaky a řetězce: char (znak) a string (řetězec) Prázdný tip: void Speciální pole, výčtový typ, záznam, union, seznam, fronta, zásobník,... (podporováno prostřednicvím STL) třída, struktura (Zařazení třídy mezi datové typy je samozřejmě diskutabilní, ale často je na místě běžně užívaných typů uváděna, proto jsem ji do výčtu také zařadil.) Rozsah typu závisí na architektuře a překladači, proto nemá smysl uvádět jejich velikosti nebo rozsahy. Zjistíme jej pomocí příkazu sizeof(int). Deklarace a inicializace proměnné: typ jmeno = inicializacni hodnota

9 Základy jazyka C++ 9 int i = 1; // globalni promenna int main(void) { int j; // lokalni promenna return 0; Globalní proměnnoulze číst a modifikovat z jakéhokoliv místa programu. Lokální proměnná platí pouze v dané funkci nebo struktuře. Globální proměnné vytváříme mimo funkce a třídy. Pokud chceme do proměnné přiřadit hodnotu, použijeme znak =, ne :=, jak je tomu např. v Pascalu. K vypsání určitého řetězce na obrazovku budeme používat následující konstrukci: cout << "Ahoj", k výpisu proměnné cout << nazevpromenne. Pokud budeme chtít skočit na nový řádek, pošleme na cout endl. Výstupy lze spojovat: cout << "Hodnota je: " << vysledek << endl; Prozatím to berme jako fakt. Pricip práce s proudy bude vysvětlen dále. Pole Pole trochu zvláštní, byť velmi používaný, typ. Zmíním se proto o něm trochu více. Pole může být obecně vícerozměrné a může obsahovat jakýkoliv typ a dokonce i objekty. Ukažme si problém na příkladu jednorozměrného a dvourozměrného pole celých čísel: int pole1d[10]; // deklarace pole1d = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10; // naplnění hodnotami pole1d[5] = 11; // zápis na určitou pozici float pole2d[2][2]; //deklarace 2D pole pole2d[0][0] = ; //zápis na určitou pozici Pole jsou vždy indexována od nuly! Výčtový typ Je nejjednodužší možností, jak si definovat vlastní typ. Potřebujeme například ukládat barvy, které může mít karoserie auta: enum Barvy {cervena, modra, bila, cerna; int main(){ Barvy karoserie; karoserie = cerna;...

10 10 Základy jazyka C++ O dalších strukturách typu záznam a union se nebudu zmiňovat. Jejich popis naleznete v běžně dostupné literatuře. Osobně však doporučuji zvážit jejich nahrazení pomocí šablon a objektů, o kterých bude psáno dále. Kód se tak stane přehlednějším a ucelenějším. Tyto struktury měly smysl hlavně v neobjektovém C, v C++ je jejich využívání diskutabilní. Aritmetické výrazy Příkazy jsou v C++ zpravidla ukončeny středníkem. Výraz ukončený středníkem se stává příkazem. i = 2 výraz s přiřzením i = 2; příkaz Operátory operátory binární: +, Γ, *, /, % c = a+b; opertory unární: ++, ΓΓ j = 5; j++; // zvedni hodnotu j o 1 i = ++j; // uloz do i hodnotu j zvedlou o jedna operátory přiřazení: =, +=, Γ=, *=, /=, %= i += a // ekvivalentní výrazu i = i+a; operátory pro booleovské výrazy: ==,! =, &&,,! if (a==b)... if (!a == true)... relační operátory: <, >, <=, >= if (a>b)... Napište program, který v hlavní funkci programu vytvoří proměnné a a b. Uložte do nich dvě libovolná čísla. Postupně vypisuje na obrazovku výsledky jejich součtu, násobení, inkrementace, atp. Pro výpis použijte příkaz z Hello world příkladu. Např.: cout << "Soucet je: " << a+b << endl; Řídící struktury Řídící struktury v C++ Smysl řídících struktur je v tom, že umožňují řízení běhu programu. Program díky nim nemusí běžet řádek po řádku, ale může některé části kódu přeskakovat, opakovat, atp. Pracovně můžeme řídící struktury rozdělit na cykly a podmínky. Začněme podmínkami. Podmínky Jak bylo řečeno, smysl podmínek je v tom, že umožňují přeskakovat určité části kódu, resp. umožňují vybrat, která z několika částí kódu se provede. Základní podmínkou je dvojce příkazů: if - else Princip si vysvětlíme na jednoduchém příkladu.

11 Základy jazyka C++ 11 int proved = 1; int hodnota = 5; if (proved == 1){ hodnota = 10; Program funguje následovně: Pokud je v proměnné proved uložena jednička, bude na konci kódu v proměnné hodnota 10. Pokud bude v proved jiné číslo, kód ve složených závorkách se neprovede a v hodnota bude 5. Pokud je v těle podmínky pouze jeden příkaz, jako v předchozím příkladu, lze ji zapsat bez složených závorek if (proved == 1) hodnota = 10; Příkaz if můžeme rozšířit použitím else. Else může být opět podmíněno nějakou hodnotou nebo nepodmíněné (tj. provede se vždy, pokud se neprovede kód u if). Použití bude patrné z následucícího příkladu: if (volba == 1) { cout << "Uzivatel vybral volbu 1" << endl; cout << "Soucet je: " << a+b << endl; else if (volba == 2) { cout << "Uzivatel vybral volbu 2" << endl; cout << "Rozdil je: " << a-b << endl; else { cout << "Uzivatel vybral jinou volbu, nez 1 nebo 2" << endl; Pokud bude volba rovna jedničce, provede se první sekce kódu, pokud dvojce, provede se druhá, pokud čemukoliv jinému, provede se poslední sekce. Switch Pokud bych měl psát několik if podmínek za sebou, jako je tomu v předchozím příkladu, mohu je nahradit příkazem větvení switch. switch (volba) { case 1 : c = a+b; // zde jsem "úmyslně" zapomněl dát brake; bude se provádět i case 2 - častá chyba case 2 : c = a-b; d = c+b; break; case 3 : c = a*b; break; default : cout << "Neznama volba"; break; Rozhodování, která část kódu se provede, se provádí na základě hodnoty uložené v proměnné volba. Podle ní se vybere čás kódu uvedená návěstím case s příslušnou hodnotou. Provádění příkazů pokračuje až do nalezení příkazu break, ne do dalšího návěstí case! V případě, že ve volbě bude uložena jednička se tedy provede jak příkaz se sčítáním a a b, tak příkazy patřící k návěstí 2. Za příkazem sčítání totiž není break. Ternální operátor Ternální operátor je specifikum jazyka C. Jedná se o zkrácený zápis jednoduché podmínky přiřazení. Ukažme si to opět na příkladu.

12 12 Základy jazyka C++ if (j == 1){ hodnota = 5; else { hodnota = 10; lze zapsat: hodnota = (j == 1)? 5 : 10; // Pokud je i rovno 1, pak do hodnota uloz 5, jinak 10. Jaká hodnota bude uložena v i a k na konci toho kódu? int i, k, j = 2; i = (j == 2)? 1 : 3; k = (i > j)? i : j; Cykly Cykly rozlišeme na ty, které mají pevný počet opakování a na ty, jejichž počet opakování je dán platností určité podmínky. Cyklus s pevným počtem opakování je v C++ jeden - for (z určitého úhlu pohledu mezi tyto cykly patří i for each, tj. jsou dva). For Počet opakování cyklu je dán podmínkou zapsannou v jeho hlavičce. Např. proměnná counter bude postupně nabývat hodnot od 0 do 9 a při každém průchodu cyklem se zvýší o jedna (viz následující příklad). int counter; for (counter = 0; counter<10; counter++){ cout << counter << endl; Proměnná counter má na počátku hodnotu nula a bude se pomocí unárního operátoru ++ zvětšovat o jedna, dokud bude platit podmínka uvedená v závorce na druhém místě. Současná verze C++ nám umožňuje deklarovat řídící proměnnou cyklu přímo v samotné deklaraci cyklu (závorce). Tento krok je velmi vhodný pro udržení přehledosti kódu. Proměnná totiž nebude platit v rámci celé funkce (metody, atp.), ale jen do dobu provádění cyklu. Tím můžeme zabránit zbytečnému nedorozumnění k čemu je tato proměnná?.

13 Základy jazyka C++ 13 int i = 1; i = a + b; // pouzivam promennou k vypoctum... // zapomel jsem, ze jsem i pouzil k vypoctum for(i = 0; i<10; i++){... // po skonceni cyklu uz v i neni soucet, ale 9 Uděláme předchozí příklad trochu čistěji: int i = 1; i = a + b; // pouzivam promennou k vypoctum... // deklaruji novou promennou i pouze pro rizeni cyklu for(int i = 0; i<10; i++){... // po skonceni cyklu v puvodnim i je stale soucet // i, ktere pouzival cyklus uz neexistuje Nezáleží na tom, zda budete počítadla v cyklech na počátku nastavovat na 0 nebo na 1. Je ale dobré zvyknout si na jeden způsob a ten dodržovat. While a do-while Cyklus se provádí tak dlouho, dokud platí podmínka. Syntaxe: while(podminka){ prikaz1; prikaz2;... int x = 0; while(x<10){ x++; V tomto případě jsme podmínku běhu uložili na začátek. Může nastat situace, že se cyklus neprovede vůbec. Pokud chceme, aby se cyklus vykonal vždy alespoň jednou, dáme podmínku na konec. x = 0; do{ x++; while(x!=1)

14 14 Základy jazyka C++ Jaké číslo bude uloženo v proměnné x na koncích kódu v předchozích dvou příkladech? Kolikrát cykly proběhnou? For each C++ podporuje mimo jiné i cyklus for each, známý z jazyků Java nebo C#. Tento cyklus umí pracovat jak s jednoduchými poli, tak např. s iterátory a šablonami (bude o nich řeč později). Ukažme se příklad např. na vypsání prvků pole. Princip tohoto cyklu spočívá v tom, že v prvních dvou parametrech specifikujeme od kterého po který prvek se má pole procházet a v posledním parametru uvedeme jméno fukce (viz následující text), které obdrží jako parametr vždy aktuální prvek pole a může s ním něco provést. #include <iostream> using namespace std; void vypis(int prvek){ cout << "Aktualni prvek je: " << prvek << endl; int main() { int pole[5]; // ulozi postupne hodnoty 0,1,2... for(int i=0; i<5; i++){ pole[i] = i; // vypise prvky pole, u identifikace pozice musi byt uveden operator & // o nem bude rec pozdeji, prozatim pouze vemte na vedomi, ze tento cyklus existuje for each(&pole[0], &pole[5], vypis); return 0; Funkce a rekurze Procedury a funkce Funkce je nástroj, který umožňuje vyjmout část kódu z programu a ten podle potřeby opakovaně volat. Typickým příkladem je složitý výpočet, který opakovaně voláme na různých místech programu. V Pascalu a jiných jazycích se můžeme setkat s pojmem procedura. Označuje se tak funkce, která nevrací žádnou hodnotu (jen provede např. výpis na obrazovku nebo zmodifikuje určitou globální proměnnou). V C++ pojem procedura nepoužíváme. Bavíme se vždy pouze o funkcích. Pokud nemá funkce vracet žádnou smysluplnou hodnotu, vrací prázdný typ void (viz následující příklad). void vypiscislo(int cislo){ cout << "Predane cislo je: " << cislo << endl; cout << "Naslednik cisla " << cislo << " je cislo " << cislo++ << endl;

15 Základy jazyka C++ 15 Vracení hodnot funkcí Základním problémem je, jak vrátit hodnotu vypočtenou v těle funkce. Nastávají dvě situace: potřebujeme vrátit jen jednu hodnotu a potřebujeme vrátit více hodnot. V prvním případě využijeme klíčového slova return, které ukončí provádění procedury a vrátí určitou hodnotu. int secti(int cislo1, int cislo2){ return cislo1+cislo2; int main(){ int x = 12; int y = 45; int a = secti(x,y); int b = secti(10,12); cout << b << endl; return 0; Často však potřebuje vrátit více, než jednu hodnotu. Máme 2 možnosti, jak to provést. Jako subjektivně jasnější doporučuji následující: void vymen(int &a, int &b){ int pom = a; a = b; b = pom; int main(void){ int a = 10; int b = 5;... vymen(a, b); // ted je v a petka a v b desitka... Všimněte si znaku &, který je v hlavičce funkce před názvy proměnných. V praxi se proměnné předané do funkce chovají následovně: vytvoří se jejich lokální kopie, se kterou pracujeme po dobu běhu funkce a můžeme je modifikovat. Na konci funkce jsou ale veškeré modifikace zahozeny, protože jsou zrušeny lokální kopie, se kterými jsme pracovali. Znaménko & překladači říká, že nemá vytvářet jen lokální kopie, ale že změny mají zachovat a vrátit zpět do místa, odkud byla funkce zavolána. Pole jako parametr funkce Trochu speciálním případem parametru je v C++ pole. Pole se totiž nepředává jako celek, ale předává se jen ukazatel na začátek pole. Pro korektní práci s polem tedy musíme předat do funkce jak ukazatel na začátek pole, tak jeho velikost. Ukažme si to na příkladu funkce, která vrátí součet prvků v poli.

16 16 Základy jazyka C++ // pole v parametru je ukazatel int sectipole(int scitanepole[], int velikost){ int soucet = 0; for(int i=0; i<velikost; i++){ soucet += scitanepole[i]; return soucet; int main(void){ int pole[10]; for(int i=0; i<10; i++) pole[i] = i; // naplnim pole hodnotami cout << "Soucet: " << sectipole(pole, 10) << endl; return 0; Deklarace a definice funkce Občas je nutné použít (zavolat) určitou funkci ještě před tím, než je napsána. Případně máme několik funkcí, které se volají navzájem a je těžké je poskládat tak, aby byly ve vhodném pořadí. Problém lze řešit tak, že na počátek kódu uvedeme nejdříve deklarace funkcí (jen jejich hlavičky s počty a typy parametrů) a jejich definici (implementaci) napíšeme později. #include <iostream> using namespace std; // deklarace funkci int secti(int, int); double vypocti(int, int); double vypocti(int a, int b){ double mezivysledek = secti(a, b); mezivysledek = mezivysledek/a; return mezivysledek; int secti(int x, int y){ return x+y; Je nutné ale dodat, že v případě, že máme v programu řadu vzájemně provázaných funkcí, je obvykle účelné, sáhnout po objektovém návrhu a roztřídit je do vhodných tříd. Tak totiž tento problém zcela odpadá. Rekurze Rekurze samozřejmě značí volání sama sebe. V C++ je rekurze standardně podporována, proto jakákoliv funkce může volat samu sebe. Jediná funkce, kterou nelze rekurentně volat je hlavní funkce main. Je pochopitelně nutné vhodně nadefinovat zarážku rekurze, jinak bude volání probíhat do nekonečna.

17 Základy jazyka C++ 17 int faktorial(int cislo){ if (cislo>0) return cislo * faktorial(cislo-1); else return 1; init main(){ cout << faktorial(cislo);... Vstupní a výstupní proudy Vstup z terminálu a výstup na něj Práce s terminálem (často označovaným jako standardní vstup/výstup) se v C++ od C značně liší. Fungují samozřejmě veškeré příkazy, které jsou definovány v knihovne stdio.h, jejich využívání se však C++ příliš nedoporučuje. C++ zavádí techniku, která je označována jako proudy. Při práci s terminálem jsou definovány 2 základní proudy: znakový výstup charout cout a znakový vstup char-in cin. Abychom mohli tyto proudy využívat, musíme si načíst knihovnu iostream a protože příkazy na práci s terminálem spadají do jmeného prostoru std (o jmenných prostorech bude řeč dále), je vhodné napsat též deklaraci using namespace std (tedy používej příkazy ze jmeného prostoru std). Do proudu cout můžeme zasílat, co se má na terminálu vypsat a z proudu cin můžeme přebírat, co zadá uživatel na klávesnici. Způsobů zasílání je mnoho, ale nejčastěji bývají využívány operátory >> a <<. Např.: pokud chci vypsat na standatdní výstup řetězec Ahoj světe, využiji výstup cout a operátor <<. #include<iostream> using namespace std; int main(){ cout << "Ahoj" << endl; return 0; Jak vidíte, operátor << nám umožnil, poslat na výstup řetězec Ahoj. Pokud bychom chtěli vypsat např. určitou proměnnou, prostě místo řetězce napíšeme její jméno. Navíc operátorů pro výstup můžeme napsat libovolné množství cout << "Velikost A je " << a << "." << endl. K endl se dostaneme vzápětí, pro tento okamžik konstatujme, že způsobí skok na nový řádek. Na výstup můžeme posílat i speciální znaky jako \n konec řádku, \t tabulátor a jiné. stačí je prostě napsat do uvozovek k textu ("Jmeno \t Prijmeni \t Adresa"). Stejným způsobem jako vypisujeme na terminál, můžeme i načítat hodnoty zadané uživatelem. Načtení jednoho slova nebo čísla od uživatele provedeme pomocí operátoru >>. Všimněte si, že operátor ukazuje na opačnou stranu, než při na čítání. Směr je důležitý a nemůže být zaměněn

18 18 Základy jazyka C++ #include<iostream> using namespace std; int main(){ int a, b; cout << "Zadej A: "; cin >> a; cout << "Zadej B: "; cin >> b; cout << "Zadana cisla jsou: " << a << " a " << b << endl; return 0; Kromě výše uvedeného operátoru pro načítání disponuje C++ možností načítat více slov (např. celou větu). Jedná se o příkaz getline. #include <iostream> using namespace std; int main(void) { char s[100]; cout << "Napis retzec: "; cin.getline(s, 99); // getline neumí pracovat se stringem, musíme použít pole charů cout << "Napsal jsi " << s <<endl; return 0; Příkaz getline může mít dva nebo tři parametry. Prví je vždy název proměnné, kam se budou data ukládat, druhý je maximální počet načtených znaků a třetí, nepovinný, je ukončovací symbol, který ukončí načítání (standardně \n, tedy konec řádku). Načítáme vždy do pole znaků, které ovšem můžeme přeuložit do libovolného stringu (string retezec = s). Manipulátory proudu Manipulátory nám umožňují modifikovat obsah proudu. Pro manip. s parametrem je potřeba použít knihovnu iomanip. S několika manipulátory jsme se již setkali. endl konec řádku a vyprázdni bu er (při práci se souborem vyvolá fyzický zápis dat do souboru). flush vyprázdni bu er. dec, hex, oct vypisuj všechna následující čísla v dané soustavě. setw(x) počet znaků, na které bude zarovnán vypisovaný text (využíváme při zarovnání čísel pod sebe podle řádů). setfill( x ) jakým znakem bude vyplňováno u zarovnání (standardně mezera)....

19 Základy jazyka C++ 19 #include <iostream> #include <iomanip> using namespace std; int main(void) { int c = 1000, b = 9; cout << setw(3) << "b=" << b << endl << "c=" << c << endl; cout << setw(3) << setfill(@) << hex << "c=" << c;... Práce s chybovým výstupem Kromě dvou výše uvedených vstupů a výstupů disponuje C++ ještě chybovým výstupem - cerr. Na první pohled se chová stejně jako cout - tj. vypisuje informace na terminál. Ale pouze na první. Na úrovni operačního systému lze totiž oba proudy od sebe odlišit a s každým lze pracovat individuálně. Například chybový výstup lze přesměrovat do souboru pro pozdější analýzu. Proto je vhodné rozlišovat, kdy vypisujeme normální informaci a kdy chybovou hlášku, a podle toho zvolit příslušný proud. Přesměrování proudů na úrovni operačního systému Následující příkazy spolehlivě fungují pod OS UNIXového typu, ale zpravidla i pod Ms Windows. Přesměruj výpis příkazu do souboru ls>jmenosouboru.txt Přesměruj standardní výstup program 1>jmenoSouboru.txt Přesměruj chybový výstup program 2>jmenoSouboru.txt Zahod chybový výstup program 2>\dev\null Přesměruj chybový výstup na standardní 2>&1 Pravděpodobně Vás napadlo, proč se u posledního příkazu vyskytuje před jedničkou &. Pokud bychom ho tam nedali, výstup by se přesměroval do souboru se jménem 1. Příklad chybového výstupu. #include<iostream> using namespace std; int main(){ int a, b; cout << "Zadej A: "; cin >> a; cout << "Zadej B: "; cin >> b; if (b!= 0) cout << "Podil pri celociselnem deleni: " << a/b << endl; else cerr << "Chyba, b = 0" << endl; return 0;

20 20 Objektově orientované programování 2 Objektově orientované programování Základní pojmy a koncepty OOP Svět je objektově orientovaný Třída, objekt, instance třídy Základní myšlenkou objektově orientovaného programování (OOP) je pohled na program jako na systém objektů. Tento přístup je částo více intuitivní, protože svět přirozeně chápeme jako systém objektů. V objektově orientovaném programování je objekt samostatnou (autonomní) částí, která je vhodně propojena s ostatními objekty. Jednotlivé objekty pak mohou být více či méně přesnými modely okolního světa, přesněji té části světa se kterou daný program má pracovat. Objekt se skládá z vlastností a operací, které s ním lze provádět. Vlastnosti objektu se nazývají atributya slouží k uchovávání dat v objektu (říkáme k uchování stavu objektu). Funkce objektu se nazývají metody a určují vlastní chování objektu. Každý objekt je určen svou třídou. Třída objektu definuje všechny vlastnosti objektu a jejich přípustné hodnoty nebo rozsahy, definuje také funkce objektu, tedy jeho chování a reakce na okolí. Třída je abstrakní vzor (šablona) objektu, který definuje jaké atributy (data) a jaké metody (funkce) má každý z objektů příslušný k této třídě. Třída neobsahuje konkrétní hodnoty vlastností. Osobní automobil je třída objektů všech osobních automobilů. Objekt je konkrétní část modelu, která funkce určené příslušnou třídou a konkrétní hodnoty vlastností. Jinými slovy: objekt je instancí třídy, v atributech definovaných příslušnou třídou má uloženy určité konkrétní hodnoty. Bratrova Škoda Octavia je instancí třídy osobní automobil. Pozor: Škoda Octavia je opět třída všech automobilů Škoda Octavia. Atribut objektu je určitá jeho vlastnost (i skrytá). Atrbibut objektu je definovaný ve třídě objektu, hodnota atributu je definovaná v objektu samotném. Atribut třídy je vlastnost, kterou mají všechny objekty dané třídy. Atribut třídy nemá definovanou žádnou konkrétní hodnotu, ale může mít zadaný rozsah přípustných hodnot. Objem motoru - desetinné číslo je atribut třídy osobní automobil, který pouze definuje že všechna auta mají nějaký objem motoru a že datový typ této hodnoty je desetinné číslo. Jedná se o obecnou vlastnost. Objem motoru - 1.9l je atribut objektu, který definuje že např.: objekt bratrova Škoda Octavia má objem motoru 1.9l. Další vlastnosti třídy osobní automobil mohou být: váha, výkon, barva... Zjednodušeně je možno říci, že objekt vznikne naplněním konkrétních hodnot do vlastností třídy. Každý objekt respektive jeho třídu lze popsat mnoha způsoby: slovy - každé auto má váhu zookrouhlenou na celé kg, určitý objem motoru v litrech (desetinné číslo)... diagramem (UML) zápisem v programovacím jazyku

21 Objektově orientované programování 21 Zápis třídy osobní automobil v jazyce C++: class OsobniAutomobil { int vaha; float objemmotoru;... Zápis téže třídy v jazyce Java: public class OsobniAutomobil { int vaha; double objemmotoru;... Na objekty se často pohlíží jako na modely určitých realných objektů. Pro modelování obecně platí, že vytvořený model by měl být co nejjednodušší a nejpřesnější. Před vytvářením modelu je tedy nutné znát jeho aplikaci, ze které pak vyplynou nezbytné vlastnosti modelu, univerzální model nelze vytvořit. Proto je i v případě objektového návrhu vhodné vytvářet objekty pouze s nezbytnými vlastnostmi. Dobře objektově navržené programy jsou snadno rozšiřitelné, přidávání dalšich atributů v průběhu vývoje programu není problém. Naopak vytváření objektů se zbytečnými atributy může vést ke složitým a nepřehledným definicím. Protože třída je pouze vzorem objektu a nikoliv konkrétním objektem, platí nasledující vztahy: Každý objekt musí patřit k určité třídě. Nelze vytvořit objekt, aniž by nebylo definováno jak má vypadat. Ze třídy může být vytvořen libovolný počet objektů (včetně 0). Podobně lze například podle výkresu vyrobit libovolný počet součástek. Místo pojmu objekt bývá často používán pojem instance třídy. Změny stavů objektů Objekt by měl být samostatnou funkční jednotkou programu, proto zpravidla také obsahuje atributy (vlastnosti), které definují jeho aktuální stav. Většinou nesmí být stavové atributy měněny libovolně a proto současně objekt obsahuje i metody (funkce a procedury) pro jejich změnu. Změny stavu dosáhneme tedy zavoláním příslušné metody objektu 6. Proces volání metod objektu se označuje jako zasílaní zpráv. Zpráva je interní programová struktura, která obsahuje jméno volané metody a její parametry. Po přijetí zprávy objekt vyvolá příslušnou metodu, výsledek uloží do struktury zprávy, která je pak doručena zpět odesílateli. Kličovou vlastností je nezávislost objektu na odesílateli zprávy (místě vyvolání metody objektu). Deklarace třídy OsobniAutomobil v jazyce C++, která obsahuje atributy i metody pro jejich nastavení a přečtení: 6 Při dodržování dusledné terminologie není možné používat spojení zavolání metody x, protože metody spouští jedině objekt sám jako reakci na událost. V Praxi však tímto spojením myslíme zaslání zpávy objektu, která při zpracování spustí metodu x

22 22 Objektově orientované programování class osobniautomobil { //atributy string barva; string spz; //deklarace metod - co bude mit trida za metody void nastavbarvu(string novabarva); void nastavspz(string novaspz); void vypisbarvu(); void vypisspz(); ; // implementace metod, popisujeme jejich chovani // metoda pro nastaveni barvy void osobniautomobil::nastavbarvu(string novabarva){ barva = novabarva; // metoda pro nastaveni SPZ void osobniautomobil::nastavspz(string novaspz){ spz = novaspz; // metoda pro vypsani barvy void osobniautomobil::vypisbarvu(){ cout << barva; // metoda pro vypsani SPZ void osobniautomobil::vypisspz(){ cout << spz; Část deklarace třídy OsobniAutomobil v jazyce C++ a ukázka vytvoření objektu:

23 Objektově orientované programování 23 class OsobniAutomobil { //atributy int rokvyroby; string spz; //metody void nastavrok(int rok); void nastavspz(string novaspz); void vypisspz(); void vypisrok(); ; void osobniautomobil::nastavrok(int rok){ rokvyroby = rok; void osobniautomobil::vypisspz(){ cout << spz;... //pouziti objektu // deklarace promenne, typem promenne je trida objektu osobniautomobil *mojeskodovka; mojeskodovka = new osobniautomobil; //vytvoreni objektu //nastaveni atributu mojeskodovka->nastavrok(1981); mojeskodovka->nastavspz("vya-88-00"); //vypis atributu mojeskodovka->vypisspz(); mojeskodovka->vypisrok(); //zruseni objektu delete mojeskodovka; Atributy lze měnit buď přímo (instance->atribut = hodnota) nebo pomocí příslušných metod (instance->nastavatribut(hodnota)). Skrývání implementace Pro úplnou ochranu stavových atributů objektu je potřeba zabránit jejich modfikaci jinak než přes příslušné metody. Atributy a metody třídy jsou vždy přístupné z metod definovaných v této třídě, z jiných metod a funkcí však již přístupné být nemusí. K nastavení přístupu k atributům a metodám slouží modifkátory viditelnosti. Atributy označené public (veřejné) může kdokoli číst a modifikovat, metody označené public mohou být volány i z jiných metod a funkcí. Atributy označené private (soukromé) mohou číst a modifikovat pouze metody dané třídy, metody označené private mohou být volány pouze ze metod dané třídy. Pokud objekt obsahuje soukromé atributy a metody, tak pracuje jako černá skříňka, o které při pohledu zvenčí nelze zjistit jak pracuje, lze však vyvolávat některé její metody. Skutečná implementace funkcí objektu je ale zapouzdřena uvnitř objektu a je skryta.

24 24 Objektově orientované programování Modifikátory viditelnosti: private (přístupné pouze z metod této třídy) protected (přistupné z metod této třídy a jejich potomků) public (přístupné ze všech tříd, i hlavní funkce programu) Modifikátory viditelnosti mění viditelnost pro všechny následující atributy a metody až do dalšího modifikátoru viditelnosti nebo do konce definice třídy. Výchozí modifikátor viditelnosti v jazyce C++ je private (tj. pokud není řečeno jinak). class Konto { private: //nasledujici atributy a metody jsou soukrome int stavkonta; //nasledujici atributy a metody jsou verejne void nastavkonto(int novasuma); void pridejcastku(int prirustek); int vratstavkonta(); void prictiuroky(); private: //nasledujici atributy a metody jsou soukrome void spoctiuroky(); ; Skrývání implementace je velmi důležitý rys objektového návrhu. Je velmi důležité jej důsledně dodržovat. Zdaleka ne všechny objektové jazyky podporují tento koncept skrývání implementace. Například v jazyku Python se pro skrytí atributu nebo metody používá zdobení před název atributu nebo metody jsou napsány dvě podtžítka (např. skrytyatribut). Takový atribut je intepretem pouze přejmenován, aby nemohlo dojít k jeho náhodnému zavolání. Lze jej však přesto zavolat pomocí nového jména. Přesný ekvivalent private tedy v Pythonu nenajdeme. Shrnutí Program je systém objektů a vazeb mezi nimi. Třídy definují typy objektů. Objekty jsou samostatné funkční celky (černé skříňky). Stav objektu je popsán jeho atributy Funkce objektu je definována jeho metodami Skrývání (části) implementace objektu umožňují modifikátory viditelnosti Vazby mezi objekty zajišťuje systém zasílání zpráv Objekt je tedy programová struktura, která má následující vlastnosti: má vnitřní pamět (ta může obsahovat i další objekty), obsahuje metody, je schopna přijímat a zpracovát zprávy z vnějšku tak, že vyvolá příslušnou metodu.

25 Objektově orientované programování 25 Řešené příklady k procvičení problematiky návrhu tříd 1. Pojem třída, objekt, atribut Popis: Svět okolo nás můžeme modelovat pomocí objektů. Poznámka: Pokud jste v programování začátečníci, nezabývejte se takovou hloupostí, jako jsou výčtové typy, prostě na popis např. materiálu použijte textovou prom. typu string. Výčtový typ nám pouze říká, že materiál může být pouze jeden z n možných, což v tomto okamžiku není zásadní. a) Teoretický rozbor Popište slovy reklamní tužku z obchodního řetězce Ikea. Vytvořte model této tužky a pojmenujte jednotlivé atributy (vlastnosti). Zapište vlastnosti a jejich hodnoty a obecné datové typy ( řetězec, číslo (celé, reálné), datum, výčet, struktura, binární hodnota) do tabulky. Tip: Soustřeďte se na zřejmé vlastnosti, nehledejte v tom vědu. K zamyšlení: Má tyto vlastnosti každá tužka? Krátká dřevěná tužka s černou měkkou tuhou a modrým nápisem ikea. název atributu hodnota atributu datový typ délka tužky 8 cm číslo materiál dřevo výčet barva tuhy černá výčet tvrdost tuhy měkká výčet/číslo barva nápisu modrá výčet text nápisu ikea řetězec Závěr: Tyto vlastnosti má každá tužka, tyto atributy tedy můžeme definovat obecně pro různé tužky. Z hlediska modelu můžeme tvrdit, že i nápis má každá tužka, pouze u některých tužek neobsahuje nápis žádný text a není tedy vidět. Současně však je možné definovat velké množství dalších atributů podle konkrétního využití modelu. Obecnou definicí atributů nazýváme třídou a pojmenujeme ji Tuzka. Třída Tuzka je nehmotná šablona všech tužek a říká nám, že cokoliv co je tužkou má určité atributy (délka, materiál, barva tuhy) a že tyto atributy mohou nabývat určitých hodnot (datových typů).tužka z Ikei (tuzkaikea) je pak konkrétní objekt, je to instance třídy, ve které jsou atributům přiřazeny konkrétní hodnoty. b) Programové řešení Napište program, který definujte třídu Tuzka, definujte objekt této třídy tuzkaikea, naplňte všechny atributy objektu a pak je vypište na obrazovku. Definujte také potřebné výčtové typy. #include <iostream> //standardni hlavicka, umozni vypis na obrazovku using namespace std; //standardni hlavicka //deklarace povinnych vyctovych typu enum Barvy {CERVENA, MODRA, ZELENA, BILA, CERNA; enum Materialy {DREVO, KOV; //deklarace tridy class Tuzka { //nasledujici polozky v teto tride jsou verejne //atributy

26 26 Objektově orientované programování int delka; Materialy material; Barvy barvatuhy; int tvrdosttuhy; Barvy barvanapisu; string napis; ; //===== hlavni funkce programu int main() { Tuzka *tuzkaikea; //promenna pro ulozeni objektu /* nelze pristupovat k objektu, ktery neni vytvoreny, nasledujici radek by tedy zpusobil pad programu cout << "\ndelka: " << tuzkaikea->delka; */ tuzkaikea = new Tuzka; //vytvoreni objektu - dojde ke spusteni konstruktoru tridy Tuzka //naplneni atributu objektu tuzkaikea->delka = 8; tuzkaikea->material = DREVO; tuzkaikea->barvatuhy = CERNA; tuzkaikea->barvanapisu = MODRA; tuzkaikea->tvrdosttuhy = 3; tuzkaikea->napis = "Ikea"; //vypsani atributu objektu cout << "Delka: " << tuzkaikea->delka << " cm" << endl; cout << "Material: " << tuzkaikea->material << endl; cout << "Barva tuhy: " << tuzkaikea->barvatuhy << endl; cout << "Tvrdost tuhy: " << tuzkaikea->tvrdosttuhy << endl; cout << "Barva napisu: " << tuzkaikea->barvanapisu << endl; cout << "Napis: " << tuzkaikea->napis << endl; delete tuzkaikea; //zruseni objektu - spusteni destruktoru tridy Tuzka /* nelze pristupovat k objektu, ktery je zruseny, nasledujici radek by vypsal nesmyslny udaj cout << "\ndelka: " << tuzkaikea->delka; */ return 0; 2. Pojmy třída, objekt, atribut, metoda, modifikátory viditelnosti Popis: Objekty umožňují kromě ukládání dat, také uchovávat části programu, díky tomu mohou objekty pracovat jako samostatné moduly programu. a) Teoretický rozbor a programová realizace první části Popište bílý list papíru A4 na kterém je černým fixem napsán text Něco duchaplného. Definujte třídu tohoto objektu, pojmenujte jednotlivé atributy a zapište jejich datové typy. Definujte alespoň 10 atributů. Napište program, který definujte třídu ListPapiru definujte objekt této třídy, naplňte atributy objektu a pak je vypište na obrazovku. Definujte také potřebné výčtové typy. Tip: Zamyslete se nad závislostmi jednotlivých atributů. název atributu hodnota atributu datový typ formát A4 výčet text Něco duchaplného řetězec barva papíru bílá výčet (pokračování tabulky na další straně)

27 Objektově orientované programování 27 barva textu černá výčet psací potřeba fix výčet šířka 210 mm číslo výška 297 mm číslo hmotnost 80 mg číslo tloušťka 0,05 mm číslo orientace textu vodorovně výčet class ListPapiru { //nasledujici polozky v teto tride jsou verejne //atributy Format format; string text; Barva barvapapiru; Barva barvatextu; Pisatko pisatko; int sirka; int vyska; float tloustka; int hmotnost; Orientace orientace; ; Závěr: Některé z atributů uvedených v tabulce jsou na sobě přímo závislé, například šířka, výška a formát. Bylo by možné atribut formát vypustit, protože je plně určen výškou a šířkou. Prakticky je však atribut formát výhodné ponechat a zajistit aby nedošlo k nesouladu mezi jeho hodnotou a hodnotou ostatních atributů. Například při tisku z textového editoru je možné zvolit buď velikost papíru nebo formát papíru, druhá hodnota je pak automaticky dopočítána. Další možnou závislostí je například barva papíru a barva textu, tyto dvě barvy by neměly být stejné. b) Programová realizace druhé části Třídu ListPapiru rozšiřte o přístupové metody k atributům formát, výška, šířka. Metody zajistí správné nastavení formátu papíru při změně šířky nebo výšky a naopak správné nastavení výšky a šířky při změně formátu. Metody pro čtení (zjištění hodnoty) atributů se označují getatribut, metody pro uložení (nastavení hodnoty) se označují setatribut. Současně vhodně definujte modifikátory viditelnosti private (soukromý) a public (veřejný) k zamezení/povolení přístupu k atributům a metodám třídy. enum Format {A0, A1, A2, A3, A4, VLASTNI; class ListPapiru { private: /* nasledujici polozky jsou pristupne jen z metod deklarovanych v teto tride, nebudou tedy pristupne z jinych trid ani z funkce main() */ /* atributy format, vyska a sirka jsou skryte, pristup k nim je mozny pouze pres verejne metody getformat, setformat, getvyska, setvyska, getsirka, setsirka */ int sirka; int vyska; //nasledujici polozky v teto tride jsou verejne //atributy string text; Format format;

28 28 Objektově orientované programování tbarva barvapapiru; tbarva barvatextu; tpisatko pisatko; float tloustka; int hmotnost; torientace orientace; void setformat(format value); void setvyska(int value); void setsirka(int value); Format getformat(); int getvyska(); int getsirka(); ; 7 Závěr: Příklad ukazuje využití zapouzdření. Atributy, které nelze libovolně měnit je vhodné skrýt (pomocí modfikátorů viditelnosti) a přístup k nim umožnit pouze přes metody. 3. Atributy pouze pro čtení Definujte třídu Sklenice, která popisuje válcovou sklenici bez potisku z hlediska uživatele. Definujte konstruktor a desturktor třídy, definujte vzájemě závislé (a přesto užitečné atributy) a metody pro jejich čtení a zápis. Zapište jednotlivé atributy do tabulky. název atributu hodnota atributu datový typ výška 10 cm číslo průměr 8 cm číslo objem 500 cm číslo materiál čiré sklo výčet class Sklenice { private: /*nasledujci polozky jsou pristupne pouze ze tridy Sklenice */ int vyska; int prumer; float objem; /* definice atributu objem neni nezbytna */ //nasledujici polozky v teto tride jsou verejne //atributy tmaterial material; //metody int getvyska(); int getprumer(); void setvyska(int value); void setprumer(int value); float getobjem(); /* atribut objem nelze nastavit, neni verejne pristupny a nema metodu pro nastaveni */ ; 8 Závěr: Mohlo by se zdát, že se jedná o stejný případ jako nastavení formátu u listu papíru. V tomto případě je sice objem jednoznačně určen výškou a průměrem sklenice (stejně jako formát je jednoznačně určen výškou a šířkou papíru), rozměry sklenice však nejsou jednoznačně určené objemem. Samotné nastavení objemu tedy ztrácí smysl a objem v tomto 7 Úplný zdrojový kód a druhé řešení programu jsou uvedeny v příkladu Papír. 8 Úplný zdrojový kód a druhé řešení programu jsou uvedeny v příkladu Sklenice.

29 Objektově orientované programování 29 případě definujeme jako atribut, který je pouze pro čtení. 9 Protože je atribut objem plně určen atributy výška a šířka, není nutné ho vůbec definovat, může to však být výhodné v případě, že zjištění hodnoty je výpočetně nebo časově náročná operace. 9 Je možné definovat i atributy pouze pro zápis. Jedná se však o velice specifické případy využití.

30 Objektově orientované programování 1 Test Způsob vyhodnocení: Při vyhodnocení budou za nesprávné odpovědi strhnuty body. 1. Zaškrtněte mezi možnostmi všechny položky, které v následujícím kódu 1 označují třídu : class Motorka { int seriovecislo; string vyrobce; ; int main(){ Motorka* jawa; jawa = new Motorka; delete(jawa); Vyberte libovolný počet možných odpovědí. Správná nemusí být žádná, ale také mohou být správné všechny. a) seriovecislo b) Motorka c) jawa d) vyrobce 2. Zaškrtněte mezi možnostmi všechny položky, které v následujícím kódu 1 označují objekty : class Motorka { int seriovecislo; string vyrobce; ; int main(){ Motorka* jawa; jawa = new Motorka; delete(jawa); Vyberte libovolný počet možných odpovědí. Správná nemusí být žádná, ale také mohou být správné všechny. a) jawa b) vyrobce c) Motorka d) seriovecislo 3. Zaškrtněte mezi možnostmi všechny položky, které v následujícím kódu 1 označují atributy : class Motorka { int seriovecislo; string vyrobce; ; int main(){ Motorka* jawa; jawa = new Motorka; delete(jawa); Vyberte libovolný počet možných odpovědí. Správná nemusí být žádná, ale také mohou být správné všechny. a) seriovecislo b) vyrobce c) Motorka

31 2 Objektově orientované programování d) jawa 4. Rád bych do sériového čísla určité motorky (např. níže uvedené jawy) nastavil určitou hodnotu. Vyberte, jak to mám udělat (tj. jaký řádek se má nacházet v kódu místo pomlček). class Motorka { int seriovecislo; string vyrobce; ; int main(){ Motorka* jawa; jawa = new Motorka; --- delete(jawa); 1 Vyberte jen jednu z následujících možných odpovědí. a) jawa->seriovecislo = ; b) seriovecislo = ; c) Motorka->serioveCislo = ; 5. Zaškrtněte mezi možnostmi všechny položky, které v následujícím kódu 1 označují instanci třídy : class Motorka { int seriovecislo; string vyrobce; ; int main(){ Motorka* jawa; jawa = new Motorka; delete(jawa); Vyberte libovolný počet možných odpovědí. Správná nemusí být žádná, ale také mohou být správné všechny. a) jawa b) Motorka c) vyrobce d) seriovecislo Konstruktor, destruktor Život objektu Život objektu začíná jeho vytvořením a končí jeho zrušením. Vytvoření objektu reprezentuje rezervování vhodného paměťového prostoru podle definice třídy a případně inicializaci atributů objektu. Zrušení objektu pak reprezentuje uvolnění rezervované paměti a provedení dalších činností (vypsání hlášení, uzavření souborů, atp.). K těmto speciálním okamžikům v životě objektu se vztahují speciální metody konstruktor a destruktor. Konkrétní podoba těchto metod a jejich použití se může lišit v různých objektově orientovaných jazycích. Konstruktor Konstruktor je metoda volaná při vytváření instance třídy, typicky se využívá pro inicializaci objektu. Název konstruktoru je stejný jako název třídy, konstruktor nemá návratový typ a nelze ho volat přímo jako jiné metody. Deklarace konstruktoru není povinná. Při vytváření instance třídy, která nemá definovaný žádný konstruktor se použije implictní konstruktor (bez parametrů). Konstruktor je automaticky vyvolán při vytvoření instance pomocí klíčového slova new (v C++, Javě).

32 Objektově orientované programování 3 Deklarace a použití konstruktoru v C++: class Krida { // konstruktor Krida(){ cout << "Ahoj, ja jsem pan konstruktor" << endl;... Krida *mojekrida; mojekrida = new Krida; //vytvoreni objektu - volani konstruktoru Je také možné definovat pro jednu třídu více konstruktorů, protože jméno konstruktoru je stejné jako jméno třídy, musí se jednotlivé konstruktory lišit parametry. Tato technika se nazývá přetěžování a je podrobněji popsána v kapitole Pokročilé techniky OOP. Parametrický konstruktor Konstruktor je možné definovat také s parametry, to je výhodné pro snadnější inicializaci objektů (není nutné nastavovat každý atribut zvlášť). Parametrický kontruktor navíc de facto vynutí zadání parametrů a vždy provede inicializaci. Je tedy vhodný pro vynucení zadání hodnot, na které se nesmí zapomenout. Parametrický konstruktor je také možné využít v souvislosti se zapouzdřením. Pokud má objekt atributy, které nelze v průběhu života objektu měnit, pak je výhodné je vytvořit k nim metody pouze pro čtení a jejich počáteční nastavení zajistit prostřednictvím konstruktoru s parametry. class PujceneAuto{ float natankovano; int ujetychkm; //implementace konstruktoru pro inicializaci atributu PujceneAuto(float koliknatankuji){ natankovano = koliknatankuji; ujetychkm = 0;... PujceneAuto *fiesta; fiesta = new PujceneAuto(35.7); //volani konstruktoru s parametry Konstruktor může být bezparametrický nebo s parametry (říkáme parametrický). Jedna třída může mít i více konstruktorů lišících se parametry. Destruktor Destruktor je metoda, která se automaticky spouští při rušení objektu. Název destruktoru začíná znakem vlnovky. Jeho název je stejný jako název třídy. Stejně jako konstruktor nemá destruktor návratový typ a nelze ho přímo volat. Destruktor navíc nikdy nemá parametry! Destruktor se nejčastěji využívá pro uvolnění paměti objektu v případě, že jsou v objektu definované atributy, které implicitní konstruktor neuvolní správně (ukazatele, složené typy, seznamy,...).

33 4 Objektově orientované programování Deklarace destruktoru v C++: class Krida() { Krida(){ //bezparametricky konstruktor cout << "Prave zaciname" << endl; ~Krida(){ // destruktor cout << "Ahoj, koncim" << endl;... Krida *mojekrida; mojekrida = new Krida; //vytvoreni objektu - volani konstruktoru delete mojekrida; //zruseni objektu - volani destruktoru Destruktor je vždy bezparametrický a může být pouze jeden. Jaký význam mají konstruktor a destruktor? Řešené příklady k procvičení problematiky 1. Parametrický konstruktor, destruktor a) Teoretický rozbor Definujte třídu CD, která popisuje objekt kompaktní disk. Definujte alespoň šest atributů včetně typů, viditelností a přístupových metod. Objekt uvažujte z hlediska spotřebitele. Definujte parametrický konstruktor, jehož parametry jsou všechny hodnoty, které nelze u již vytvořeného objektu měnit. název atributu hodnota atributu typ atributu průměr 100 mm číslo kapacita 703 MB číslo povrch hladký výčet barva stříbrná výčet popis Moje CD řetězec barva popisu černá výčet výrobce Verbatim řetězec Závěr: Některé atributy objektu jsou z principu nastavitelné pouze jednou a to právě při vytváření objektu. Současně je však potřeba neustále uvažovat o aplikaci modelu. V případě kompaktního disku se během jeho výroby se některé atributy mění (velikost, barva). Z hlediska spotřebitele však není vůbec možné změnit průměr nebo materiál CD bez jeho

34 Objektově orientované programování 5 zničení. Nelze tedy zaměňovat skutečný vznik objektu a vznik modelu, vytvoření instance třídy CD (z hlediska spotřebitele) odpovídá zakoupení kompaktního disku, nikoliv jeho vyrobení. Proto je možné a vhodné nastavit parametry, které jsou z hlediska uživatele neměnné pouze jednou, tedy při vytváření objektu, ideální místo pro toto nastavení je v konstruktoru objektu. b) Programové řešení části parametrický konstruktor Napiše program v C++, který definuj třídu CD s destruktorem a s parametrckým konstruktorem, jehož parametry jsou všechny hodnoty, které nelze u již vytvořeného objektu měnit. Vytvořte objekt této třídy. Tip: Nezapomeňte, že třída je pouze přibližným modelem reality. enum tpovrch {HLADKY, DRSNY; enum tbarva {BILA, STRIBRNA, CERNA, MODRA; class CD { // deklrace tridy private: // nasledujci polozky jsou pristupne pouze z tridy CD int prumer; int kapacita; tpovrch povrch; string vyrobce; tbarva barva; //nasledujici polozky v teto tride jsou verejne tbarva barvapopisu; string popis; //metody CD(int zadprumer, int zadkapacita, tpovrch zadpovrch, string zadvyrobce, tbarva zadbarva); //konstruktor ~CD(); //destruktor int getprumer(); //metody pro cteni atributu int getkapacita(); tpovrch getpovrch(); string getvyrobce(); tbarva getbarva(); ; //konstruktor tridy CD::CD(int zadprumer, int zadkapacita, tpovrch zadpovrch, string zadvyrobce, tbarva zadbarva) { cout << "Byl vytvoren objekt tridy CD.\n"; prumer = zadprumer; povrch = zadpovrch; kapacita = zadkapacita; vyrobce = zadvyrobce; barva = zadbarva; //destruktor tridy CD::~CD() { cout << "\nbyl zrusen objekt tridy CD."; //zjisteni hodnoty prumeru int CD::getPrumer() { return prumer; //zjisteni kapacity int CD::getKapacita() { return kapacita;

35 6 Objektově orientované programování //zjisteni typu povrchu tpovrch CD::getPovrch() { return povrch; //zjisteni vyrobce string CD::getVyrobce() { return vyrobce; //zjisteni barvy tbarva CD::getBarva() { return barva; int main(int argc, char *argv[]) { CD *prazdnecd; // promenna // vytvoreni objektu prazdnecd = new CD(100, 702, HLADKY, "Verbatim", STRIBRNA); //naplneni objektu prazdnecd->barvapopisu = CERNA; prazdnecd->popis = ""; //vypsani objektu cout << "\nprumer: " << prazdnecd->getprumer(); cout << "\nkapacita: " << prazdnecd->getkapacita(); cout << "\npovrch: " << prazdnecd->getpovrch(); cout << "\nvyrobce: " << prazdnecd->getvyrobce(); cout << "\nbarva: " << prazdnecd->getbarva(); cout << "\nbarva popisu: " << prazdnecd->barvapopisu; cout << "\npopis: " << prazdnecd->popis; delete prazdnecd; //zruseni objektu Závěr: Parametry konstruktoru je nutné odlišit od názvů atributů uvnitř třídy, jednou možností je prefix u názvu parametrů, například a (argument). Jinou možností je přistupovat k atributům třídy v konstrukoru pomocí speciální proměnné this, její použití je popsáno v kapitole Pokročilé techniky OOP. 2. Parametrický konstruktor, destruktor Příklad nám ukazuje medvěda, který se vydal na lov, aby si nastřádal kalorie na zimní spánek. Potkava různé chody, které konzumuje a ty mu přidávají/ubírají kalorie a život. #include <iostream> using namespace std; class Medved{ private: // dali jsme je private, protoze je budeme menit pouze pomoci metody snez // jinak nemaji jit modifikovat int zdravi; int kalorie; // pokud nerekneme jinak, bude mit me2d na pocatku 50 kalorii Medved(){ zdravi = 100; kalorie = 50; cout << "Mame noveho me2da s 50ti kaloriemi" << endl;

36 Objektově orientované programování 7 // ale muze urcit jiny pocet Medved(int pocatecnikalorie){ zdravi = 100; kalorie = pocatecnikalorie; cout << "Mame noveho me2da s " << kalorie << "ti kaloriemi" << endl; void snez(int zadanekalorie, int zadanezdravi){ zdravi = zdravi + zadanezdravi; kalorie = kalorie + zadanekalorie; // mohou si udelat sami doma void vypisinfoomedvedovi(){ cout << "Nas me2d ma " << kalorie << " kalorii a "; cout << zdravi << "% zdravi." << endl; ~Medved(){ cout << "Nas me2d sel spat s " << kalorie << "ti kaloriemi v brise" << endl; ; class Jidlo{ private: // tyto hodnoty jsme dali private, protoze maji byt pouze ke cteni // pri vytvoreni objektu se zadaji a dale uz se nesmi menit int kalorie; int zdravi; Jidlo(int zadanekalorie, int zadanezdravi){ zdravi = zadanezdravi; kalorie = zadanekalorie; int vratkalorie(){ return kalorie; int vratzdravi(){ return zdravi; ~Jidlo(){ cout << "a je po jidle..." << endl; ; int main(void){ Medved* brumla; brumla = new Medved(100); // turista je kurak, proto pridava kalorie, ale ubira zdravi // pripomenout, ze deklarace a inicializace objetu se da spojit Jidlo* turista = new Jidlo(5000, -30); brumla->snez(turista->vratkalorie(),turista->vratzdravi()); delete(turista); // turista snezen brumla->vypisinfoomedvedovi();

37 8 Objektově orientované programování // myska by lehka, ale pomerne zdrava Jidlo* mys = new Jidlo(60, 10); brumla->snez(mys->vratkalorie(),mys->vratzdravi()); delete(mys); // mys uz byla snezena // brumla->vypisinfoomedvedovi(); delete(brumla); // konec me2da return 0;

38 Objektově orientované programování 1 Test Způsob vyhodnocení: Při vyhodnocení budou za nesprávné odpovědi strhnuty body. 1. Máme následující třídu v jazyku C++. Doplňte obsah metody vypisobsahuctu() tak, aby metoda vypsala na obrazovku obsah atributu stavuctu. class Ucet{ private: string IBAN; int stavuctu; void uloznovystavuctu(int castka); void uloziban(string IBAN); void vypisiban(); void vypisstavuctu(); ; 1 Vyberte jen jednu z následujících možných odpovědí. a) cout << stavuctu; b) return stavuctu; c) return vypisstavuctu() d) cout << vypisstavuctu() << endl; 2. Co se vypíše na obrazovku? #include <iostream> using namespace std; class Reditel{ private: int plat; string jmeno; string oddeleni; 1 int vratplat(){ return plat; Reditel(){ plat = 10000; jmeno = "Jan Novak"; ~Reditel(){ cout << "ja se vratim" << endl; ; int main(){ Reditel* novak; novak = new Reditel; novak->oddeleni = "graficke"; novak->jmeno = "Petr Novak"; cout << novak->jmeno << endl; cout << novak->vratplat() << endl; cout << novak->oddeleni << endl; delete(novak); return 0; Vyberte jen jednu z následujících možných odpovědí. a) Jan Novak graficke

39 2 Objektově orientované programování b) Petr Novak graficke ja se vratim c) nic (program se nepřeloží) nebo něco jiného d) Petr Novak graficke e) Jan Novak graficke ja se vratim 3. Co se vypíše na obrazovku? #include <iostream> using namespace std; class Reditel{ private: int plat; string jmeno; string oddeleni; int vratplat(){ return plat; string vratjmeno(){ return jmeno; string vratoddeleni(){ return oddeleni; Reditel(){ plat = 10000; jmeno = "Jan Novak"; oddeleni = "graficke"; ~Reditel(){ cout << "ja se vratim" << endl; ; int main(){ Reditel* novak; novak = new Reditel; cout << novak->jmeno << endl; cout << novak->plat << endl; cout << novak->oddeleni << endl; delete(novak); return 0; 1 Vyberte jen jednu z následujících možných odpovědí. a) nic (program se ani nepřeloží) nebo něco jiného b) Jan Novak graficke ja se vratim c) Jan Novak graficke 4. 1 Pokud přistupujeme k atributu hotovost z následujícího kódu z hlavní funkce programu (main) nebo metod jiných tříd, platí (nezapomeňte, že s atributy lze pracovat přímo i prostřednictvím metod):

40 Vztahy 3 class Bankomat{ private: int hotovost; int cislobankomatu; int vratcislo(){ return cislobankomatu; void vypiscislo(){ cout << "Cislo bankomatu: " << cislobankomatu << endl; void ubercastku(int kolik){ hotovost = hotovost - kolik; void zadejcelkovoucastku(int suma){ hotovost = suma; ; int main(){... Vyberte jen jednu z následujících možných odpovědí. a) do atributu lze pouze zapisovat b) atribut lze číst i do něj zapisovat c) atribut nelze číst ani do něj zapisovat d) atribut lze pouze číst 5. Mám následující kód třídy v jazyku C++, jakým způsobem mohu vytvořit 1 instance této třídy? class Auto(){ private: string SPZ; int rokvyroby; Auto(){ SPZ = ""; rokvyroby = "2000"; Auto(string novaspz, int novyrokvyroby){ SPZ = novaspz; rokvyroby = novyrokvyroby; // zde se budou nachazet metody pro cteni a zapis do atributu... ; Vyberte libovolný počet možných odpovědí. Správná nemusí být žádná, ale také mohou být správné všechny. a) Auto* skoda; skoda = new Auto; b) Auto* skoda; skoda = new Auto(1998, "VYA 88-00"); c) Auto* skoda; skoda = new Auto(" ", 2000); d) Auto* skoda; skoda = new Auto();

41 4 Objektově orientované programování 2.1 Vztahy Asociace V předchozích kapitolách byly všechny objekty modelovány jako jednoduché, tedy vlastnosti objektů nebyly nijak strukturované a objekty vzájemně nebyly nijak propojeny. Tento přístup je prakticky nepoužitelný, protože bez vazeb mezi objekty nelze vytvořit objektový model. Vazby mezi objekty současně také ovlivňují vlastní definice objektů. Asociace Asociace je nejvolnějším typem vazby mezi objekty, umožňuje objektům vzájemnou komunikaci. Asociované objekty si mohou vzájemně zasílat zprávy (tj. volat svoje metody). Základní charkteristikou 10 všech vztahů je násobnost (kardinalita). Násobnost vazby je definovaná 11 násobností každého konce vazby a je možné ji vyjádřit pomocí následujících symbolů: *, N, M - vazby se může učástnit libovolný počet instancí 1 - vazby se může učástnit pouze jedna instance 0 - vazby se neučastní žádná instance Tyto základní symboly je pak možné kombinovat vytvořením intervalu: může být navázána jedna nebo žádná instance 1..* - může být navázáno N instancí, minimálně však jedna... Varianty násobnosti vazeb je možné obecněji rozdělit do tří kategorií vztahů.vztah 1:1 označuje vazby, ve kterých je každá instance jedné třídy je spojena s nejvýše jednou instancí jiné třídy. Tento vztah je tedy jednoznačný v obou směrech.obecnějším vztahem je vztah 1:N (M:1), ve kterém je každá instance první třídy spojená s libovolným počtem instancí druhé třídy. Současně však platí, že každá instance druhé třídy je spojená s jednou nebo žádnou instancí první třídy. Vztah 1:N je tedy jednoznačný pouze v jednom směru (od druhé třídy k první). Nejobecnějším vztah M:N, který je nejednoznačný v obou směrech, protože každá instance jedné i druhé třídy může být spojena s libovolným počtem jiných instancí. 10 Jedná se o stejnou charakteristiku, která se používá při návrhu relačních databaází. 11 Uzly v UML diagramech repretezentují třídy objektového modelu, současně však reprezentují tak všechny možné instance této třídy. Nakreslením vazby mezi třídami tedy vlastně zobrazujeme vazbu mezi jednotlivými instancemi tříd.

42 Vztahy 5 Zobrazení vazby mezi obyvatelem a obcí. Vazbu na obrázku je možné popsat následujícími větami: Obyvatel žije v jedné nebo v žádné obci. V obci žije libovolný počet obyvatelů, minimálně však jeden. Obyvatel nemůže žít ve více obcích současně. Vztah mezi obyvatelem a obcí je N:1 Při definici vazby je nutné (stejně jako při definici atributů) uvažovat konkrétní použití tříd i celého modelu. Mezi obyvatelem a obcí je možné definovat také vztah N:M popsaný následujícími body: Obyvatel žije v jedné nebo v žádné obci. V obci žije libovolný počet obyvatelů, minimálně však jeden. Obyvatel mohl žít ve více obcích Jedná se tedy o znázornění vztahu obyvatele k obci v průběhu času. Obyvatel mohl žít ve více obcích, protože se přestěhoval, v jednom časovém okamžiku však žije pouze v jedné obci (není na diagramu zachyceno). V diagramu tříd vztah Asociace definuje obecnou vazbu mezi objekty, nepoužívá se k vyjádření konkrétních činností nebo akcí. Tedy asociace v předchozím příkladu žije v v sobě zahrnuje všechny možné činnosti, které by obyvatel města mohl ve městě vykonávat (pracuje, bydlí, nakupuje). Asociace mezi třídami tedy nejsou paralelní, tedy mezi dvěma třídami je vždy maximálně jedna asociace. Také se nedefinují vazby inverzní (například ve městě žije ) asociace. Důvodem je fakt, že obecně je možno mezi třídami definovat (téměř) nekonečně mnoho různých vztahů, proto by měl popis vztahu asociace být natolik obecný, aby zahrnoval všechny modelované vazby.

43 6 Objektově orientované programování Vztah mezi osobou a židlí (například pro sledování obsazenosti učebny nebo kina). Asociaci je možné popsat následujícími větami: jedna osoba může sedět na jedné židli osoba nemusí sedět na žádné židli na židli nemusí nikdo sedět na židli může sedět jedna osoba Kardinalita vazby je 1:1, tedy k jedné osobě lze přiřadit jednu nebo žadnou židli a naopak. Toto odpovídá zadání, ve kterém sledujeme obsazenost místnosti a nesnažíme se postihnout všechny reálně možné případy (jedna osoba sedí na více židlích a na jedne židli sedí více osob). Většinu vazeb je možno zahrnutím krajních případů rozšířit na vazby M:N. Stejně jako v předchozím případě je definovaná pouze vazba sedí na, která zahrnuje všechny ostatní vztahy které mohou mezi třídami Osoba a Židle nastat. Reflexivní asociace V některých případech mohou objekty téže třídy komunikovat vzájemně. V diagramu tříd tuto vazbu znázorňujeme jako asociaci jejíž oba konce jsou v dané třídě. V diagramu objektů se pak asociace mezi objekty téže třídy zobrazují stejně jako mezi objekty různých tříd.

44 Vztahy 7 Vytvořte diagramy tříd Učitel a Student a definujte vztahy asociace učí a zná se. Vytvořte diagram objektů tříd Učitel a Student a definujte mezi nimi vazbu asociace. Řešení: Vazba učí mezi učitelem a studentem je vazba typu N:M. Vazbu zná se nedefinujeme mezi učitelem a studentem (je zahrnuta ve vztahu učí ), ale mezi jednotlivými studenty. Ti se navzájem mohou a nemusí znát, každý student také může znát libovolný počet jiných studentů, jedná se tedy opět o vztah s násobností M:N. Vdiagramu tříd jsou znázorněné obecné vazby mezi třídami objektů: učitel může učit jednoho a více studentů studenta může učit jeden a více učitelů student může znát libovolný počet jiných studentů studenta může znát libovolný počet jiných studentů V objektovém diagramu jsou pak vyznačené konkrétní vztahy, tedy: student Franta se zná s Pepou i Květošem Pepa a Květoš se neznají učitel všechny učí

45 8 Objektově orientované programování Implementace Konkrétní implementace asociace je poměrně jednoduchá. Jak bylo řečeno asociace je voláním metody jiného objektu (zasílání zprávy). Stačí tedy jednomu objektu doručit odkaz na objekt, jehož metodu má zavolat. Zadání: Zapište deklaraci třídy Ucitel a Student. Učitel bude moci zasilat zpravy určitému žákovi. class Student{ // atributy string jmeno; // metody void vypisinfo(){ cout << "jmeno: " << jmeno << endl; ; class Ucitel{ // metode predavam odkaz na objekt tridy Student, // tento odkaz jsem pojmenoval zak void informujostudentovi(student* zak){ // volam metodu jineho objektu zak->vypisinfo(); ; int main(){ Ucitel* karasek = new Ucitel; Student* omacka = new Student; omacka->jmeno = "Bedrich Omacka"; // v tomto okamziku se realizovala vazba mezi karaskem a omackou // metoda karaska zavolala metodu omacky a vypsalo se jmeno karasek->informujostudentovi(omacka); return 0; Užitečný model je takový model, který je co nejjednodušší a přitom dobře (nikoliv ideálně) postihuje modelovanou skutečnost. Je nutné dodat, že termínu asociace se v literatuře často využívá v okamžiku, kdy mluvíme o volání metody (jak je ukázáno výše), ale také v okamžiku kdy mluvíme o obecné vazbě jejíž typ ještě nebyl upřesněn.

46 Vztahy 9 Řešený příklad k procvičení Definujte třídu Auto a další tři třídy osob tak, aby každá z nich byla ke třídě Auto vázána asociací s jinou násobností. Řešení: Příkladem osoby, která ma k autu jednoznačný vztah 1:1 je řidič auta. Řidič může řídit maximalně jedno auto a jedno auto nemohou řídit dva řidiči. Naproti tomu, mezi pasažérem a autem je vztah 1:N, protože v automobilu může cestovat více pasažerů. Jeden pasažér však může cestovat pouze v jednom vozidle. Příkladem osoby se vztahem M:N může být uživatel automobilu (tj. osoba, která od něj má klíče), tedy jedno vozidlo může být užívano několika uživateli, současně však každý uživatel může užívat několik vozidel (do této skuipny je možné zařadit také například mechanika, policistu a další). Alternativně by bylo možné definovat násobnosti vazeb řídí a jede v na straně třídy Auto jako 1 místo To je možné v případě, že třídy Řidič a Pasažér definujeme jako řidiče auta a pasažéra v autě, tedy tak, že nezahrnují řidiče a pasažéry jiných dopravních prostředků. Pak by vazba znamenala, že pasažér jede právě v jednom automobilu, anebo to není pasažér. Shrnutí Asociace je nejobecnějším vztahem mezi třídami a objekty. Asociace mezi třídami nevyjadřuje konkrétní akci ani činnost, ale existenci vztahu. Násobnost (kardinalita) vztahu určuje kolik objektů se vazby učastní. Reflexivní asociace je vztah mezi objekty téže třídy. Pro úplnost je nezbytné dodat, že v praxi je většina vazeb označených nyní jako asociace v průběhu návrhu upřesněna do podoby agregace nebo kompozice. Předcházející text měl pouze za účel vysvětlit základní principy tvorby vazeb (násobnosti, popisování, reflexivita, atp.).

47 Vztahy 1 Test Způsob vyhodnocení: Při vyhodnocení budou za nesprávné odpovědi strhnuty body. 1. Následujícímu diagramu odpovídá popis: 2 Vyberte jen jednu z následujících možných odpovědí. a) Každý hlídač může hlídat více budov. Každou budovu má na starost právě jeden hlídač. Pes může chodit s více hlídači. Hlídač chodí s maximálně jedním psem. Ke každé budově náleží jeden nebo více vrátných. Vráný má na starost právě jednu budovu. b) Každý hlídač může hlídat více budov. Každou budovu má na starost právě jeden hlídač. Pes může chodit s více hlídači. Hlídač chodí s maximálně jedním psem. Ke každé budově náleží právě jeden vrátný. Vráný může mít na starost více budov. O každou budovu se stará právě jeden příslušný vrátný. c) Každý hlídač má na starost právě jednu budovu. Budovu může hlídat libovolný počet hlídačů. Pes náleží nejvýše jednomu hlídači. Hlídač může mít více psů. Ke každé budově náleží jeden nebo více vrátných. Vráný má na starost právě jednu budovu. 2. Následujícímu diagramu odpovídá popis: 2 Vyberte jen jednu z následujících možných odpovědí. a) Každý doktor se stará právě o jednoho pacienta. O pacienta se může starat jeden nebo více doktorů. Každý doktor umí léčit alespoň jednu nemoc. Každá nemoc je léčena právě jedním doktorem. Doktorovi pomáhá nejvýše jedna sestra. Každá sestra pomáhá alepoň jednomu doktorovi.

48 2 Objektově orientované programování b) Každý doktor se stará alespoň o jednoho pacienta. O každého pacienta se stará právě jeden jeho doktor. Každý doktor umí léčit jednu určitou nemoc. Některé nemoci jsou léčeny více doktory. Doktorovi pomáhá alespoň jedna sestra. Každá sestra pomáhá nejvýše jednomu doktorovi. c) Každý doktor se stará alespoň o jednoho pacienta. O každého pacienta se stará právě jeden jeho doktor. Každý doktor umí léčit jednu určitou nemoc. Některé nemoci jsou léčeny více doktory. Doktorovi pomáhá nejvýše jedna sestra. Každá sestra pomáhá alepoň jednomu doktorovi. 3. Následujícímu diagramu odpovídá popis: 2 Vyberte jen jednu z následujících možných odpovědí. a) Každý sportovec náleží právě do jednoho klubu. Do klubu může chodit libovolný počet sportovců. Každý sportovec má právě jednoho trenéra. Trenér se stará právě o jednoho sportovce. Každý klub má alespoň jednoho sponzora. Spozor financuje nejvýše jeden klub. b) Každý sportovec náleží právě do jednoho klubu. Do klubu může chodit libovolný počet sportovců. Každý sportovec má právě jednoho trenéra. Trenér se stará právě o jednoho sportovce. Každý klub má nejvýše jednoho sponzora. Spozor financuje alespoň jeden klub. c) Každý sportovec může chodit do libovolného počtu klubů. Ke každému klubu náleží jeho příslušný sportovec. Každý sportovec má právě jednoho trenéra. Trenér se stará právě o jednoho sportovce. Každý klub má nejvýše jednoho sponzora. Spozor financuje alepoň jeden klub. Agregace Silnější typy vazeb Agregace Agregace (zahrnutí, obsažení) je forma asociace, která znázorňuje skutečnost, že jeden objekt (agregovaný objekt) je částí druhého objektu (agregátu). Prakticky jsou všechny objekty složené z dílčích objektů, například tužka se skádá z tuhy a z obalu, tuha se dále skládá z molekul, molekuly se skládájí z atomů, atd. Třída je však pouze modelem skutečnosti a proto v ní definujeme další objekty pouze pokud je to účelné z hlediska modelu. Agregace a z ní vycházející kompozice nám umožňují zavést v modelu hierarchii, tj. všechny třídy nejsou na jedné úrovni, ale některé jsou částmi větších celků.

49 Vztahy 3 Definice třídy Auto s vlastnostmi: SPZ, barva, vykonmotoru, typmotoru, pocetvalcu, palivo. class Auto { string SPZ; string barva; int vykonmotoru; string typmotoru; int pocetvalcu; string palivo; ; (V UML znaménko - označuje private. Zde se UML a kód neshodují, jde však pouze ilustraci zápisu.) Nevýhodou této definice je ignorování přirozených vztahů mezi atributy (výkon motoru souvisí s typem motoru a nesouvisí s barvou auta). Je výhodnější použít strukturovanou definici objektu. Objekt z třídy Auto obsahuje (agreguje) objekt z třídy Motor. Třída Auto má atributy: barva, značka, počet náprav. Každý motor má výkon, počet válců a výrobce. class Motor { int vykon; int pocetvalcu; string vyrobce; ; class Auto { string barva; string znacka; int pocetnaprav; Motor motor; //atribut pro ulozeni objektu tridy Motor ; Diagram agregovaných tříd Auto a Motor, agregace se značí prázdným kosočtvercem u agregátu.

50 4 Objektově orientované programování Aby příklad byl úplný je nutné ukázat si, jak v praxi dojde k provázání dvou konrétních objektů. Uvažujme třídy z předchozího příkladu a vytvořme jejich instance, které následně propojíme pomocí agregace. int main(){ Motor* tdi = new Motor; // vytvorime motor Auto* fiesta = new Auto;// vytvorime auto fiesta->motor = tdi; // provazeme motor s autem, v tomto okamziku se vytvorila vazba fiesta->motor->pocetvalcu = 6; // nyni muzeme pristupovat k motoru tdi skrze odkaz // v instanci tridy auto tdi->pocetvalcu = 6; // udela to same jako predchozi radek Motor* hdi = new Motor; // vytvorime jiny motor fiesta->motor = hdi; // soucasti auta bude ted jiny motor fiesta->motor->pocetvalcu = 6; // nyni se nastavil pocet valcu u motoru HDI delete hdi; // smazani vsech objektu delete tdi; delete fiesta; Agregace je využívána především pro zlepšení opakoveného použití částí zdrojového kódu. Po rozdělení konkrétní třídy na více menších a obecnějších tříd, je možné tyto dílčí vzory využívat při sestavování jiných a komplikovanějších. Například třídu Motor z příkladu 12 můžeme použít nejen v definici třídy Auto, ale i v definici libovolného jiného stroje, který má motor. Vhodným rozložením složité třídy na více agregovaných tříd se deklarace těchto tříd značně zjednodušší a zpřehlední. Agregace je dočasná vazba mezi dvěma objekty. Objekty vzniknou nezávisle na sobě, pak jsou provázány (tato vazba může být kdykoliv zrušena nebo nahrazena jinou) a nakonec každý zvlášť zanikne. Např. motor tedy není nedělitelnou součástí auta. Může být libovolně měněn v průběhu běhu programu. Kompozice Kompozice je specifickou formou agregace 13, která nepovoluje agregovanému objektu existovat mimo agregát. Život části tedy začíná a končí s životem celku. Z hlediska deklarace se jedná o naprosto totožnou vazbu jako agregace (značí se plným kosočtvercem), rozdíl je pouze v implementaci zacházení s objektem. 12 javascript:void(0);/* */ 13 a tedy i asociace, protože agregace je specifickou formou asociace.

51 Vztahy 5 Z hlediska obchodníka s automobily je vztah mezi třídou Motor a Auto spíše kompozice. Obchodník automobil koupí i s motorem (motor tedy vzniká současně s autem) a prodává ho i s motorem (motor tedy zaniká současně s autem), neprodává samostatné motory ani automobily bez motorů. Motor je z jeho pohledu tedy nedílnou součástí automobilu. Vazba agregace bývá také nědy označována jako dvě vazby Part-of (je částí) a Has-a (má část). Rozdíl implementace kompozice a agregace V předchozím textu bylo ukázáno, jak je v praxi implementována agregace. Objekty byly vytvořeny nezávisle na sobě, provázány a nakonec každý zvlášť vymazány. V případě kompozice jsou všechny současti celku vytvořeny v konstruktoru celku, pak existují pevně spjaty s celkem a nakonec jsou smazány pomocí destruktoru celku, tedy v okamžiku, kdy celek zanikne.

52 6 Objektově orientované programování Ukažme si kompozici opět na zdrojovém kódu v C++: #include<iostream> using namespace std; class Motor { int vykon; int pocetvalcu; string vyrobce; ; class Auto { string barva; string znacka; int pocetnaprav; Motor* motor; //atribut pro ulozeni objektu tridy Motor Auto(){ // neobejdeme se bez konstruktoru motor = new Motor; // motor nyni ukazuje na nove vytvorenou instanci tridy Motor ~Auto(){ // musime mit i destruktor, ktery smaze motor delete motor; ; int main(){ Auto* fiesta = new Auto; // v tomto okamziku se vytvorilo auto a v nem i motor fiesta->motor->pocetvalcu = 6; // korektni pristup k motoru delete fiesta; // ted se zrusilo i auto i motor return 0; Kompozice je těsnější typ vazby. Objekty, které jsou součástmi celku jsou vytvářeny v kontruktoru celku a mazány v destruktoru celku. Jsou tedy na celku zcela závislé. Jaký je rozdíl mezi agregací a kompozicí. Dokážete tento rozdíl popsat v jazyku C++?

53 Vztahy 7 Řešené příklady k procvičení problematiky 1. Motorové vozidlo Definujte třídu Motor, která bude mít alespoň tři atributy popisující vlastnosti motoru. Tyto atributy budou nastavitelné pouze v konstruktoru a ke každému bude existovat metoda pro čtení getatribut. Dále nadefinujte třídu Auto, která bude mít atributy popisující vlastnosti automobilu a bude v sobě agregovat objekt třídy Motor. Atributy třídy Auto nastavujte pomocí konstruktoru. Ve třídě Auto implementujte metodu vypisvlastnosti, která vypíše vlastnosti automobilu. Třída Motor Název atributu Hodnota atributu Datový typ Objem 1,4 l číslo Výkon 60 koní číslo Palivo nafta řetězec Metody: getobjem, getvykon, getpalivo Třída Auto Název atributu Hodnota atributu Datový typ Značka Škoda řetězec Typ Fabia řetězec Barva Vyblitě zelená řetězec Počet dveří 5 číslo Motor MujMotor Motor Metody: vypisvlastnosti Diagram tříd:

54 8 Objektově orientované programování 2. Počítač a jeho komponenty Definujte alespoň tři třídy popisující komponenty PC (např. procesor, RAM, monitor, I/O zařízení,... ). Dále nadefinujte třídu Pocitac, která bude obsahovat (agregovat) ostatní komponenty. Protože atributy komponent jsou neměnné, nastavujte je pomocí parametrů konstruktoru. Každá komponenta bude obsahovat metody typu getvlastnost. Tyto metody využijte v metodě Pocitac::PochlubSeJakJsesSkvelej, která vypíše všechny vlastnosti daného PC. Třída Procesor Název atributu Hodnota atributu Datový typ Výrobce Intel řetězec Značka Celeron řetězec Frekvence MHz číslo Metody: getvyrobce, getznacka, getfrekvence Třída RAM Název atributu Hodnota atributu Datový typ Výrobce KingMax řetězec Kapacita 256 MB číslo Metody: getvyrobce, getkapacita Třída IO Název atributu Hodnota atributu Datový typ Monitor ano bool Klávesnice ano bool Myš ano bool Reproduktory ne bool Tiskárna ano bool Scanner ne bool Mikrofon ne bool Metody: ismonitor, isklavesnice, ismys, isreproduktory, istiskarna, isscanner, ismikrofon, getio Třída Pocitac Název atributu Hodnota atributu Datový typ Výrobce Tesco řetězec Procesor Intel Celeron Procesor RAM KingMax 256MB RAM IO Tesco IO IO Metody: pochlubsejakjsesskvelej Diagram tříd:

55 Vztahy 9 3. Ovocný sad Nadefinujte třídu Strom popisující ovocný strom - druh, rok výsadby a očekávaný výnos. Implementujte metodu staristromu, která vypočítá stáří stromu v letech. Dále nadefinujte třídu Sad, která bude popisovat sad obsahující 100 stromů (uvažujte jako matici 10x10 viz kapitola o datových typech). Třídu obohaťte o metody pro výpočet průměrného stáří stromu, určení nejstaršího stromu a celkového výnosu. Třída Strom Název atributu Hodnota atributu Datový typ Druh švestka řetězec Rok výsadby 1983 číslo Výnos 40 kg číslo Metody: staristromu, getvynos, getdruh Třída Sad

56 10 Objektově orientované programování Název atributu Hodnota atributu Datový typ Majitel Pepík string Stromy Strom[10][10] Metody: prumernestaristromu, nejstarsistrom, celkovyvynos Diagram tříd: Dědičnost Dědičnost Dědičnost je jeden z klíčových nástrojů OOP, který umožňuje vytváření nových tříd (nový programových modulů) jen naprogramováním změn oproti třídě jiné. Tento způsob vývoje aplikací bývá nazývan diferenciální programování (programming by extension) a zásadně přispívá ke zrychlení vývoje aplikací.

57 Vztahy 11 Uvažujme následující neúplné deklarace tříd: class NakladniAuto { private: string SPZ; string barva; int rokvyroby; date STK; int maxnaklad; int maxosob; int pocetnaprav;... ; class OsobniAuto { private: string SPZ; string barva; int rokvyroby; date STK; int maxosob; int pocetdveri;... ; Je patrné, že obě třídy mají množství společných atributů (a metod), mezi třídami tedy musí existovat nějaká vazba. Obě třídy reprezentují nějaký typ automobilu, reprezentují nějaký speciální typ automobilu. Můžeme tedy říci, že obě třídy jsou specializací třídy Automobil, kterou definujeme tak, aby obsa-

58 12 Objektově orientované programování Vztah dědičnost (inheritance) je možné rozdělit na dvě doplňkové vazby - specializaci (realization) a zobecnění (generalization). Potomek (osobní auto nebo nákladní auto) rodičovské třídy je speciálním případem rodičovské třídy (auto), naopak rodičovská třída je zobecněním svých potomků. Rodičovská třída obsahuje pouze prvky společné všem potomkům. Dědění a modifikátory viditelnosti Popišme si nyní, co se stalo v předchozím příkladu, když jsme místo dvou kompletních definicí tříd (nádkladního a osobní auta), vytvořili obecné auto a následně jeho potomky, kteří postihovali pouze změny oproti obecnému autu. První věc, na kterou se musíme podívat jsou modifikátory viditelnosti. Tato problematika je poměrně dost závislá na zvoleném programovacím jazyku, já ji vysvětlím jazyku C++. V C++, jak již víte, existují 3 modifikátory viditelnosti - public, protected a private. V případě dědičnosti začneme používat ten prostřední, který zatím nebyl pořeba - protected. Jaký je význam protected? Z hlediska přístupu k atributům/metotodám je stejný jako private. Tedy: K metodám nebo atributů označeným jako protected, nelze přistupovat z hlavní funkce programu nebo metod jiných tříd. Nyní se podívejme, co se děje s atributy v případě dědění. Základní typ dědění u C++ je dědění způsobem public (toto označení typu dědění). V případě dědění tímto způsobem nastává následující situace: Atributy a metody, které jsou v předkovi označeny public se jakoby zkopírují do potomka a lze je v potomkovi využívat (např. metodu vratrokvyroby, lze klidně volat v jiných metodách tříd OsobniAuto i NakladniAuto i z hlavní funkce programu). Atributy a metody, které jsou v předkovi označeny protected se jakoby zkopírují do potomka a lze je v potomkovi využívat (např. atribut rokvyroby, lze modifikovat v jiných metodách tříd OsobniAuto i NakladniAuto, ne však i z hlavní funkce programu - vzpomeňte, chová se to z hlediska přístupu jako private). Atributy a metody, které jsou v předkovi označeny private nelze je v potomkovi využívat. Pokud něco v předkovi takto označíte, potomek to neuvidí. Nicméně, přesto bude takový např. atribut existovovat a pokud bude mít předek i např. public metodu, která ho umožní nastavit, potomek bude moci tuto metodu zavolat a do atributu zapsat. Kromě dědění způsobem public, které bylo právě popsáno, existují v C++ i dědění způsobem protected a private. V zásadě se jedná o podobný princip, pouze se částečně mení modifikátory viditelnosti zděděných atributů a metod. Metody dědění a rozdíly mezi nimi ilustruje přehledně následující tabulka. Tab. 13: Metody dědění v C++ V předkovi je public V předkovi je protected V předkovi je private Dědíme způsobem public V potomkovi je public V potomkovi je protected V potomkovi není přístupný Dědíme způsobem protected V potomkovi je protected V potomkovi je protected V potomkovi není přístupný Dědíme způsobem private V potomkovi je private V potomkovi je private V potomkovi není přístupný

59 Vztahy 13 Dědění umožňuje snížení redundance kódu a vícenasobné používání již hotových funkčních celků. Pomocí dědění je tedy možné snadno sdílet hotový kód a jemně upravovat jeho funkci. Pomocí agregace je také možné sdílet již hotové třídy, ale nelze dále měnit jejich funkci. Jak při použití dědičnosti, tak při použití agregace se funkčnost části kódu (tedy nějaké metody) změní jejím obalením novou metodou, která před nebo po zavolání původní metody něco udělá. Při použití agregace však je nová (obalující) metoda součástí agregátu a nelze ji tedy dále využít u jiného agregátu, tedy nová metoda není součástí agregovaného objektu. Použije-li se však dědičnost, pak je možné novou (obalující) metodu umístit do nového objektu, který je dále možné použít stejně jako objekt původní. Při vytváření zdědných objektů je třeba dbát na to, aby změny byly malé. a Hrozí totiž nebezpečí, že mezi potomkem a rodičem vznikne silná závislost, tedy že potomek závisí na implemenetaci rodiče, což ruší výhody dědičnosti, protože pak je nutné při změně rodiče opravovat i potomky. a Malou změnou se myslí malá změna funkčnosti metody, nesouvisí to přímo s počtem řádků. Je potřeba dávat velký pozor na to, jestli není možné nahradit dědičnost jiným typem vazby (např. agregací). Dědičnost je nejsilnějí vazba a nelze ji po celou dobu běhu programu změnit. Přetížení a překrytí metody Při vytváření potomka můžeme modifikovat již exitující metody předka. V praxi máme tři možnosti: 1. Ponecháme metodu předka nezměněnou. 2. Vytvoříme v potomkovi metodu, která se jmenuje stejně jako v předkovi a má i stejný počet parametrů - překrytí. 3. Vytvoříme v potomkovi metodu (nebo i v předkovi), která se jmenuje stejně jako jiná, ale má jiný počet nebo typy parametrů - přetížení. Pokud použijeme překrytí a vytvoříme instanci potomka, potom se implicitně používá verze metody z potomka, která překryla původní. Pokud bychom v takovém případě chtěli explicitně zavolat verzi z předka, musíme to překladači říci např. pomocí předpony identifikující předka (Predek::vypis info()). V případě přetížené metody je situace jednoduchá, protože metody se liší počtem parametrů. Stačí tedy metodu zavolat se správným počtem nebo typy parametrů a překladač sám příslušnou metodu identifikuje. Chování konstruktorů a destruktorů v případě dědičnosti Chování konstruktorů a destruktorů může být ze začátku trochu matoucí. Platí však několik jasných pravidel, které si stačí osvojit.

60 14 Objektově orientované programování 1. Konstruktory se volají v pořadí od nejstaršího předka po aktuální třídu. 2. Destruktory se volají v opačném pořadí od aktuální třídy po nejstaršího předka 3. Pokud používáme parametrické konstruktory, je nutné volat ručně parametrické konstruktory předků (viz příklad níže). 4. Pokud má předek pouze paramterický konstruktor, musíme ho ručně zavolat, pokud má i neparamerický konstruktor, nemusíme volat nic a automaticky se zavolá onen bezparametrický. 5. Konstruktor potomka si musí vyžádat i parametry nutné pro vytvoření předka. Aby byly lépe vysvětleny bod 3 a 4, vytvořme si třídu Vozidlo s vlastností maximalnirychlost, která je zadána př vytvoření vozidla a jejího potomka Motocykl. Motocykl má vlastnost značka, která je vynucena konstruktorem. class Vozidlo{ private: int maximalnirychlost; Vozidlo(int zadanamaxrychlost){ maximalnirychlost = zadanamaxrychlost; ; class Motocykl: public Vozidlo{ private: string znacka; // konstruktor motocyklu vynuti zadani parametru co sam potrebuje // i co potrebuji predci. O rychlost se postara kontruktor predka. Motocykl(int maxrychlost, string zadanaznacka):vozidlo(maxrychlost){ // konstruktor motocyklu resi jen znacku znacka = zadanaznacka; ; Řešené příklady k procvičení problematiky dědičnosti 1. Jméno a příjmení Definujte třídu Jmeno, která obsahuje pouze textový řetězec se jménem a metody pro jeho nastavení, zjištění a vypsání na obrazovku. Dále definujte třídu JmenoAPrijmeni, která je potomkem třídy Jmeno a která navíc obsahuje atribut příjmení a metody pro jeho nastavení a zjištění. Metodu pro vypsání jména na obrazovku upravte tak, aby vypisovala jméno i příjmení. Nejprve vytvořte UML model a teprve potom pište kód v C++. Můžete vytvořit ještě dalšího potomka, který bude třídu rozšiřovat ještě o prostřední jméno a umožní tak zápis jmen typu Vladimír Iljič Lenin.

61 Vztahy 15 Třída Jmeno: Název atributu Hodnota atributu Datový typ Jméno Pepíček řetězec Metody: setjmeno, getjmeno, vypisjmeno Třída JmenoAPrijmeni: Název atributu Hodnota atributu Datový typ Jméno Pepíček řetězec Příjmení Novák řetězec Metody: setjmeno, getjmeno, vypisjmeno, setprijmeni, getprijmeni 2. Vozidlo Vzpomínáte na třídu Auto agregující třídu Motor? Nyní vytvoříme dva potomky této třídy - OsobniAuto a NakladniAuto obsahující relevantní atributy (u osobního automobilu to bude počet osob, u nákladního nosnost). Nejprve vymodelujte pomocí UML, teprve poté pište kód v C++! Třída Motor

62 16 Objektově orientované programování Název atributu Hodnota atributu Datový typ Objem 1,4 l číslo Výkon 60 koní číslo Palivo nafta řetězec Metody: getobjem, getvykon, getpalivo Třída Auto Název atributu Hodnota atributu Datový typ Značka Škoda řetězec Typ Fabia řetězec Barva Vyblitě zelená řetězec Počet dveří 5 číslo Motor MujMotor TMotor Metody: vypisvlastnosti Třída OsobniAuto Název atributu Hodnota atributu Datový typ Značka Škoda řetězec Typ Fabia řetězec Barva Vyblitě zelená řetězec Počet dveří 5 číslo Motor MujMotor TMotor Počet osob 5 číslo Metody: vypisvlastnosti, setpocetosob, getpocetosob Třída NakladniAuto Název atributu Hodnota atributu Datový typ Značka Škoda řetězec Typ Fabia řetězec Barva Vyblitě zelená řetězec Počet dveří 5 číslo Motor MujMotor TMotor Nosnost 8 tun číslo Metody: vypisvlastnosti, setnosnost, getnosnost Digram tříd

63 Vztahy Bankovní účet Nadefinujte třídu Ucet, která bude implementovat nejzákladnější operace s bankovním účtem: Vklad, výběr a zjištění stavu. Dále nadefinujte potomka této třídy: UrocenyUcet, která bude navíc implementovat metodu pro připsání stanoveného úroku. Nakonec nadefinujte třídu UrocenyUcetSPoplatkem, která bude potomkem úročeného účtu a bude navíc implementovat strhnutí poplatku z účtu. Nejprve vymodelujte pomocí UML, teprve poté pište kód v C++! Třída Ucet Název atributu Hodnota atributu Datový typ Stav konta 5,50 Kč číslo Metody: Vklad, Vyber, getstav Třída UrocenyUcet Název atributu Hodnota atributu Datový typ Stav konta 5,50 Kč číslo Úroková sazba 0,5 % číslo Metody: Vklad, Vyber, getstav, geturokovasazba, seturokovasazba, PrictiUrok Třída UrocenyUcetSPoplatkem Název atributu Hodnota atributu Datový typ Stav konta 5,50 Kč číslo Úrok 0,5 % číslo Poplatek 30 Kč číslo

64 18 Objektově orientované programování Metody: Vklad, Vyber, getstav, geturokovasazba, seturokovasazba, PrictiUrok, setpoplatek, getpoplatek, StrhniPoplatek 4. Zaměstnanec Nadefinujte třídu Clovek obsahující jako atributy základní údaje o člověku (jméno, příjmení, datum narození... ) a metody pro jejich zjištění a nastavení. Pomocí dědění tuto třídu rozšiřte na Zamestnanec - třídu, která navíc bude obsahovat informace o pracovní pozici a platu zaměstnance. Nejprve vymodelujte pomocí UML, teprve poté pište kód v C++! Chcete-li si procvičit více, pro jméno a příjmení člověka agregujte třídu JmenoAPrijmeni z příkladu uvedeného dříve. 5. ZOO Nadefinujte třídy Zivocich obsahující jako atributy nějaké smyslupné informace o živočichovi. Dále nadefinujte potomky Savec, Ptak, které budou vhodně rozšiřovat třídu Zivocich. Dále nadefinujte alespoň dva potomky každého z potomků (např. Kocka, Pes, Sykorka, Vrana,... ). Vyzkoušejte volání metod předků, specifikátory dědičnosti, konstruktory, destruktory...

65 Vztahy 1 Test Způsob vyhodnocení: Při vyhodnocení budou za nesprávné odpovědi strhnuty body. 1. Do kterých atributů můžeme zapisovat z metod třídy Predek? class Predek{ int a; protected: int b; private: int c; ; class Potomek : public Predek{ int d; protected: int e; private: int f; ; 1 Vyberte libovolný počet možných odpovědí. Správná nemusí být žádná, ale také mohou být správné všechny. a) c b) f c) e d) b e) d f) a 2. Do kterých atributů z třídy Predek můžeme zapisovat z metod třídy Potomek? class Predek{ int a; protected: int b; private: int c; ; class Potomek : public Predek{ int d; protected: int e; private: int f; ; 1 Vyberte libovolný počet možných odpovědí. Správná nemusí být žádná, ale také mohou být správné všechny. a) b b) a c) c 3. Co se vypíše na obrazovku? class Predek{ void vypisiformace(){ cout << "Ahoj, ja jsem predek" << endl; 1

66 2 Objektově orientované programování ; class Potomek : public Predek{ void vypisiformace(){ cout << "Ahoj, ja jsem potomek" << endl; ; int main(){ Predek* instance = new Predek; instance->vypisinformace();... Vyberte jen jednu z následujících možných odpovědí. a) Nic z uvedeného, metoda se stejnou hlavičkou v předkovi i v potomkovi nemůže existovat. b) Ahoj, ja jsem potomek c) Ahoj, ja jsem predek 4. Co se vypíše na obrazovku? class Predek{ void vypisiformace(){ cout << "Ahoj, ja jsem predek" << endl; ; class Potomek : public Predek{ void vypisiformace(){ cout << "Ahoj, ja jsem potomek" << endl; ; int main(){ Potomek* instance = new Potomek; instance->vypisinformace();... 1 Vyberte jen jednu z následujících možných odpovědí. a) Nic z uvedeného, metoda se stejnou hlavičkou v předkovi i v potomkovi nemůže existovat. b) Ahoj, ja jsem potomek c) Ahoj, ja jsem predek 5. Do kterých atributů můžeme zapisovat z hlavní funkce programu a jiných metod jiných tříd pokud vytvoříme instanci třídy Potomek? class Predek{ int a; protected: int b; private: int c; ; class Potomek : public Predek{ int d; protected: int e; private: int f; 1 ;

67 Vztahy 3 Vyberte libovolný počet možných odpovědí. Správná nemusí být žádná, ale také mohou být správné všechny. a) e b) f c) d d) b e) a f) c Příklady Příklad 1 Udělejte třídu Člověk. Člověk má výšku a váhu. Každý člověk je složený objekt (kompozice), který má Mozek s počtem šedivých a bílých buněk a Srdce. Srdce má tep a tlak. Když vytvoříme nového člověka, musí vzniknout i jeho mozek a srdce. Naopak - při jeho smrti, musí být zrušeny i jeho orgány. Zkuste vytvořit par. konstruktor člověka, který vynutí zadaní parametrů orgánů. Řešení: /* V tomto prikladu zamerne pomijime zapouzdreni. V praxi by byl takovy navrh nevhodny, ale zavedeni soukromych atributu by cely problem komplikovalo a castecne zamlzilo vysvetlovanou latku - kompozici. */ #include <iostream> using namespace std; class Mozek{ int pocetsedivychbunek; int pocetbilychbunek; Mozek(int zadanesedive, int zadanebile){ pocetbilychbunek = zadanebile; pocetsedivychbunek = zadanesedive; ; class Srdce{ int tep; int tlak; Srdce(int zadanytep, int zadanytlak){ tep = zadanytep; tlak = zadanytlak; ; class Clovek{ int vyska; int vaha; Mozek* mozecek; Srdce* srdicko; Clovek(int vyska, int vaha, int bile, int sedive, int tep, int tlak){ this->vyska = vyska; // Pro pripomenuti, jak pristoupit k prekrytemu this->vaha = vaha; // atributu. mozecek = new Mozek(bile, sedive); srdicko = new Srdce(tep, tlak); ~Clovek(){ delete(srdicko);

68 4 Objektově orientované programování delete(mozecek); ; int main (int argc, char * const argv[]) { Clovek* pepik = new Clovek(178, 68, , , 50, 90); cout << "Vyska Pepika: " << pepik->vyska << endl; cout << "Tlak Pepika: " << pepik->srdicko->tlak << endl; cout << "Mozek Pepika: " << pepik->mozecek->pocetbilychbunek << ", " << pepik->mozecek->pocetsedivychbunek << endl; delete(pepik); return 0; Příklad 2 Navrhněte a implementujte jednoduchý inf. systém autodílny. Eviduje techniky (jejich jména), faktury (jakou zakázku pokrývají a jaký zákazním je platí, kolik platí, jestli už je zaplacena), zákazníky (jméno) a zakázky (popis zakázky a jaký zákazník je objednal). Faktura bude mít metodu vypiš fakturu, která vypíše informace o faktuře, metodu, která nastaví proplaceno na true a metodu na opravu částky. Technik bude mít metodu na zpracování zakázky, které se předá v parametru zpracovávaná zakázka a návratovou hodnotou bude instance třídy faktura. Řešení: #include<iostream> using namespace std; class Zakaznik{ string jmeno; Zakaznik(string jmeno){ this->jmeno = jmeno; ; class Zakazka{ Zakaznik* zakaznik; string popis; Zakazka(Zakaznik* zakaznik){ this->zakaznik = zakaznik; ; class Faktura{ Zakazka* zakazka; Zakaznik* zakaznik; private: int castka; bool zaplaceno; string technik; Faktura(int castka, Zakazka* zakazka, string technik){ this->castka = castka; this->zakazka = zakazka; this->zakaznik = zakazka->zakaznik; this->technik = technik; void opravcastku(int castka){ this->castka = castka;

69 Vztahy 5 void proplat(){ zaplaceno = true; void vypisfakturu(){ cout << "Jmeno: " << zakaznik->jmeno << endl; cout << "Popis prace: " << zakazka->popis << endl; cout << "Kdo praci delal: " << technik << endl; cout << "Cena: " << castka << endl; ; class Technik{ string jmeno; Technik(string jmeno){ this->jmeno = jmeno; Faktura* zpracujzakazku(zakazka* zakazka){ // zde by se spocitala cena, provedly dalsi operace // tj. volame metody jako spocti naklady... int cenaopravy = 1000; Faktura* faktura = new Faktura(cenaOpravy, zakazka, jmeno); return faktura; ; int main(){ Technik* pepik = new Technik("Pepik Kosik"); Zakaznik* novak = new Zakaznik("Jiri Novak"); Zakazka* opravaauta = new Zakazka(novak); opravaauta->popis = "Oprava nabourane Skody Felicia"; Faktura* novafaktura = pepik->zpracujzakazku(opravaauta); novafaktura->vypisfakturu(); //cout << opravaauta->faktura->vypisfakturu(); delete(novak); delete(opravaauta); delete(novafaktura); delete(pepik); return 0; Příklad 3 Vytvořte model souborového systému, který se skládá ze souborů a adresářů. Adresář může mít rodiče. Soubor musí být umístěn v určitém adresáři. Jak soubor, tak adresář mají své jméno. Řešení: #include <iostream> using namespace std; class Adresar{ private: string jmeno; Adresar* rodic; // pozor agregace // predavam odkaz v konstruktoru, ale stale se jedna // o agregaci, neplest s asociaci, tam ten odkaz zanika

70 6 Objektově orientované programování // po konci metody Adresar(string jmeno, Adresar* rodic){ this->jmeno = jmeno; this->rodic = rodic; string vratjmeno(){ return jmeno; ; class Soubor{ private: string jmeno; Adresar* ulozen; // agregace Soubor(string jmeno, Adresar* ulozen){ this->jmeno = jmeno; this->ulozen = ulozen; string vratjmeno(){ return jmeno; ; int main (int argc, char * const argv[]) { Adresar* root = new Adresar("root", NULL); Adresar* dokumenty = new Adresar("dokumenty", root); Soubor* dopis = new Soubor("dopis.txt", dokumenty); // priklady vyuziti agregace pro vypis informaci cout << "Soubor " << dopis->vratjmeno(); cout << " je ulozen v adresari " << dopis->ulozen->vratjmeno(); cout << " a ten je ulozen v adresari " << dopis->ulozen->rodic->vratjmeno(); cout << endl; // zde si vyzkousejte ruzne varianty vypisu jmen { prime, neprime... // v pripade casu i asociaci, kdy treba rodic adresar, vypise jmeno potomka // na ktereho je mu predan odkaz { vypisjmenopotomka(adresar* potomek) delete(dopis); delete(dokumenty); delete(root); return 0; Příklad 4 Prvňáček používá sešit a kalkulačku. Definujte třídu Prvnacek, která obsahuje metody napisdosesitu() a vypocitej(), třídu Sesit, která obsahuje metodu pripis() a třídu Kalkulacka, která obsahuje metody plus() a minus(). Implementujte hlavní program demonstrující zasílání zpráv mezi prvňáčkem, sešitem a kalkulačkou.

71 Vztahy 7 Řešení: Diagram tříd: Mezi třídami je jen obyčejná vazba asociace, prvňáček může zapisovat do libovolného sešitu (tedy nemusí to být jeho sešit), v jednom okamžiku však nemůže zapisovat do více sešitů. Vazba mezi prvňáčkem a kalkulačkou je obdobná. Mezi kalkulačkou a sešitem přímá vazba není. Násobnosti ve všech uzlech by bylo možné zapsat také jako Zdrojový kód programu v C++: #include <iostream> using namespace std; class Sesit { //deklarace třídy Sesit private: string text; /*cely text sešitu, atribut text je pouze pro čtení, je tedy definovaná jen metoda gettext() */ Sesit(); //konstruktor void pripis(string atext); /* metoda pripis není typická metoda pro nastavení atributu text, proto se nejmenuje settext(). */ string gettext(); ; class Kalkulacka { //deklarace třídy Kalkukacka private: int pamet; Kalkulacka(); int plus(int operand1, int operand2); int minus(int operand1, int operand2); ; class Prvnacek { //třída Prvnacek nemá žádné atributy void napisdosesitu(sesit* kam, string co); int vypocitej(kalkulacka* kde, int operand1, int operand2, string operace); ; //============= implementace tridy sesit Sesit::Sesit() { text = ""; void Sesit::pripis(string atext) { text = text + atext; string Sesit::getText() { return text; //============= implementace tridy kalkulacka Kalkulacka::Kalkulacka() { pamet = 0;

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

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: 1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.

Více

Úvod do programování. Lekce 1

Úvod do programování. Lekce 1 Úvod do programování Lekce 1 Základní pojmy vytvoření spustitelného kódu editor - psaní zdrojových souborů preprocesor - zpracování zdrojových souborů (vypuštění komentářů atd.) kompilátor (compiler) -

Více

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

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 KAPITOLA 1 Úvod do programo vání v jazyce C++ 17 Základní pojmy 17 Proměnné a konstanty 18 Typy příkazů 18 IDE integrované vývojové

Více

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

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: 1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.

Více

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií 1 Fakulta elektrotechniky a informatiky Katedra softwarových technologií 12. října 2009 Organizace výuky Přednášky Teoretické základy dle normy jazyka C Cvičení Praktické úlohy odpřednášené látky Prostřední

Více

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

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; } Pole Kdybychom v jazyce C++chtěli načíst větší počet čísel nebo znaků a všechny bylo by nutné všechny tyto hodnoty nadále uchovávat v paměti počítače, tak by bylo potřeba v paměti počítače alokovat stejný

Více

Programovací jazyk C++ Hodina 1

Programovací jazyk C++ Hodina 1 Programovací jazyk C++ Hodina 1 Používané překladače Bloodshed Dev C++ http://www.bloodshed.net/devcpp.html CodeBlocks http://www.codeblocks.org pokud nemáte již nainstalovaný překladač, stáhněte si instalátor

Více

Funkční objekty v C++.

Funkční objekty v C++. Funkční objekty v C++. Funkční objekt je instance třídy, která má jako svou veřejnou metodu operátor (), tedy operátor pro volání funkce. V dnešním článku si ukážeme jak zobecnit funkci, jak používat funkční

Více

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

Programování v C++ 3, 3. cvičení Programování v C++ 3, 3. cvičení úvod do objektově orientovaného programování 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled Dokončení spojového

Více

Zápis programu v jazyce C#

Zápis programu v jazyce C# Zápis programu v jazyce C# Základní syntaktická pravidla C# = case sensitive jazyk rozlišuje velikost písmen Tzv. bílé znaky (Enter, mezera, tab ) ve ZK překladač ignoruje každý příkaz končí ; oddělovač

Více

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

24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1 24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE AUTOR DOKUMENTU: MGR. MARTINA SUKOVÁ DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 UČIVO: STUDIJNÍ OBOR: PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) INFORMAČNÍ TECHNOLOGIE

Více

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

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++ 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

Více

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

Úvod do programování - Java. Cvičení č.4 Úvod do programování - Java Cvičení č.4 1 Sekvence (posloupnost) Sekvence je tvořena posloupností jednoho nebo více příkazů, které se provádějí v pevně daném pořadí. Příkaz se začne provádět až po ukončení

Více

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

Základy C++ I. Jan Hnilica Počítačové modelování 18 Základy C++ I 1 Přechod z C na C++ jazyk C++ je nadmnožinou jazyka C z hlediska syntaxe se jedná o velmi podobné jazyky, spolu s dalšími jazyky "céčkovské" rodiny, jako je např. C# každý platný program

Více

Objektově orientované programování

Objektově orientované programování 10. října 2011 Pragmatické informace Volitelný předmět, zápočet: zápočtový program(s dokumentací), aktivní účast na cvičení(body v CodExu), praktický test, zkouška: zkoušková písemka na objektový návrh

Více

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) Operátory new a delete, virtuální metody Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody Dynamická alokace paměti Jazyky C a C++ poskytují programu možnost vyžádat si část volné operační paměti pro

Více

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

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016 ZPRO cvičení 2 Martin Flusser Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague October 17, 2016 Outline I 1 Outline 2 Proměnné 3 Proměnné - cvičení 4 Funkce 5 Funkce

Více

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

Jazyk C++, některá rozšíření oproti C Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 1/22 Jazyk C++, některá rozšíření oproti C Ing. Josef Vogel, CSc Katedra softwarového inženýrství Katedra

Více

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

8 Třídy, objekty, metody, předávání argumentů metod 8 Třídy, objekty, metody, předávání argumentů metod Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost třídám a objektům, instančním

Více

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

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu: Čtvrtek 8 prosince Pascal - opakování základů Struktura programu: 1 hlavička obsahuje název programu, použité programové jednotky (knihovny), definice konstant, deklarace proměnných, všechny použité procedury

Více

Výčtový typ strana 67

Výčtový typ strana 67 Výčtový typ strana 67 8. Výčtový typ V této kapitole si ukážeme, jak implementovat v Javě statické seznamy konstant (hodnot). Příkladem mohou být dny v týdnu, měsíce v roce, planety obíhající kolem slunce

Více

Programování v jazyce C a C++

Programování v jazyce C a C++ Programování v jazyce C a C++ Richter 1 Petyovský 2 1. března 2015 1 Ing. Richter Miloslav, Ph.D., UAMT FEKT VUT Brno 2 Ing. Petyovský Petr, UAMT FEKT VUT Brno C++ Stručná charakteristika Nesdíĺı normu

Více

Více o konstruktorech a destruktorech

Více o konstruktorech a destruktorech Více o konstruktorech a destruktorech Více o konstruktorech a o přiřazení... inicializovat objekt lze i pomocí jiného objektu lze provést přiřazení mezi objekty v původním C nebylo možné provést přiřazení

Více

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

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech 7 Formátovaný výstup, třídy, objekty, pole, chyby v programech Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost formátovanému výstupu,

Více

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

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++ C++ Akademie SH 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory Za áte níci C++ 20. b ezna 2011 Obsah 1 Prom nné - primitivní typy Celá ísla ƒísla s pohyblivou desetinnou árkou, typ bool 2 Podmínka

Více

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

přetížení operátorů (o) přetížení operátorů (o) - pro vlastní typy je možné přetížit i operátory (tj. definovat vlastní) - pro definici slouží klíčové slovo operator následované typem/znakem operátoru - deklarace pomocí funkčního

Více

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

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března Polymorfismus Cíle lekce Cílem lekce je vysvětlit význam pojmu polymorfismus jako základní vlastnosti objektově orientovaného programování. Lekce objasňuje vztah časné a pozdní vazby a jejich využití.

Více

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

Programování v C++ 1, 1. cvičení Programování v C++ 1, 1. cvičení opakování látky ze základů programování 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í procvičených

Více

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

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++ Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++ Prostory jmen U programů mohou někdy nastat kolize mezi jmény (tříd, funkcí, globálních proměnných atd.) pokud v různých

Více

6 Příkazy řízení toku

6 Příkazy řízení toku 6 Příkazy řízení toku Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost příkazům pro řízení toku programu. Pro všechny tyto základní

Více

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

IB111 Programování a algoritmizace. Objektově orientované programování (OOP) IB111 Programování a algoritmizace Objektově orientované programování (OOP) OP a OOP Objekt Kombinuje data a funkce a poskytuje určité rozhraní. OP = objektové programování Vše musí být objekty Např. Smalltalk,

Více

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ 1) PROGRAM, ZDROJOVÝ KÓD, PŘEKLAD PROGRAMU 3 2) HISTORIE TVORBY PROGRAMŮ 3 3) SYNTAXE A SÉMANTIKA 3 4) SPECIFIKACE

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Řídicí struktury jazyka Java Struktura programu Příkazy jazyka Blok příkazů Logické příkazy Ternární logický operátor Verze pro akademický rok 2012/2013 1 Struktura programu

Více

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

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod. Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 7 Parametry metod, předávání

Více

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

IUJCE 07/08 Přednáška č. 1 Úvod do předmětu Literatura Záznamy přednášek a vaše poznámky Harbison, S. P., Steele, G. L.: Referenční příručka jazyka C Herout, P.: Učebnice jazyka C Kernighan, B. W., Ritchie, D. M.: The C Programming

Více

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

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19 C++ přetěžování funkcí a operátorů 1 Přetěžování funkcí jazyk C++ umožňuje napsat více funkcí se stejným názvem, těmto funkcím říkáme přetížené přetížené funkce se musí odlišovat typem nebo počtem parametrů,

Více

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

ZPRO v C Ing. Vít Hanousek. verze 0.3 verze 0.3 Hello World Nejjednoduší program ukazující vypsání textu. #include using namespace std; int main(void) { cout

Více

9.3.2010 Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

9.3.2010 Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h> 9.3.2010 Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include int main(void) { int dcislo, kolikbcislic = 0, mezivysledek = 0, i; int vysledek[1000]; printf("zadejte

Více

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty. Proměnná Pojmenované místo v paměti sloužící pro uložení hodnoty. K pojmenování můžeme použít kombinace alfanumerických znaků, včetně diakritiky a podtržítka Rozlišují se velká malá písmena Název proměnné

Více

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů Začínáme vážně programovat Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů Podmínky a cykly Dokončení stručného přehledu řídících struktur jazyka C. Složený příkaz, blok Pascalské

Více

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI EVROPSKÝ SOCIÁLNÍ FOND Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI Úvod do PHP PHP Personal Home Page Hypertext Preprocessor jazyk na tvorbu dokumentů přípona: *.php skript je součást HTML stránky!

Více

Hotelová škola, Obchodní akademie a Střední průmyslová škola Teplice,Benešovo náměstí 1, příspěvková organizace

Hotelová škola, Obchodní akademie a Střední průmyslová škola Teplice,Benešovo náměstí 1, příspěvková organizace Hotelová škola, Obchodní akademie a Střední průmyslová škola Teplice,Benešovo náměstí 1, příspěvková organizace VZDĚLÁVACÍ MATERIÁL ZPRACOVÁN V RÁMCI PROJEKTU EU PENÍZE STŘEDNÍM ŠKOLÁM - OPVK 1.5 Registrační

Více

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

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007 Úvod do programovacích jazyků (Java) Michal Krátký 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

5 Přehled operátorů, příkazy, přetypování

5 Přehled operátorů, příkazy, přetypování 5 Přehled operátorů, příkazy, přetypování Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně budou uvedeny detaily týkající se operátorů. Doba nutná k nastudování

Více

Šablony, kontejnery a iterátory

Šablony, kontejnery a iterátory 11. března 2015, Brno Připravil: David Procházka Šablony, kontejnery a iterátory Programovací jazyk C++ Šablony Strana 2 / 31 Obsah přednášky 1 Šablony 2 Abstraktní datové struktury 3 Iterátory 4 Array

Více

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b Výrazy a operátory i = 2 i = 2; to je výraz to je příkaz 4. Operátory Unární - unární a unární + Např.: +5-5 -8.345 -a +b - unární ++ - inkrement - zvýší hodnotu proměnné o 1 - unární -- - dekrement -

Více

Assembler - 5.část. poslední změna této stránky: Zpět

Assembler - 5.část. poslední změna této stránky: Zpět 1 z 5 19.2.2007 7:52 Assembler - 5.část poslední změna této stránky: 9.2.2007 1. Pseudoinstrukce a direktivy Zpět Kromě instrukcí můžete v Assembleru psát také další konstrukce, které se obšem nepřekládají

Více

Programujeme v softwaru Statistica

Programujeme v softwaru Statistica Programujeme v softwaru Statistica díl druhý Newsletter Statistica ACADEMY Téma: Programování, makra, skripty Typ článku: Návody V tomto článku si ukážeme další možnosti při psaní maker v softwaru Statistica.

Více

Šablony, kontejnery a iterátory

Šablony, kontejnery a iterátory 7. října 2010, Brno Připravil: David Procházka Šablony, kontejnery a iterátory Programovací jazyk C++ Šablony Strana 2 / 21 Šablona funkce/metody Šablona je obecný popis (třídy, funkce) bez toho, že by

Více

6. Příkazy a řídící struktury v Javě

6. Příkazy a řídící struktury v Javě 6. Příkazy a řídící struktury v Javě Příkazy v Javě Příkazy v Javě Řídicí příkazy (větvení, cykly) Přiřazovací příkaz = Řízení toku programu (větvení, cykly) Volání metody Návrat z metody - příkaz return

Více

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

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007 Úvod do programovacích jazyků (Java) Michal Krátký 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

Programovací jazyk Pascal

Programovací jazyk Pascal Programovací jazyk Pascal Syntaktická pravidla (syntaxe jazyka) přesná pravidla pro zápis příkazů Sémantická pravidla (sémantika jazyka) pravidla, která každému příkazu přiřadí přesný význam Všechny konstrukce

Více

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

Programování v C++, 2. cvičení Programování v C++, 2. cvičení 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 Operátory new a delete 2 3 Operátory new a delete minule

Více

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu } 5. Operátor čárka, - slouží k jistému určení pořadí vykonání dvou příkazů - oddělím-li čárkou dva příkazy, je jisté, že ten první bude vykonán dříve než příkaz druhý. Např.: i = 5; j = 8; - po překladu

Více

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr) Základy jazyka C Základy programování 1 Martin Kauer (Tomáš Kühr) Organizační záležitosti Konzultace Pracovna 5.076 Úterý 15:00 16:30 Emailem martin.kauer@upol.cz Web předmětu http://tux.inf.upol.cz/~kauer/index.php?content=var&class=zp1

Více

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

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek 8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek 1/41 Základní příkazy Všechny příkazy se píšou malými písmeny! Za většinou příkazů musí být středník (;)! 2/41 Základní příkazy

Více

Jazyk C# a platforma.net

Jazyk C# a platforma.net Jazyk C# a platforma.net Katedra softwarového inženýrství Fakulta informačních technologií České vysoké učení technické v Praze Pavel Štěpán, 2011 Syntaxe jazyka C# - 1. část BI-DNP Evropský sociální fond

Více

Vector datový kontejner v C++.

Vector datový kontejner v C++. Vector datový kontejner v C++. Jedná se o datový kontejner z knihovny STL jazyka C++. Vektor je šablona jednorozměrného pole. Na rozdíl od "klasického" pole má vector, mnoho užitečných vlastností a služeb.

Více

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

Dynamicky vázané metody. Pozdní vazba, virtuální metody Dynamicky vázané metody Pozdní vazba, virtuální metody Motivace... class TBod protected: float x,y; public: int vrat_pocet_bodu() return 1; ; od třídy TBod odvodíme: class TUsecka: public TBod protected:

Více

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce. Vážení zákazníci, dovolujeme si Vás upozornit, že na tuto ukázku knihy se vztahují autorská práva, tzv copyright To znamená, že ukázka má sloužit výhradnì pro osobní potøebu potenciálního kupujícího (aby

Více

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

Programování v C++ 2, 4. cvičení Programování v C++ 2, 4. cvičení statické atributy a metody, konstruktory 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled Přístupová práva

Více

Lekce 6 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Lekce 6 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C Identifikační údaje školy Číslo projektu Název projektu Číslo a název šablony Autor Tematická oblast Číslo a název materiálu Anotace Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace

Více

Konstruktory a destruktory

Konstruktory a destruktory Konstruktory a destruktory Nedostatek atributy po vytvoření objektu nejsou automaticky inicializovány hodnota atributů je náhodná vytvoření metody pro inicializaci, kterou musí programátor explicitně zavolat,

Více

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

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole Příkaz switch Příkaz switch provede příslušnou skupinu příkazů na základě hodnoty proměnné (celočíselné

Více

Úvod do programovacích jazyků (Java)

Úvod do programovacích jazyků (Java) Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích

Více

Řídicí struktury. alg3 1

Řídicí struktury. alg3 1 Řídicí struktury Řídicí struktura je programová konstrukce, která se skládá z dílčích příkazů a předepisuje pro ně způsob provedení Tři druhy řídicích struktur: posloupnost, předepisující postupné provedení

Více

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632

Více

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Maturitní otázky z předmětu PROGRAMOVÁNÍ Wichterlovo gymnázium, Ostrava-Poruba, příspěvková organizace Maturitní otázky z předmětu PROGRAMOVÁNÍ 1. Algoritmus a jeho vlastnosti algoritmus a jeho vlastnosti, formy zápisu algoritmu ověřování správnosti

Více

Objektové programování

Objektové programování Objektové programování - přináší nové možnosti a styl programování - vytváří nový datový typ, který umí vše co standardní datové typy + to co ho naučíme - překladač se k tomuto typu chová stejně jako k

Více

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.

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. Informatika 10. 9. 2013 Jméno a příjmení Rodné číslo 1) Napište algoritmus pro rychlé třídění (quicksort). 2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus

Více

1. Dědičnost a polymorfismus

1. Dědičnost a polymorfismus 1. Dědičnost a polymorfismus Cíl látky Cílem této kapitoly je představit klíčové pojmy dědičnosti a polymorfismu. Předtím však je nutné se seznámit se základními pojmy zobecnění neboli generalizace. Komentář

Více

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

PB161 Programování v jazyce C++ Přednáška 4 PB161 Programování v jazyce C++ Přednáška 4 Přetěžování funkcí Konstruktory a destruktory Nikola Beneš 9. října 2017 PB161 přednáška 4: přetěžování funkcí, konstruktory, destruktory 9. října 2017 1 / 20

Více

PHP tutoriál (základy PHP snadno a rychle)

PHP tutoriál (základy PHP snadno a rychle) PHP tutoriál (základy PHP snadno a rychle) Druhá, vylepšená offline verze. Připravil Štěpán Mátl, http://khamos.wz.cz Chceš se naučit základy PHP? V tom případě si prostuduj tento rychlý průvodce. Nejdříve

Více

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false Logické operace Datový typ bool může nabýt hodnot: o true o false Relační operátory pravda, 1, nepravda, 0, hodnoty všech primitivních datových typů (int, double ) jsou uspořádané lze je porovnávat binární

Více

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG 2008-9)

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG 2008-9) Programování v C++ Úplnej úvod Co se naučíte? tak samozřejmě C++, s důrazem na: dynamické datové struktury Objektově Orientované Programování STL (standardní knihovna šablon) vytváření vlastních šablon

Více

Standardní algoritmy vyhledávací.

Standardní algoritmy vyhledávací. Standardní algoritmy vyhledávací. Vyhledávací algoritmy v C++ nám umožňují vyhledávat prvky v datových kontejnerech podle různých kritérií. Také se podíváme na vyhledávání metodou půlením intervalu (binární

Více

11.5.2012. Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

11.5.2012. Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9 Obsah přednášky 9 Základy programování (IZAPR, IZKPR) Přednáška 9 Základy dědičnosti, přístupová práva Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 03 022, Náměstí Čs. legií

Více

Programování II. Modularita 2017/18

Programování II. Modularita 2017/18 Programování II Modularita 2017/18 Modul? Osnova přednášky Vývoj programování Modularita Příklad Vývoj programování Paradigmata programování Jak a proč se jazyky vyvíjejí? V čem se OOP liší od předchozích

Více

Delphi - objektově orientované

Delphi - objektově orientované Kapitola 6 Delphi - objektově orientované programování Objektově orientované programování (zkracováno na OOP, z anglického Object oriented programming) je metodika vývoje softwaru, založená na těchto myšlenkách,

Více

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632

Více

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

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března Dědičnost Cíle lekce Cílem lekce je naučit se pracovat a využívat dědičnosti při návrhu a tvorbě programů. Lekce je zaměřena hlavně na jednoduchou dědičnost. Bude rovněž vysvětlen rozdíl mezi dědičností

Více

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

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632

Více

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

PB161 Programování v jazyce C++ Přednáška 7 PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z

Více

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

PB161 Programování v jazyce C++ Přednáška 7 PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z

Více

Objektově orientovaný přístup

Objektově orientovaný přístup Objektově orientovaný přístup 1 Historie programovacích jazyků 1945: John von Neumann článek o nové metodě pro ukládání programů 1945: Grace Hopper poprvé termín "bug" 1946: Konrad Zuse Plankalkul - první

Více

2 Datové typy v jazyce C

2 Datové typy v jazyce C 1 Procedurální programování a strukturované programování Charakteristické pro procedurální programování je organizace programu, který řeší daný problém, do bloků (procedur, funkcí, subrutin). Původně jednolitý,

Více

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19 Algoritmy I Cvičení č. 2, 3 1 ALG I, informace Cvičící RNDr. Eliška Ochodková, Ph.D., kancelář EA439 eliska.ochodkova@vsb.cz www.cs.vsb.cz/ochodkova Přednášející doc. Mgr. Jiří Dvorský, Ph.D., kancelář

Více

Z. Kotala, P. Toman: Java ( Obsah )

Z. Kotala, P. Toman: Java ( Obsah ) Z. Kotala, P. Toman: Java ( Obsah ) 13. Výjimky Výjimka (exception) je definována jako událost, která nastane během provádění programu a která naruší normální běh instrukcí. Výjimka je vyvolána například

Více

Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz

Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz Upozornění pro čtenáře a uživatele této knihy Všechna práva vyhrazena. Žádná část této tištěné či elektronické knihy nesmí být reprodukována a šířena

Více

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7 Pascal Katedra aplikované kybernetiky Ing. Miroslav Vavroušek Verze 7 Proměnné Proměnná uchovává nějakou informaci potřebnou pro práci programu. Má ve svém oboru platnosti unikátní jméno. (Připadne, musí

Více

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

Množina v C++ (set, multiset). Množina v C++ (set, multiset). Množina je datová struktura, ve které jsou uloženy nějaké prvky. V množině nesmí být dva stejné prvky. Naopak multimnožina může obsahovat i stejné prvky. Nad množinou lze

Více

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

Programování v C++ 1, 5. cvičení Programování v C++ 1, 5. cvičení konstruktory, nevirtuální dědění 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 3 Shrnutí minule procvičené

Více

Programování v jazyce C a C++

Programování v jazyce C a C++ Programování v jazyce C a C++ Příklad na tvorbu třídy Richter 1 4. prosince 2017 1 Ing. Richter Miloslav, Ph.D., UAMT FEKT VUT Brno Dvourozměrné pole pomocí tříd Zadání Navrhněte a napište třídu pro realizace

Více

PREPROCESOR POKRAČOVÁNÍ

PREPROCESOR POKRAČOVÁNÍ PREPROCESOR POKRAČOVÁNÍ Chybová hlášení V C# podobně jako v C++ existuje direktiva #error, která způsobí vypsání chybového hlášení překladačem a zastavení překladu. jazyk C# navíc nabízí direktivu #warning,

Více

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

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory Výhody objektového řešení Nástroje pro IO operace jsou v C++ součástí knihoven Hierarchie objektových

Více

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

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr Koncepce (větších) programů Základy programování 2 Tomáš Kühr Parametry a návratová hodnota main Již víme, že main je funkce A také tušíme, že je trochu jiná než ostatní funkce v programu Funkce main je

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Výrazy Operátory Výrazy Verze pro akademický rok 2012/2013 1 Operace, operátory Unární jeden operand, operátor se zapisuje ve většině případů před operand, v některých případech

Více

Rozklad na prvočinitele. 3. prosince 2010

Rozklad na prvočinitele. 3. prosince 2010 Rozklad na prvočinitele Ondřej Slavíček 3. prosince 2010 1 Obsah 1 Příručka k programu 3 1.1 funkce main()............................. 3 1.2 funkce hlavnifunkce()........................ 3 1.3 funkce

Více

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

C++ objektově orientovaná nadstavba programovacího jazyka C C++ objektově orientovaná nadstavba programovacího jazyka C (1. část) Josef Dobeš Katedra radioelektroniky (13137), blok B2, místnost 722 dobes@fel.cvut.cz 5. května 2014 České vysoké učení technické v

Více