PROGRAMOVACÍ STYLY. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Podobné dokumenty
Třídy a dědičnost. BD6B36PJV Fakulta elektrotechnická České vysoké učení technické

Algoritmizace. Cíle předmětu

Třída jako datový typ. BD6B36PJV 01 Fakulta elektrotechnická České vysoké učení technické

Výčtový typ strana 67

Programování 1 - Java

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

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

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

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

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

Základy objektové orientace I. Únor 2010

Úvod do programovacích jazyků (Java)

Algoritmizace a programování

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

KTE / ZPE Informační technologie

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

Dědění, polymorfismus

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

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

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

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

Generické programování

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.

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

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

1. Dědičnost a polymorfismus

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

Úvod do programování v jazyce Java

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

Abstraktní třídy, polymorfní struktury

PREPROCESOR POKRAČOVÁNÍ

Algoritmizace. Algoritmizace (Y36ALG), Šumperk - 1. přednáška 1

Seminář Java II p.1/43

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

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

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

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

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

1. Programování proti rozhraní

Algoritmizace a programování

Předměty. Algoritmizace a programování Seminář z programování. Verze pro akademický rok 2012/2013. Verze pro akademický rok 2012/2013

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

typová konverze typová inference

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

7.5 Diagram tříd pokročilé techniky

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

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

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

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

20. Projekt Domácí mediotéka

Abstraktní třída a rozhraní

Jazyk C# (seminář 6)

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

Teoretické minimum z PJV

Projekty pro výuku programování v jazyce Java

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

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

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

Programovací jazyk Java

NPRG031 Programování II --- 2/2 Z, Zk

Návrhové vzory OMO, LS 2014/2015

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

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

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Název předmětu: Školní rok: Forma studia: Studijní obory: Ročník: Semestr: Typ předmětu: Rozsah a zakončení předmětu:

7.5 Diagram tříd pokročilé techniky

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

PŘETĚŽOVÁNÍ OPERÁTORŮ

Objektově orientované programování

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

9. přednáška - třídy, objekty

Objektově orientovaný přístup

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

Jazyk C# (seminář 3)

Řídicí struktury. alg3 1

Ukazka knihy z internetoveho knihkupectvi

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

Objektové programování

9. Polymorfismus a rozhraní

Programování v jazyce JavaScript

Programování v Javě I. Leden 2008

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

Algoritmizace a programování. Terminálový vstup a výstup

Programování v Javě I. Únor 2009

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

PHP framework Nette. Kapitola Úvod. 1.2 Architektura Nette

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Programování II. Dědičnost změna chování 2018/19

Vyřešené teoretické otázky do OOP ( )

DTP Základy programování Úvod do předmětu

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

TÉMATICKÝ OKRUH Softwarové inženýrství

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

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

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

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

Sdílení dat mezi podprogramy

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

Transkript:

PROGRAMOVACÍ STYLY A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Pár odpovědí od zkoušky PR1 Otázka: Jak spolu souvisí pojem třídy a objektu? Odpověď: Objekty patří do třídy Otázka: Vysvětlete pojem přetížené metody? Odpověď: Nadřízenou metodou je chlapec, ale metoda sdělí, že je děvče. Otázka: Vysvětlete pojem asymptotické složitosti algoritmu? Odpověď: Sleduje se, jak se algoritmus chová na přidávaní vstupních dat. Otázka: Jakým způsobem se předávají parametry metodám? Odpověď: Parametry primitivního typu se předávají jednotlivě, parametry referenčního typu se jich předá více. 2

Úvod 3

Kdo je kdo v Programování 2 1. Studenti, absolventi předmětu Programování 1 Pro studenty OI paralelně předmět Algoritmizace 2. Přednášející: Doc.Ing. Jelínek Ivan, CSc. 3. Nejdůležitější učitelé: cvičící!! Ing. M. Balík Ing. Z. Buk Ing. M. Mudroch Ing. J. Šedivý, CSc. Ing. Ondřej Hrstka Proč asi?? Garant: Doc.Ing. Jelínek Ivan CSc. 4

