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

Save this PDF as:
 WORD  PNG  TXT  JPG

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) << << 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;

Kód. Proměnné. #include <iostream> using namespace std; int main(void) { cout << "Hello world!" << endl; cin.get(); return 0; }

Kód. Proměnné. #include <iostream> using namespace std; int main(void) { cout << Hello world! << endl; cin.get(); return 0; } Jazyk C++ Jazyk C++ je nástupcem jazyka C. C++ obsahuje skoro celý jazyk C, ale navíc přidává vysokoúrovňové vlastnosti vyšších jazyků. Z toho plyne, že (skoro) každý platný program v C je také platným

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

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

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

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

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

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++ Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++ Globální konstantní proměnné Konstantní proměnné specifikujeme s klíčovým slovem const, tyto konstantní proměné

Více

Seminář Java II p.1/43

Seminář Java II p.1/43 Seminář Java II Seminář Java II p.1/43 Rekapitulace Java je case sensitive Zdrojový kód (soubor.java) obsahuje jednu veřejnou třídu Třídy jsou organizovány do balíků Hierarchie balíků odpovídá hierarchii

Více

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

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT Číslo a název šablony Číslo didaktického materiálu Druh didaktického materiálu Autor Jazyk Téma sady didaktických materiálů Téma didaktického materiálu Vyučovací předmět Cílová skupina (ročník) Úroveň

Více

1. Programování proti rozhraní

1. Programování proti rozhraní 1. Programování proti rozhraní Cíl látky Cílem tohoto bloku je seznámení se s jednou z nejdůležitější programátorskou technikou v objektově orientovaném programování. Tou technikou je využívaní rozhraní

Více

10 Balíčky, grafické znázornění tříd, základy zapozdření

10 Balíčky, grafické znázornění tříd, základy zapozdření 10 Balíčky, grafické znázornění tříd, základy zapozdření 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 balíčkům, grafickému

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

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

Pokročilé programování v jazyce C pro chemiky (C3220) Vstup a výstup v C++ Pokročilé programování v jazyce C pro chemiky (C3220) Vstup a výstup v C++ Proudy pro standardní vstup a výstup V jazyce C++ provádíme textový vstup a výstup prostřednictvím tzv. datových proudů Datové

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

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

DSL manuál. Ing. Jan Hranáč. 27. října 2010. V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v DSL manuál Ing. Jan Hranáč 27. října 2010 V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v současné době krátký) seznam vestavěných funkcí systému. 1 Vytvoření nového dobrodružství Nejprve

Více

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

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

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

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

4.4.2012. Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady

4.4.2012. Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady Základy programování (IZAPR, IZKPR) Přednáška 5 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 03 022, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky Příkazy cyklu -

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

7. Datové typy v Javě

7. Datové typy v Javě 7. Datové typy v Javě Primitivní vs. objektové typy Kategorie primitivních typů: integrální, boolean, čísla s pohyblivou řádovou čárkou Pole: deklarace, vytvoření, naplnění, přístup k prvkům, rozsah indexů

Více

Datové typy strana 29

Datové typy strana 29 Datové typy strana 29 3. Datové typy Jak již bylo uvedeno, Java je přísně typový jazyk, proto je vždy nutno uvést datový typ datového atributu, formálního parametru metody, návratové hodnoty metody nebo

Více

Vstupní požadavky, doporučení a metodické pokyny

Vstupní požadavky, doporučení a metodické pokyny Název modulu: Základy PHP Označení: C9 Stručná charakteristika modulu Modul je orientován na tvorbu dynamických stánek aktualizovaných podle kontextu volání. Jazyk PHP umožňuje velmi jednoduchým způsobem

Více

Inovace bakalářského studijního oboru Aplikovaná chemie http://aplchem.upol.cz