Cíl předmětu Programování 2 Předmět navazuje na Programování 1 a klade si za cíl naučit studenty vytvořit objektově aplikaci s grafickým uživatelským rozhraním se znalostí témat: objektový návrh polymorfismus, zpracovaní události, princip mechanismu výjimky, GUI aplety, kolekce vlákna, Dále je student seznámen s jazykem C (student bude schopen programy v jazyku C analyzovat): komparativní výklad jazyka C, struktura programu funkce a parametry pointery dynamická správa paměti 5

Organizace předmětu A0B36PR2 Programování 2 Rozsah: 2p+2c Zakončení Z,ZK Kredity 6 po prvním roce je nutné získat alespoň 30! výsledná známka ovlivní možnost tvorby rozvrhu ve 3. semestru https://edux.feld.cvut.cz/courses/a0b36pr2 6

Osnova přednášek 1. Programovací styly. Třída, dědičnost, zapouzdření, polymorfismus, abstraktní třída, 2. Objektově orientovaný přístup. Rozhraní, rozhraní jako typ proměnné, rozhraní a dědičnost, typ interface, výčtové typy 3. Výjimky, princip mechanismu zpracování výjimek, kompletní zpracování výjimek, vyhození výjimky, propagace výjimek, vlastní výjimky, hierarchie výjimek, kontrolované a nekontrolované výjimky, 4. Kontejnery, použití knihoven seznamů, množin, map v jazyce Java, generika 5. Grafické uživatelské rozhraní (GUI) v jazyce Java, typy komunikace, knihovny AWT a SWING, princip GUI, komponenty, kontejnery, správce rozmístění, obsluha událostí, aplety, vlastnosti, způsob aktivace, životní cyklus apletu, předávání parametrů do apletu, 6. Události jako objekt, zpracování události, zdroj události, posluchač události, model šíření události, model šíření událostí, zpracování vlastní události, více zdrojů a posluchačů, rozlišení zdrojů, 7. Vlákna, vícevláknový program, deadlock a řešení, synchronizace vláken 8. Základy programovaní v C, charakteristika jazyka, model kompilace, struktura programu, základní vstup a výstup, syntaxe jazyka, 9. Komparativní výklad jazyka C k jazyku Java, příklad programu, makra, podmíněný překlad, pole a pointery I 10. Funkce a parametry v C, dynamická správa paměti, funkce a pointery II 11. Systematické programování v C, preprocesor, základní knihovny, struktury, uniony, výčtové typy 12. Technologie tvorby SW 13. Soutěž nejlepších semestrálních prací 7

Osnova cvičení 1. Úvodní test, zopakování základů programování a objektového přístupu, zadání semestrální práce 2. Polymorfismus, abstraktní třída, rozhraní 3. Objektově orientovaný přístup 4. Zpracování výjimek 5. Kolekce, enum a generika 6. Grafické uživatelské rozhraní, aplety 7. Zpracování událostí 8. Vlákna, síťování 9. Test z Javy. Základy programovaní v C, preprocesor 10. Systematické programování v C, knihovny, string, pole 11. Funkce v C, parametry, správa paměti, struct 12. Pointery v C, pointery na funkce, volání C z Javy 13. Obhajoba semestrálních prací Test a zápočet 14. Rezerva 8

Hodnocení a zkouška Zdroje bodů pro hodnocení Body 4. domácí úkoly po 10 bodech 40 b (min. 20 b) semestrální práce 35 b (min. 15 b) test na cvičeních 10 b (min. 5 b) písemný zkouškový test 15 b (min. 10 b) Ústní zkouška 20 b (-10b pokud k ústní) Body ze cvičení, maximálně 85, při 75 a více bodech ze cvičení prémiový test a bez zkoušky: A, B, C Klasifikace na základě bodového hodnocení) klasifikace počet bodů číselně slovně A >90 1 výborně B >80 1,5 velmi dobře C >70 2 dobře D >60 2,5 uspokojivě Možnost nechat si zapsat známku nebo jít k ústní zkoušce odečte se 10 bodů E >50 3 dostatečně F 4 nedostatečně Minimum bodů k zápočtu 40 9

Doporučená literatura Základní zdroje: Poznámky z přednášek a cvičení Základní příručky jazyka Java: Zakhour, S: Java 6, výukový kurz, CPress, Brno, 2007 Darwin, Ian F.: Java, kuchařka programátora, Computer Press, 2006 Herout, P.: JAVA, grafické uživatelské prostředí a čeština, Kopp, 2001 Herout, P.: JAVA, Bohatství knihoven, Kopp, 2006 Pecinovský, R.: Java 5.0, Novinky a upgrade aplikací, Computer Press, 2005 Herout, P.: Učebnice jazyka Java, Kopp, 2007 Keogh, J.:Java bez předchozích znalostí, Computer Press, 2005 Základní příručky jazyka C: Mueldner, T.: C for Java programmers, Addison Wesley, 2000 Kernighan, B.W.-Ritchie, D.M.: Programovací jazyk C. Computer Press, Herout, P.: Učebnice jazyka C. III. vyd. Kopp, Č.Budějovice, 2002. Další zdroje (publikace v češtině): Eckel, B.: Myslíme v jazyku Java, Grada, 2000, I + II Chapman, S., J.: Začínáme programovat v jazyce JAVA, Computer Press, 2001 Hawlitzek, JAVA2, příručka programátora, Grada, 2000 Shildt, H.: Java 2, Příručka programátora, Softpress, 2001 10

Začínáme 11

Předpokládané znalosti, např. Co rozumíte řídícími strukturami? Jak se předávají parametry? Jaké znáte referenční typy? Co je to implicitní konstruktor? K čemu slouží operátor this, super? Rozdíl mezi metodami třídy a instančními metodami? Co rozumíte zapouzdřením? Jaký je princip dědičnosti? Co to je kompozice objektů? 12

Programovací jazyky a programovací styly Programovací jazyky deklarativní imperativní Programovací styly Naivní Procedurální Objektově orientovaný Návrhové vzory - speciální přednáška http://objekty.vse.cz/objekty/vzory-uvod#copred Rudolf Pecinovský: Návrhové vzory 33 vzorových postupů pro objektové programování, Computer Press, 2007 SOA - service-oriented architecture 13

Deklarativní programovací jazyky nepopisují jak něco udělat popisují co má být výsledkem HTML (HyperText Markup Language) specifikuje, jak má stránka vypadat (font - typ, velikost, barva, nadpis), ale nepopisuje, jakým způsobem se má stránka na daném počítači zobrazit Prolog Nepopisuje kroky výpočtu, ale: Dodají se fakta o problému databázi znalostí Sformuluje se požadovaný dotaz cíl, který lze možná odvodit 14

Příklad HTML kódu <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>super stránka</title> </head> <body> <h1>nadpis</h1> Obsah: <ol> <li>úvod</li> <li>závěr</li> </ol> </body> </html> 15

Fakta rodic(jana,petr). rodic(petr,eva). dite(x,y) :- rodic(y,x). predek(x,y) :- rodic(x,y). Příklad PROLOG predek(x,y) :- rodic(x,z), predek(z,y). Dotaz a odpověď?- rodic(x,petr). X = jana ; No?- dite(x,jana). X = petr ; No?- predek(jana,eva). Yes 16

Programovací styly - příklad Na příkladu programu simulujícího čítač si ukážeme programovací styly Stav čítače: hodn: 24 Čítač Zvětšit + Zmenšit - Nastavit Konec 17

Programovací styly - příklad Stav čítače po stisku Zvětšit hodn: 25 Čítač Zvětšit + Zmenšit - Nastavit Konec 18

Programovací styly - příklad Stav čítače po stisku Zmenšit hodn: 24 Čítač Zvětšit + Zmenšit - Nastavit Konec 19

Programovací styly - příklad Stav čítače po stisku Nastavit hodn: 0 Čítač Zvětšit + Zmenšit - Nastavit Konec 20