Inovace bakalářského studijního oboru Aplikovaná chemie http://aplchem.upol.cz Inovace bakalářského studijního oboru Aplikovaná chemie http://aplchem.upol.cz CZ.1.07/2.2.00/15.0247 Tento projekt je spolufinancován Evropským sociálním fondem a státním rozpočtem České republiky. Tvorba

Více

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

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT Číslo a název šablony Číslo didaktického materiálu Druh didaktického materiálu Autor Jazyk Téma sady didaktických materiálů Téma didaktického materiálu Vyučovací předmět Cílová skupina (ročník) Úroveň

Více

Projekt Obrázek strana 135

Projekt Obrázek strana 135 Projekt Obrázek strana 135 14. Projekt Obrázek 14.1. Základní popis, zadání úkolu Pracujeme na projektu Obrázek, který je ke stažení na http://java.vse.cz/. Po otevření v BlueJ vytvoříme instanci třídy

Více

Maturitní témata Školní rok: 2015/2016

Maturitní témata Školní rok: 2015/2016 Maturitní témata Školní rok: 2015/2016 Ředitel školy: Předmětová komise: Předseda předmětové komise: Předmět: PhDr. Karel Goš Informatika a výpočetní technika Mgr. Ivan Studnička Informatika a výpočetní

Více

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

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++ Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++ Dědičnost tříd Dědičnost umožňuje vytvářet nové třídy z tříd existujících tak, že odvozené třídy (tzv. potomci) dědí vlastnosti

Více

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

map, multimap - Asociativní pole v C++. map, multimap - Asociativní pole v C++. Jedná se o asociativní pole. V asociativním poli jsou uloženy hodnoty ve tvaru (klíč,hodnota), kde klíč je vlastně "index" prvku. Klíčem může být libovolný objekt,

Více

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

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT Číslo a název šablony Číslo didaktického materiálu Druh didaktického materiálu Autor Jazyk Téma sady didaktických materiálů Téma didaktického materiálu Vyučovací předmět Cílová skupina (ročník) Úroveň

Více

elearning jako součást prezenční výuky kurzů týkajících se programování

elearning jako součást prezenční výuky kurzů týkajících se programování elearning jako součást prezenční výuky kurzů týkajících se programování David Procházka 1, Hana Netrefová 2 Abstrakt Tento článek prezentuje výsledky projektu Tvorba multimediálních studijních materiálů

Více

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda 1. Lze vždy z tzv. instanční třídy vytvořit objekt? 2. Co je nejčastější příčinou vzniku chyb? A. Specifikace B. Testování C. Návrh D. Analýza E. Kódování 3. Je defenzivní programování technikou skrývání

Více

Syntaxe vyjímek. #include <iostream> #include <string> using namespace std; // Trida vyjimek class Vyjimka { private:

Syntaxe vyjímek. #include <iostream> #include <string> using namespace std; // Trida vyjimek class Vyjimka { private: Vyjímky. Pod pojmem výjimka se rozumí nějaká výjimečná situace, která nastane v dané funkci. V jazyce C i C++ se často používá návratových hodnot funkcí, které vracejí úspěšnost provádění nějaké operace

Více

1. Téma 03 - Rozhodování

1. Téma 03 - Rozhodování 1. Téma 03 - Rozhodování Cíl látky Seznámit se a prakticky si vyzkoušet zápis rozhodování v jazyce Java 1.1. Úvod Jednou z nejčastěji používanou konstrukcí při programování je rozhodování. Právě této problematice

Více

Program a životní cyklus programu

Program a životní cyklus programu Program a životní cyklus programu Program algoritmus zapsaný formálně, srozumitelně pro počítač program se skládá z elementárních kroků Elementární kroky mohou být: instrukce operačního kódu počítače příkazy

Více

Jazyk C++ II. Šablony a implementace

Jazyk C++ II. Šablony a implementace Jazyk C++ II Šablony a implementace AR 2013/2014 Jazyk C++ II Úvod Dědičnost a kompozice nejsou vždy tou správnou odpovědí na požadavky znovupoužitelnosti kódu. Proto máme možnost definování určité třídy

Více

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Využití OOP v praxi -- Knihovna PHP -- Interval.cz Page 1 of 6 Knihovna PHP Využití OOP v praxi Po dlouhé teorii přichází na řadu praxe. V následujícím textu si vysvětlíme možnosti přístupu k databázi pomocí různých vzorů objektově orientovaného programování

Více

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

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39 Programování v C# Hodnotové datové typy, řídící struktury Petr Vaněček 1 / 39 Obsah přednášky Referenční datové typy datové položky metody přístupové metody accessory, indexery Rozhraní Pole 2 / 39 Třídy

Více

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

Iterátory v C++. int pole[20]; for (int *temp = pole, temp!= &pole[20]; temp++) { *temp = 0; Iterátory v C++. Iterátor v C++ je vlastně taková obdoba ukazatelů pro kontejnery. Dříve, než se dostaneme k bližšímu vysvětlení pojmu iterátor, ukážeme si jednoduchý příklad, jak pracovat s obyčejným

Více

Objektově orientované programování v jazyce Python

Objektově orientované programování v jazyce Python Objektově orientované programování v jazyce Python Co to je objektově orientované programování Python není přímo objektově orientovaný jazyk, ale podporuje nejdůležitější části objektově orientovaného

Více

Prezentace a vysvětlení programového prostředí NXC

Prezentace a vysvětlení programového prostředí NXC Úvod Další jazyk, který je možno použít pro programování NXT kostky je NXC Not exatly C Na rozdíl od jazyku NXT-G, kde jsme vytvářeli program pomocí grafických prvků přesněji řečeno pomocí programovacích

Více

PHP. nejen pro začátečníky. $c; echo { Martin Pokorný. Vzdìlávání, které baví www.c-media.cz. Nakladatelství a vydavatelství.

PHP. nejen pro začátečníky. $c; echo { Martin Pokorný. Vzdìlávání, které baví www.c-media.cz. Nakladatelství a vydavatelství. }else{ { if($b >$ c){ echo $max=$b; // vypí }else{ echo $max=$c; // vypí?> cas se }e B : se{ echo B ; default: ($b>$c){ echo C ; } $max=$b; }else{ $max=$c; PHP nejen pro začátečníky k;?> $c; echo { Martin

Více

3. Třídy. Základní pojmy objektového programování. Třídy

3. Třídy. Základní pojmy objektového programování. Třídy 3. Třídy Základní pojmy objektového programování Jak už víme, je Java objektovým programovacím jazykem. V úvodu této kapitoly si objasníme základní pojmy objektové teorie. Objekt představuje souhrn dat

Více

Proměnné a datové typy

Proměnné a datové typy Proměnné a datové typy KAPITOLA 2 V této kapitole: Primitivní datové typy Proměnné Opakování Mezi základní dovednosti každého programátora bezesporu patří dobrá znalost datových typů. Ta vám umožní efektivní

Více

WSH Windows Script Hosting. OSY 2 Přednáška číslo 2 opravená verze z 15.10.2007

WSH Windows Script Hosting. OSY 2 Přednáška číslo 2 opravená verze z 15.10.2007 WSH Windows Script Hosting OSY 2 Přednáška číslo 2 opravená verze z 15.10.2007 Co je skript? Skriptování nástroj pro správu systému a automatizaci úloh Umožňuje psát skripty jednoduché interpretované programové

Více

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

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro: 21.4.2009 Makra - dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h - jak na vlastní makro: #define je_velke(c) ((c) >= 'A' && (c)

Více

17. Projekt Trojúhelníky

17. Projekt Trojúhelníky Projekt Trojúhelníky strana 165 17. Projekt Trojúhelníky 17.1. Základní popis, zadání úkolu Pracujeme na projektu Trojúhelníky, který je ke stažení na java.vse.cz. Aplikace je napsána s textovým uživatelským

Více

Profilová část maturitní zkoušky 2013/2014

Profilová část maturitní zkoušky 2013/2014 Střední průmyslová škola, Přerov, Havlíčkova 2 751 52 Přerov Profilová část maturitní zkoušky 2013/2014 TEMATICKÉ OKRUHY A HODNOTÍCÍ KRITÉRIA Studijní obor: 78-42-M/01 Technické lyceum Předmět: TECHNIKA

Více

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2006/2007 Radim Farana. Obsah. Obsah předmětu

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2006/2007 Radim Farana. Obsah. Obsah předmětu 1 Podklady předmětu pro akademický rok 2006/2007 Radim Farana Obsah 2 Obsah předmětu, Požadavky kreditového systému, Datové typy jednoduché, složené, Programové struktury, Předávání dat. Obsah předmětu

Více

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

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT Číslo a název šablony Číslo didaktického materiálu Druh didaktického materiálu Autor Jazyk Téma sady didaktických materiálů Téma didaktického materiálu Vyučovací předmět Cílová skupina (ročník) Úroveň

Více

2 Strukturované datové typy 2 2.1 Pole... 2 2.2 Záznam... 3 2.3 Množina... 4

2 Strukturované datové typy 2 2.1 Pole... 2 2.2 Záznam... 3 2.3 Množina... 4 Obsah Obsah 1 Jednoduché datové typy 1 2 Strukturované datové typy 2 2.1 Pole.................................. 2 2.2 Záznam................................ 3 2.3 Množina................................

Více

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

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write(\nPrumerna teplota je {0}, tprumer); Pole (array) Motivace Častá úloha práce s větším množstvím dat stejného typu o Př.: průměrná teplota za týden a odchylka od průměru v jednotlivých dnech Console.Write("Zadej T pro.den: "); double t = Double.Parse(Console.ReadLine());

Více

Relační databáze. V dnešní době existuje řada komerčních DBMS, nejznámější jsou:

Relační databáze. V dnešní době existuje řada komerčních DBMS, nejznámější jsou: Relační databáze Pojem databáze, druhy databází Databází se myslí uložiště dat. V době začátků využívání databází byly tyto členěny hlavně hierarchicky, případně síťově (rozšíření hierarchického modelu).

Více

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

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT Číslo a název šablony Číslo didaktického materiálu Druh didaktického materiálu Autor Jazyk Téma sady didaktických materiálů Téma didaktického materiálu Vyučovací předmět Cílová skupina (ročník) Úroveň

Více

Algoritmy a datové struktury

Algoritmy a datové struktury Algoritmy a datové struktury 1 / 34 Obsah přednášky Základní řídící struktury posloupnost příkazů podmínka cyklus s podmínkou na začátku cyklus s podmínkou na konci cyklus s pevným počtem opakování Jednoduchá

Více

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

Programování v jazyce C pro chemiky (C2160) 5. Čtení dat ze souboru Programování v jazyce C pro chemiky (C2160) 5. Čtení dat ze souboru Čtení dat ze souboru FILE *f = NULL; char str[10] = ""; float a = 0.0, b = 0.0; Soubor otevíráme v režimu pro čtení "r" f = fopen("/home/martinp/testdata/test1.txt",

Více

7.5 Diagram tříd pokročilé techniky

7.5 Diagram tříd pokročilé techniky 7.5 Diagram tříd pokročilé techniky Stereotypy - jeden ze základních prostředků rozšiřitelnosti UML - pro modelovací konstrukce neexistující v UML, ale podobné předdefinované v UML definované uživatelem

Více

Úvod do programování. Lekce 5

Úvod do programování. Lekce 5 I N V E S T I C E D O R O Z V O J E V Z D Ě L Á V Á N Í Inovace a zvýšení atraktivity studia optiky reg. č.: CZ.1.07/2.2.00/07.0289 Úvod do programování Lekce 5 Tento projekt je spolufinancován Evropským

Více

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4 Uložení dat v počítači Data = užitečné, zpracovávané informace Kódování (formát) dat = způsob uložení v počítači (nutno vše převést na čísla ve dvojkové soustavě) Příklady kódování dat Text každému znaku

Více

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje Konstanty I možnosti: přednostně v paměti neexistuje žádný ; o preprocesor (deklarace) #define KONSTANTA 10 o konstantní proměnná (definice) const int KONSTANTA = 10; příklad #include v paměti

Více

Vzdělávací oblast: Informatika a informační a komunikační technologie Vzdělávací obor: Programování. Předmět: Programování

Vzdělávací oblast: Informatika a informační a komunikační technologie Vzdělávací obor: Programování. Předmět: Programování Vzdělávací oblast: Informatika a informační a komunikační technologie Vzdělávací obor: Programování Vzdělávací oblast Informatika a informační a komunikační technologie pro vzdělávací obor Programování

Více

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání Čtvrtek 3. listopadu Makra v Excelu Obecná definice makra: Podle definice je makro strukturovanou definicí jedné nebo několika akcí, které chceme, aby MS Excel vykonal jako odezvu na nějakou námi definovanou

Více

Programování jako nástroj porozumění matematice (seriál pro web modernivyuka.cz)

Programování jako nástroj porozumění matematice (seriál pro web modernivyuka.cz) Programování jako nástroj porozumění matematice (seriál pro web modernivyuka.cz) Autor: Radek Vystavěl Díl 12: Algebra Lineární transformace MATEMATIKA Lineární transformace, neboli přeet hodnoty x podle

Více

Object Pascal je přísně typový procedurální jazyk, který umožňuje jak strukturované, tak objektově orientované programování.

Object Pascal je přísně typový procedurální jazyk, který umožňuje jak strukturované, tak objektově orientované programování. Delphi lekce 6 Minimum z Object Pascalu Vrátíme se ještě k základům Object Pascalu. Struktura programu Object Pascal je přísně typový procedurální jazyk, který umožňuje jak strukturované, tak objektově

Více

2015 GEOVAP, spol. s r. o. Všechna práva vyhrazena.

2015 GEOVAP, spol. s r. o. Všechna práva vyhrazena. 2015 GEOVAP, spol. s r. o. Všechna práva vyhrazena. GEOVAP, spol. s r. o. Čechovo nábřeží 1790 530 03 Pardubice Česká republika +420 466 024 618 http://www.geovap.cz V dokumentu použité názvy programových

Více

Seznámení s datovými typy a operátory

Seznámení s datovými typy a operátory Knihovny tříd Javy KAPITOLA 2 Seznámení s datovými typy a operátory Klíčové dovednosti a pojmy Seznámení s primitivními typy jazyka Java. Používání literálů. Inicializace proměnných. Seznámení s pravidly

Více

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni! Java práce s řetězci Trochu povídání.. Řetězce jsou v Javě reprezentovány instancemi tříd StringBuffer a String. Tyto třídy jsou součástí balíčku java.lang, tudíž je možno s nimi pracovat ihned bez nutného

Více

MQL4 COURSE. By Coders guru www.forex-tsd.com. -5 Smyčky & Rozhodnutí Part 1

MQL4 COURSE. By Coders guru www.forex-tsd.com. -5 Smyčky & Rozhodnutí Part 1 MQL4 COURSE By Coders guru www.forex-tsd.com -5 Smyčky & Rozhodnutí Part 1 Vítejte v páté lekci mého kurzu MQL4. Předchozí lekci si můžete stáhnout z tohoto odkazu: http://forex-tsd.com /attachment.php?attachmentid=399

Více

Inovace výuky prostřednictvím ICT v SPŠ Zlín, CZ.1.07/1.5.00/34.0333 Vzdělávání v informačních a komunikačních technologií

Inovace výuky prostřednictvím ICT v SPŠ Zlín, CZ.1.07/1.5.00/34.0333 Vzdělávání v informačních a komunikačních technologií VY_32_INOVACE_33_05 Škola Střední průmyslová škola Zlín Název projektu, reg. č. Inovace výuky prostřednictvím ICT v SPŠ Zlín, CZ.1.07/1.5.00/34.0333 Vzdělávací oblast Vzdělávání v informačních a komunikačních

Více

Ošetřování chyb v programech

Ošetřování chyb v programech Ošetřování chyb v programech Úvod chyba v programu = normální záležitost typy chyb: 1) programátorská chyba při návrhu každých 10 000 řádek 1 chyba lze jen omezeně ošetřit (před pádem aplikace nabídnout

Více

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Bridge. Známý jako. Účel. Použitelnost. Handle/Body Bridge Bridge Známý jako Handle/Body Účel odděluje abstrakci (rozhraní a jeho sémantiku) od její konkrétní implementace předchází zbytečnému nárůstu počtu tříd při přidávání implementací používá se v době

Více

7.3 Diagramy tříd - základy

7.3 Diagramy tříd - základy 7.3 Diagramy tříd - základy - popisuje typy objektů a statické vztahy mezi nimi Objednávka -datumpřijetí -předplacena -číslo -cena +vyřiď() +uzavři() {if Objednávka.zákazník.charakteristika = 'nejistý'

Více

PRVNÍ ELASTICKÝ INFORMAČNÍ SYSTÉM : QI

PRVNÍ ELASTICKÝ INFORMAČNÍ SYSTÉM : QI PRVNÍ ELASTICKÝ INFORMAČNÍ SYSTÉM : QI Cyril Klimeš a) Jan Melzer b) a) Ostravská univerzita, katedra informatiky a počítačů, 30. dubna 22, 701 03 Ostrava, ČR E-mail: cyril.klimes@osu.cz b) DC Concept

Více

DATABÁZE A SYSTÉMY PRO UCHOVÁNÍ DAT 61 DATABÁZE - ACCESS. (příprava k vykonání testu ECDL Modul 5 Databáze a systémy pro zpracování dat)

DATABÁZE A SYSTÉMY PRO UCHOVÁNÍ DAT 61 DATABÁZE - ACCESS. (příprava k vykonání testu ECDL Modul 5 Databáze a systémy pro zpracování dat) DATABÁZE A SYSTÉMY PRO UCHOVÁNÍ DAT 61 DATABÁZE - ACCESS (příprava k vykonání testu ECDL Modul 5 Databáze a systémy pro zpracování dat) DATABÁZE A SYSTÉMY PRO UCHOVÁNÍ DAT 62 Databáze a systémy pro uchování

Více

Programování v jazyku LOGO - úvod

Programování v jazyku LOGO - úvod Programování v jazyku LOGO - úvod Programovací jazyk LOGO je určen pro výuku algoritmizace především pro děti školou povinné. Programovací jazyk pracuje v grafickém prostředí, přičemž jednou z jeho podstatných

Více

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

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

Více

ŠVP Gymnázium Ostrava-Zábřeh. 4.8.16. Úvod do programování

ŠVP Gymnázium Ostrava-Zábřeh. 4.8.16. Úvod do programování 4.8.16. Úvod do programování Vyučovací předmět Úvod do programování je na naší škole nabízen v rámci volitelných předmětů v sextě, septimě nebo v oktávě jako jednoletý dvouhodinový kurz. V případě hlubšího

Více

PHP PHP je skriptovací programovací jazyk dynamických internetových stránek PHP je nezávislý na platformě

PHP PHP je skriptovací programovací jazyk dynamických internetových stránek PHP je nezávislý na platformě PHP PHP původně znamenalo Personal Home Page a vzniklo v roce 1996, od té doby prošlo velkými změnami a nyní tato zkratka znamená Hypertext Preprocessor. PHP je skriptovací programovací jazyk, určený především

Více

Typy souborů ve STATISTICA. Tento článek poslouží jako přehled hlavních typů souborů v programu

Typy souborů ve STATISTICA. Tento článek poslouží jako přehled hlavních typů souborů v programu StatSoft Typy souborů ve STATISTICA Tento článek poslouží jako přehled hlavních typů souborů v programu STATISTICA, ukáže Vám jejich možnosti a tím Vám dovolí využívat program efektivněji. Jistě jste již

Více

2 Postup při programování, úvod do programovacího jazyka Java

2 Postup při programování, úvod do programovacího jazyka Java 2 Postup při programování, úvod do programovacího jazyka Java Studijní cíl V tomto bloku bude věnována pozornost správnému postupu při programování, budou detailně vysvětleny jednotlivé etapy programování

Více

Datové struktury. alg12 1

Datové struktury. alg12 1 Datové struktury Jedna z klasických knih o programování (autor prof. Wirth) má název Algorithms + Data structures = Programs Datová struktura je množina dat (prvků, složek, datových objektů), pro kterou

Více

Registrační číslo projektu: CZ.1.07/1.5.00/34.0553 Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost

Registrační číslo projektu: CZ.1.07/1.5.00/34.0553 Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost Registrační číslo projektu: CZ.1.07/1.5.00/34.0553 Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost Projekt je realizován v rámci Operačního programu Vzdělávání pro konkurence

Více

2. Svoje řešení pojmenujte podle čísel zadání úloh: uloha1. sgpbprj uloha4. sgpbprj

2. Svoje řešení pojmenujte podle čísel zadání úloh: uloha1. sgpbprj uloha4. sgpbprj Pokyny: 1. Řešení úloh ukládejte do složky, která se nachází na pracovní ploše počítače. Její název je stejný, jako je kód, který váš tým dostal přidělený (C05, C10 apod.). Řešení, uložené v jiné složce,

Více

Architektury počítačů a procesorů

Architektury počítačů a procesorů Kapitola 3 Architektury počítačů a procesorů 3.1 Von Neumannova (a harvardská) architektura Von Neumann 1. počítač se skládá z funkčních jednotek - paměť, řadič, aritmetická jednotka, vstupní a výstupní

Více

Standardní vstup a výstup

Standardní vstup a výstup Standardní vstup a výstup Trochu teorie S pojmy standardní vstup/výstup (I/O, input/output) jste se již pravděpodobně setkali, pokud ale ne, zde je krátké vysvětlení. Standardní vstup a výstup jsou vlastně

Více

Seminář IVT. MS Excel, opakování funkcí

Seminář IVT. MS Excel, opakování funkcí Seminář IVT MS Excel, opakování funkcí Výuka Opakování z minulé hodiny. Založeno na výsledcích Vašich domácích úkolů, podrobné zopakování věcí, ve kterých děláte nejčastěji chyby. Nejčastější jsou následující

Více

Vstup a výstup datové proudy v C

Vstup a výstup datové proudy v C Vstup a výstup datové proudy v C Petr Šaloun katedra informatiky FEI VŠB-TU Ostrava 24. října 2011 Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 1 / 37 Přehled, rozdělení

Více

22. Tvorba webových stránek

22. Tvorba webových stránek 22. Tvorba webových stránek Webové stránky jsou spolu s elektronickou poštou nejpoužívanější prostředky internetu. Brouzdáme li internetem používáme nějaký prohlížeč. To, co vidíme na obrazovce v prohlížeči

Více

Datové abstrakce v programovacích jazycích

Datové abstrakce v programovacích jazycích Datové abstrakce v programovacích jazycích Motivace Strukturovat rozsáhlé programy Dovolit separátní překlad Možné formy strukturování: Podprogramy původní forma abstrakce -abstrakce výpočtů Moduly kontejnery

Více

TEORIE ZPRACOVÁNÍ DAT

TEORIE ZPRACOVÁNÍ DAT Vysoká škola báňská - Technická univerzita Ostrava Fakulta elektrotechniky a informatiky TEORIE ZPRACOVÁNÍ DAT pro kombinované a distanční studium Jana Šarmanová Ostrava 2003 Jana Šarmanová, 2003 Fakulta

Více

Excel tabulkový procesor

Excel tabulkový procesor Pozice aktivní buňky Excel tabulkový procesor Označená aktivní buňka Řádek vzorců zobrazuje úplný a skutečný obsah buňky Typ buňky řetězec, číslo, vzorec, datum Oprava obsahu buňky F2 nebo v řádku vzorců,

Více

Nemocnice. Prvotní analýza a plán projektu

Nemocnice. Prvotní analýza a plán projektu Nemocnice Projekt do předmětu AIS Prvotní analýza a plán projektu Lukáš Pohl, xpohll00, xkosti03 Jan Novák, xnovak79 2009/2010 1 Neformální specifikace FN potřebuje informační systém, který bude obsahovat

Více

Vývojové diagramy 1/7

Vývojové diagramy 1/7 Vývojové diagramy 1/7 2 Vývojové diagramy Vývojový diagram je symbolický algoritmický jazyk, který se používá pro názorné zobrazení algoritmu zpracování informací a případnou stručnou publikaci programů.

Více

Kolekce, cyklus foreach

Kolekce, cyklus foreach Kolekce, cyklus foreach Jen informativně Kolekce = seskupení prvků (objektů) Jednu již známe pole (Array) Kolekce v C# = třída, která implementuje IEnumerable (ICollection) Cyklus foreach ArrayList pro

Více

Databázové aplikace pro internetové prostředí. 01 - PHP úvod, základní princip, vkládání skriptu, komentáře, výpis na obrazovku

Databázové aplikace pro internetové prostředí. 01 - PHP úvod, základní princip, vkládání skriptu, komentáře, výpis na obrazovku Databázové aplikace pro internetové prostředí 01 - PHP úvod, základní princip, vkládání skriptu, komentáře, výpis na obrazovku Projekt: Inovace výuky prostřednictvím ICT Registrační číslo: CZ.1.07/1.5.00/34.250

Více

ROZDÍL MEZI VZTAHEM EXTEND A INCLUDE V USE CASE DIAGRAMECH

ROZDÍL MEZI VZTAHEM EXTEND A INCLUDE V USE CASE DIAGRAMECH ROZDÍL MEZI VZTAHEM EXTEND A INCLUDE V USE CASE DIAGRAMECH 3. část RNDr. Ilja Kraval, srpen 2009 http://www.objects.cz ÚVOD Tento článek je pokračováním předešlých článků. Článek vysvětluje použití vztahu

Více

Programy na PODMÍNĚNÝ příkaz IF a CASE

Programy na PODMÍNĚNÝ příkaz IF a CASE Vstupy a výstupy budou vždy upraveny tak, aby bylo zřejmé, co zadáváme a co se zobrazuje. Není-li určeno, zadáváme přirozená čísla. Je-li to možné, používej generátor náhodných čísel vysvětli, co a jak

Více

Lokální definice (1) plocha-kruhu

Lokální definice (1) plocha-kruhu Lokální definice (1) syntaxe: (local (seznam definic) výraz) definice jsou dostupné pouze uvnitř příkazu local příklad: (local ( (define Pi 3.1415926) (define (plocha-kruhu r) (* Pi r r)) ) (plocha-kruhu

Více

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans. 1 Grafické rozhraní Studijní cíl Tento blok je věnován vytváření programů s využitím grafického rozhraní (GUI). Vysvětlen bude základní filozofie pro vytváření aplikací s GUI ve srovnání s konzolovými

Více