Programovací styly - příklad Stav čítače po stisku Konec Čítač Zvětšit + Zmenšit - Nastavit Konec 21

Programovací styly příklad, realizace Příklad komunikace programu (textově): Hodnota = 24 1 0) Konec 1) Zvětšit 2) Zmenšit 3) Nastavit Vase volba: Hodnota = 25 0) Konec 1) Zvětšit 2) Zmenšit 3) Nastavit Vase volba: 2 Hodnota = 24. 22

Naivní styl Jednoduché úlohy lze řešit přímočaře, vše implementováno v jedné třídě: public class CitacNaivni{ final static int pochodn = 0; static int hodn, volba; public static void main(string[] args) { Scanner sc = new Scanner(System.in); hodn = pochodn; do { System.out.println("Hodnota = "+hodn); System.out.println("0) Konec\n1) Zvětšit\n2 Zmenšit\n3) Nastavit"); System.out.print("Vaše volba: "); volba = sc.nextint(); switch (volba) { case 0: break; case 1: hodn++; break; case 2: hodn--; break; case 3: hodn = pochodn; break; default: System.out.println("Nedovolená volba"); while (volba>0); System.out.println("Konec"); 23

Připomeňme hlavní zásady: Procedurální styl Zadaný problém se snažíme rozložit na podproblémy Pro řešení podproblémů zavádíme abstraktní příkazy, které nejprve specifikujeme a pak realizujeme pomocí procedur a funkcí Aplikace na čítač - dva dílčí podproblémy: 1. provedení požadované operace s čítačem static void operace(int op) 2. komunikace s uživatelem, jejímž výsledkem je kód požadované operace static int menu() 24

Procedurální styl operace s čítačem public class CitacProceduralni { final static int pochodn = 0; static int hodn; static void operace(int op) { switch (op) { case 1: hodn++; break; case 2: hodn--; break; case 3: hodn = pochodn; break; 25

Procedurální styl - komunikace static int menu() { Scanner sc = new Scanner(System.in); int volba; do { System.out.println("0. Konec"); System.out.println("1. Zvětšit"); System.out.println("2. Zmenšit"); System.out.println("3. Nastavit"); System.out.print("Vaše volba: "); volba = sc.nextint(); if (volba<0 volba >3) { System.out.println("Nedovolená volba"); volba = -1; while (volba<0); return volba; 26

Procedurální styl main public static void main(string[] args) { int volba; hodn = pochodn; do { System.out.println("Hodnota = "+hodn); volba = menu(); if (volba>0) operace(volba); while (volba>0); System.out.println("Konec"); Poznámky: procedurální řešení čítače (nelokální proměnná pro hodnotu + nelokální konstanta udávající počáteční hodnotu) je nedokonalé (proč?) čítač je typ, pro který jsou definovány určité operace (realizovatelné procedurami a funkcemi) a jehož implementace (proměnná pro hodnotu) by neměla být volně přístupná pro realizaci čítače je vhodnější objektově orientovaný styl Připomenutí 27

Principy objektového programování Realita je modelována koncepty, třídami Třídy mohou generovat objekty, instance třídy, konstruktorem Objekty jsou charakterizovány svými vlastnostmi, individuálními hodnotami a společnými metodami Chod programu je tvořen vykonáváním metod jednotlivých objektů (zasílání zpráv) Metody jsou určeny svým rozhraním, mohou být přetíženy Třídy mohou vytvářet hierarchie, v Javě pouze jedna nadřízená třída, podřízená třída specializace nadřízené Třídy mohou být tvořeny i kompozicí jiných tříd Vlastnosti a metody objektů jsou zapouzdřené podle potřeby Metody objektů, použitelné na různé objekty, pracují podle aktuálního objektu princip polymorfismu Polymorfismus lze implementovat v Javě pomocí abstract class (hierarchie tříd) nebo interface (vnucené metody) 28

Hlavní zásady: Objektově orientovaný styl Při rozkladu problému specifikujeme nové datové typy (datové abstrakce), tzn. specifikujeme operace, které se budou s daty těchto typů provádět Pro realizaci datových abstrakcí použijeme objekty a třídy Připomeňme si charakteristiku objektu: datové položky a metody objektu jsou dány typem objektu - třídou objekt se může nacházet v různých stavech daných hodnotami datových položek (atributů) objektu chování objektu je dáno metodami (operacemi), které jsou pro něj definovány 29

Třídy a objekty - připomenutí Třída popisující nový datový typ obsahuje: deklarace položek, ze kterých se skládají objekty daného typu deklaraci konstruktoru, kterým se inicializují vytvořené objekty deklarace metod, které realizují operace s objekty Položky se obvykle deklarují tak, aby nebyly z vnějšku objektu přístupné: private typ jméno; Konstruktor je inicializační operace, která má jméno třídy a nevrací žádnou hodnotu; schéma deklarace konstruktoru třídy T (konstruktor by měl být z vnějšku přístupný!! ): public T(specifikace parametrů) { tělo konstruktoru Ve třídě může být deklarováno několik konstruktorů, které se liší počtem a/nebo typy parametrů (přetěžování) Obvyklé schéma deklarace metody (přístupnost metody je dána logikou problému): public typ jméno(specifikace parametrů) { tělo metody Opakování 30

Dědičnost: Dědičnost ISA vztah (Peter is a student. Auto je dopravní prostředek.) Vztah nadtřída podtřída, předek potomek Předek shromažďuje společné vlastnosti a předepisuje či implementuje chování Kompozice HAS vztah (A car has an engine - Auto má motor) Viz přednášky v PR1 sředitelem a datem narození Viz přednášky v PR1 s obdélníkem a kvádrem A0B36PR2-201 Opakování 31

Zapouzdření Metody Data Metody A0B36PR2-201 Připomenutí 32

Čítač jako datový typ Čítač zavedeme jako datový typ s operacemi zvetsit, zmensit, nastavit a hodnota a s datovými položkami hodn a pochodn Grafické vyjádření: Citac hodn pochodn zvetsit() zmensit() nastavit() hodnota() název typu datové položky operace (metody) Poznámka: hodnota položky pochodn bude stanovena při vytvoření objektu 33

Třída Citac public class Citac { private int hodn; private int pochodn; public Citac(int ph) { pochodn = ph; hodn = ph; public void zvetsit() {hodn++; public void zmensit() {hodn--; public void nastavit() {hodn = pochodn; public int hodnota() {return hodn; 34

Použití čítače jako objektu public static void main(string[] args) { int volba; Citac citac = new Citac(0); // Citac citac1 = new Citac(3); do { System.out.println("Hodnota = "+citac.hodnota()); volba = menu(); switch (volba) { case 1: citac.zvetsit(); break; case 2: citac.zmensit(); break; case 3: citac.nastavit(); break; // case 4: System.out.println("nic"); break; while (volba>0); System.out.println("Konec"); 35

Třída CitacModulo, dědění CitacModulo hodn pochodn zvetsit() zmensit() nastavit() hodnota() název typu datové položky operace (metody) 36

Třída CitacModulo, dědění public class CitacModulo extends Citac { public CitacModulo(int ph) { super(ph); @Override public void zvetsit() { System.out.println(" " + hodn % 5); hodn++; hodn = ((hodn % 5) == 0)? pochodn : hodn; 37

Menu jako datový typ Menu zavedeme jako datový typ s operacemi vyber() a volba() a s datovými položkami prvky, vyzva a volba Grafické vyjádření: Menu prvky vyzva volba vyber() volba() 38

Třída Menu public class Menu { String[] prvky; String vyzva; private int volba; public Menu(String[] prvky, String vyzva) { this.prvky = prvky; this.vyzva = vyzva; public int vyber() { Scanner sc = new Scanner(System.in); do { for (int i=0; i<prvky.length; i++) System.out.println(prvky[i]); System.out.print(vyzva); volba = sc.nextint(); if (volba<0 volba>=prvky.length) { System.out.println("Nedovolená volba"); volba = -1; while (volba<0); return volba; public int volba() { return volba; 39

Čítač a Menu jako objekt public class Citac_Test_Objekt_Menu public static void main(string[] args) { String[] nabidka = { "0) Konec", "1) Zvětšit", "2) Zmenšit", "3) Nastavit" ; Citac citac = new Citac(0); Menu menu = new Menu(nabidka, "Vaše volba: "); do { System.out.println("Hodnota = "+citac.hodnota()); switch (menu.vyber()) { case 1: citac.zvetsit(); break; case 2: citac.zmensit(); break; case 3: citac.nastavit(); break; while (menu.volba()!=0); System.out.println("Konec"); 40

Třída MenuX jako potomek třídy Menu - dědění 1. zdědí od třídy Menu: všechny datové položky private String[] prvky; private String vyzva; private int volba; všechny metody public int vyber(); 2. přidá public int volba(); datovou položku vytváření menu libovolné délky private int pocetprvku, volny; metody přidávání položky menu pridejpolozkudomenu(string s) zadání libovolné výzvy pridejvyzvu(string s) 41

Třída MenuX jako potomek třídy Menu vytváření menu libovolné délky (pocetprvku + volny) přidávání jednotlivé položky menu (pridejpolozkudomenu(string s)) zadání libovolné výzvy (pridejvyzvu(string s)) MenuX prvky vyzva volba pocetprvku volny vyber() volba() pridejpolozkudomenu(string s) pridejvyzvu(string s) 42

Třída MenuX jako potomek Menu class MenuX extends Menu{ //private String[] prvky; //private String vyzva; //private int volba; // public int vyber() { // public int volba() { private int pocetprvku; private int volny=0; public MenuX(String[] prvky, String vyzva,int pocet) { super(prvky, vyzva); this.pocetprvku = pocet; public void pridejpolozkudomenu(string s){ if (volny < pocetprvku)prvky[volny++]=s; public void pridejvyzvu(string s){ vyzva=s; 43

Třída Čítač 5 public class Citac_Test_MenuX { public static void main(string[] args) { Citac citac = new Citac(0); String[] nabidka = new String[6]; MenuX menu = new MenuX(nabidka, "Vaše volba: ", 6); menu.pridejpolozkudomenu("0) Konec"); menu.pridejpolozkudomenu("1) Zvětšit"); menu.pridejpolozkudomenu("2) Zmenšit"); menu.pridejpolozkudomenu("3) Nastavit"); menu.pridejpolozkudomenu("4) nove"); menu.pridejpolozkudomenu("5) XXX"); menu.pridejvyzvu("vaše volba: "); do { System.out.println("Hodnota = "+citac.hodnota()); switch (menu.vyber()) { case 1: citac.zvetsit(); break; case 2: citac.zmensit(); break; case 3: citac.nastavit(); break; case 4: System.out.println("nic"); break; while (menu.volba()!=0); System.out.println("Konec"); 44

Třída CitacGUI Vybudován s využitím knihovny SWING viz příslušná přednáška Řešení viz příklady 45

Pojmenované konstanty Výčtové typy (>=Java 5 ) Konečný malý počet konstant, nezáleží na jejich reprezentaci Pro jeden účel, konstanty spolu souvisí Možnost konstanty parametrizovat Typové zabezpečení Syntaxe: Seznam jednotlivých hodnot daného typu je je možno definovat jejich prostým výčtem, např.: enum Den {PO, UT, ST, CT, PA, SO, NE; Výčet proměnných konstant obsahujících i parametry viz dále předávané konstruktoru za název deklarované proměnné seznam parametrů třeba definovat konstruktor A0B36PR2-2 46

Výčtové typy Výčtové typy jsou speciální třídy zavedené pro větší bezpečí a pohodlí, v nejjednodušší variantě se definují pomocí seznamu konstant daného typu (příklad): enum Den {SUN, MON, TUE, WED, THU, FRI, SAT; mají ordinální čísla 0.. 6. Vypíší se takto: for ( Den d : Den.values( ) ) System.out.println( d.ordinal( )+ " " +d.name( ) ); for (<Typ> <parametr> :<kontejner>) Iterátor, viz kolekce 7. přednáška.values( ) vrací pole konstant.name( ) A0B36PR2-2 vrací odkaz na konstantu 0 SUN 1 MON 2 TUE 3 WED 4 THU 5 FRI 6 SAT 47

Den d = Den.MON; Výčtové typy A0B36PR2-2 switch (d) { case SAT: System.out.println(" sat"); break; case SUN: System.out.println(" sun"); break; case MON: System.out.println(" No work"); break; // No work case FRI: System.out.println(" Partial work "); break; // Partial work default: System.out.println(" work"); break; // Work No work 48

Výčtové typy s atributy Každá výčtová konstanta je objektem svého výčtového typu To dává prvkům enum možnost přiřadit k výčtovým konstantám i další statické atributy Lze atributy použít k rozvinutí informace o výčtové konstantě Výčtové konstanty s atributy se vyvářejí konstrutory třídy enum, nestačí pouhé vyjmenování Přístup k atributům přes tečka notaci K výčtu můžeme běžně přidávat metody apod.

Výčtové typy s atributy public enum Day { SUN ( "Sunday", "dimanche", new Point(0,0) ), MON ( "Monday", "lundi", new Point(1,0) ), TUE ( "Tuesday", "mardi", new Point(2,0) ), WED ( "Wednesday", "mercoledi", new Point(3,0) ), THU ( "Thursday", "jeudi", new Point(4,0) ), FRI ( "Friday", "vendredi", new Point(5,0) ), SAT ( "Saturday", "samedi", new Point(6,0) ), ; String en; String fr; Point where; private Day( String en, String fr, Point where ) { this.en=en; this.fr=fr; this.where = where; Konstruktor je private A0B36PR2-2 50

Výčtové typy s atributy System.out.println("Streda ve zkratce " + Day.WED + " anglicky je " + Day.WED.en + " a francouzky je " + Day.WED.fr); for (Day d : Day.values()) { System.out.println(d.ordinal() + " " + d.name() + " angl." + d.en + " \tfr." + d.fr ); Streda ve zkratce WED anglicky je Wednesday a francouzky je mercoledi 0 SUN angl.sunday fr.dimanche 1 MON angl.monday fr.lundi 2 TUE angl.tuesday fr.mardi 3 WED angl.wednesday fr.mercoledi 4 THU angl.thursday fr.jeudi 5 FRI angl.friday fr.vendredi 6 SAT angl.saturday fr.samedi A0B36PR2-2 51

Výčtové typy s atributy a metodami public enum Month { JAN(31,5), FEB(-1,3) { @Override public int days(int yy) { pro únor přepsáno return yy % 4 == 0? 29 : 28;, MAR(31,3), APR(30,3), MAY(31,3), JUN(30,5), JUL(31,3), AUG(31,1), SEP(30,5), OCT(31,4), NOV(30,5), DEC(31,3); private final int days; // hidden private final int ds; // hidden private Month(int days, int ds) { this.days = days; this.ds = ds; // konstructor public int days(int year) { return days; public int ds(int year) { return ds; public static int totaldays(int year) { return year % 4 == 0? 366 : 365; FEB má zastíněnou metodu days, speciální chování A0B36PR2-2 52

Balíky (package) a přístupová práva Specifikátor Táž třída Jiná třída téhož balíku V podtřítě téhož balíku V podtřídě jiného balíku V jiné třídě jiného baliku private Ano Ano Ano Ano protected Ano Ano Ano ano public Ano Ano Ano Ano Ano

Balíky (package) a přístupová práva Platí pro proměnné, konstanty, metody, třídy: Private Autorizovaný přístup, zapouzdření Přístup jen na jeden balík Protected Z libovolné třídy téhož balíku a z odvozené třídy, public Porušený autorizovaný přístup, může se ke všemu

55