Projekt Škola strana 179

Podobné dokumenty
Výčtový typ strana 67

15. Projekt Kalkulačka

20. Projekt Domácí mediotéka

17. Projekt Trojúhelníky

Projekt Obrázek strana 135

19. Projekt Adventura

9. Polymorfismus a rozhraní

7. Dynamické datové struktury

typová konverze typová inference

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

Java - řazení objektů

Více o konstruktorech a destruktorech

boolean hasnext() Object next() void remove() Kolekce

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

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

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

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

KTE / ZPE Informační technologie

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

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

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

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

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

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

Abstraktní datové typy: zásobník

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

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

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

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Obrázek. Základní popis, zadání úkolu. Struktura tříd,

11. Dědičnost. Dědičnost strana 103

Mělká a hluboká kopie

Konstruktory a destruktory

1. Téma 12 - Textové soubory a výjimky

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

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

Úvod do programovacích jazyků (Java)

Generické programování

Abstraktní třída a rozhraní

1. Projekt Kalkulačka

Principy objektově orientovaného programování

Seminář Java II p.1/43

Datové struktury strana 81

Dalším příkladem může být například výstup dat na různá zařízení, souborů, grafických rozhraní, sítě atd.

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

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

Typický prvek kolekce pro české řazení

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

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

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

Vytváření a použití knihoven tříd

1. Programování proti rozhraní

Dědění, polymorfismus

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

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

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

Seminář Java IV p.1/38

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

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

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

Algoritmizace a programování

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

Základy objektové orientace I. Únor 2010

Abstraktní datové typy

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.

1. Dědičnost a polymorfismus

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

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

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

návrhový vzor Singleton.

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

Unity a Objekty (NMIN102) RNDr. Michal Žemlička, Ph.D.

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

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

"Václav Klaus". public class Clovek { protected String jmeno; protected int roknarozeni; public Clovek(String j, int rn) {

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

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

Jazyk C# (seminář 6)

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

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

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

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

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

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

OOPR_05. Případové studie

Spojová implementace lineárních datových struktur

Programovací jazyk Java

Teoretické minimum z PJV

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

7. Datové typy v Javě

Testy z Javy verze 1.0 Stránka 1 z 13

Objektově orientované programování v jazyce Python

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

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

Další příklady. Katedra softwarového inženýrství. Katedra teoretické informatiky, Fakulta informačních technologii, ČVUT v Praze. Karel Müller, 2011

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

PREPROCESOR POKRAČOVÁNÍ

Jazyk C# a platforma.net

Transkript:

Projekt Škola strana 179 18. Projekt Škola 18.1. Základní popis, zadání úkolu Pracujeme na projektu Škola, který je ke stažení na java.vse.cz. Je to pouze fragment aplikace cílem je ukázat, jak v instancích zachytit stromovou strukturu. Po dokončení inicializace aplikace se vytvoří instance třídy Skola. Po zavolání metody vypis() by se na obrazovku měla vypsat organizační struktura školy (variantně s pracovníky či bez pracovníků). V tomto projektu budeme řešit tyto úkoly: navrhnout datové atributy ve třídě Utvar pro uložení podřízených útvarů a osob pracujících v útvaru, doplnit obsah metod pridej() ve třídě Utvar, vypsat seznamu podřízených útvarů, tj. doplnit obsah metod vypis() ve třídě Utvar. Tento projekt má následující cíle: ukázat vytvoření složitější datové struktury v tomto projektu se vytvoří stromová struktura instancí (organizační struktura školy). Projekt též ukazuje rozdíly mezi strukturou tříd a strukturou instancí. ukázat přetěžování metod na metodě pridej(). 18.2. Struktura tříd Projekt Škola se skládá s následujících tříd (obrázek z BlueJ): Obrázek 18.1 Diagram tříd projektu Škola převzatý z BlueJ

Projekt Škola strana 180 Obrázek 18.2 Diagram tříd projektu Škola včetně datových atributů a metod 18.3. Popis kódu třídy Skola Třída Skola je hlavní třídou, ve které se vytvářejí zkušební data. Třída dále obsahuje metodu vypis(), přes kterou se vypisuje organizační struktura. V konstruktoru třídy Skola se vytvářejí jednotlivé testovací instance třídy Utvar a Osoba a vzájemně se spojují mezi sebou. 1 /** 2 * Tato třída je součástí projektu Skola a obsahuje základní 3 * třídu pro školu. V konstruktoru je i inicializace 4 * organizační struktury školy. 5 * 6 * @author Luboš Pavlíček 7 * @version 1.0, srpen 2004 8 */ 9 public class Skola { 10 11 private Utvar skola; 12 /** 13 * Konstruktor pro instance třídy Skola. Vytvářejí se 14 * instance tříd Utvar a Osoba, které se propojují do sebe. 15 */ 16 public Skola() { 17 skola = new Utvar("VŠE","Vysoká škola ekonomická"); 18 Utvar fak1 = new Utvar("F1","Fakulta financí a účetnictví"); 19 Utvar fak2 = new Utvar("F2","Fakulta mezinárodních vztahů"); 20 Utvar fak3 = new Utvar("F3","Fakulta podnikohospodářská");

Projekt Škola strana 181 21 Utvar fak4 = new Utvar("F4", 22 "Fakulta informatiky a statistiky"); 23 Utvar fak5 = new Utvar("F5","Fakulta národohospodářská"); 24 Utvar fak6 = new Utvar("F6","Fakulta managementu"); 25 skola.pridej(fak1); 26 skola.pridej(fak2); 27 skola.pridej(fak3); 28 skola.pridej(fak4); 29 skola.pridej(fak5); 30 skola.pridej(fak6); 31 fak4.pridej(new Utvar("KMAT","katedra matematiky")); 32 Utvar kstp = new Utvar("KSTP","katedra statistiky a pravděpodobnosti"); 33 fak4.pridej(new Utvar("KEST", 34 "katedra ekonomické statistiky")); 35 fak4.pridej(new Utvar("KDEM","katedra demografie")); 36 fak4.pridej(new Utvar("KEKO","katedra ekonometrie")); 37 fak4.pridej(new Utvar("KSA","katedra systémové analýzy")); 38 fak4.pridej(new Utvar("KIZI", 39 "katedra informačního a znalostního inženýrství")); 40 fak4.pridej(new Utvar("KFIL","katedra filosofie")); 41 Utvar kit = new Utvar("KIT", 42 "katedra informačních technologii"); 43 fak4.pridej(kit); 44 fak4.pridej(kstp); 45 skola.pridej(new Osoba("Durčáková Jaroslava", "Doc. Ing.", 46 "CSc.")); 47 Osoba dekan = new Osoba ("Hindls Richard", "Prof. Ing.", 48 "CSc."); 49 fak4.pridej(dekan); 50 kstp.pridej(dekan); 51 kit.pridej(new Osoba("Voříšek Jiří","Prof. Ing.", "CSc.")); 52 kit.pridej(new Osoba("Buchalcevová Alena", "Ing.","PhD.")); 53 kit.pridej(new Osoba("Pavlíčková Jarmila", "Ing.","")); 54 kit.pridej(new Osoba("Pavlíček Luboš","Ing.","")); 55 kit.pridej(new Osoba("Tichý Vladimír", "RNDr.","")); 56 57 /** 58 * Metoda vypíše organizační strukturu 59 * 60 * @param vcetneosob zda vypsat i osoby přiřazené do 61 * jednotlivých útvarů 62 */ 63 public void vypis(boolean vcetneosob) { 64 skola.vypis(vcetneosob); 65 66 18.4. Popis kódu tříd Utvar a Osoba Nebudeme zde uvádět kód tříd Utvar a Osoba, neboť jsou jednoduché. Třída Osoba popisující jednu osobu má tři datové atributy jmeno, titulpred a titulza, které se inicializují přes konstruktor. Třída Osoba dále obsahuje metody pro získání hodnot těchto atributů a metody tostring(), equals() a hashcode(). Třída Utvar, která představuje jeden útvar z organizační struktury má dva datové atributy nazev a zkratka, které se inicializují přes konstruktor. Vedle metod pro získání těchto datových atributů má

Projekt Škola strana 182 metody equals() a hashcode(). Dále třída obsahuje hlavičky metod pridej() pro vložení podřízených útvarů a pracovníků útvaru a hlavičku metody vypis() pro vypsání označení útvaru, pracovníků útvaru a podřízených útvarů. Úkolem je doplnit do této třídy datové atributy pro uložení podřízených útvarů a pracovníků útvaru a dokončit metody pridej() a vypis(). 18.5. Postup řešení 18.5.1. Deklarace datových atributů a vkládání instancí Pro uložení podřízených útvarů můžeme použít: seznam (List), množinu (Set), mapu (Map), pole (Array). Vzhledem k tomu, že podřízené útvary by měly být jedinečné, odpovídá nejlépe množina. Je splněna i podmínka pro použití množin třída Utvar má implementovány metody equals() a hashcode(). Z implementací množiny použijeme nejrychlejší HashSet. V deklaraci nadefinujeme datový atribut jako typ Collection, neboť nepotřebujeme používat speciální metody množiny a použití tohoto typu nám umožňuje v budoucnosti snadnou změnu implementace. Pro ukládání pracovníků útvaru též použijeme množinu (třída Osoba má též implementovány metody equals() a hashcode()). Následuje deklarace datových atributů a konstruktor třídy Utvar: private String nazev; private String zkratka; private Collection <Utvar> podrizene; private Collection <Osoba> pracovnici; public Utvar(String zkratka, String nazev) { this.zkratka = zkratka; this.nazev = nazev; podrizene = new HashSet <Utvar>(); pracovnici = new HashSet <Osoba>(); Pro vkládání podřízených útvarů a pracovníků útvaru se doplní předpřipravené metody pridej(): public void pridej (Osoba osoba) { pracovnici.add(osoba); public void pridej (Utvar utvar) { podrizene.add(utvar); Všimněte si, že jsou zde dvě metody stejného jména s různým typem parametrů. Jedná se o tzv. přetížení metod. Volba správné metody se provádí na základě typu parametru. Podívejte se na kód konstruktoru třídy Skola zde to vypadá, že se používá stejná metoda pro přidání jak podřízených útvarů, tak pracovníků útvaru. Přetěžování metod zjednodušuje psaní kódu na straně používání metod i částečně na straně třídy, která metodu poskytuje (přijímá zprávy). Následující diagram zobrazuje vztahy mezi instancí třídy Skola a instancemi třídy Utvar. Z diagramu je zřejmé, že jsme vytvořili stromovou strukturu instancí. Z důvodů přehlednosti nejsou do diagramu začleněny instance třídy Osoba jejich doplnění by pro čtenáře neměl být problém (nezapomeňte, že na instanci Prof. Hindlse budou dva odkazy jednou z fakulty F4, podruhé z útvaru KSTP).

Projekt Škola strana 183 Obrázek 18.3 Diagram zobrazuje vztahy mezi instancí třídy Skola a instancemi třídy Utvar 18.5.2. Výpis organizační struktury V první verzi metody vypis() ve třídě Utvar se nejdříve vypíše zkratka a jméno útvaru a poté se postupně volá metoda vypis() pro všechny podřízené útvary (aby se vypsala jména všech podřízených útvarů). Pokud podřízený útvar má opět podřízené útvary (fakulta má katedry), tak se opět vypisují jejich jména. public void vypis(boolean vcetneosob) { System.out.println(zkratka+" - " + nazev); for (Utvar utvar : podrizene) { utvar.vypis(vcetneosob);

Projekt Škola strana 184 Obrázek 18.4 Výpis organizační struktury pomocí první verze metody vypis() Když si nyní vytvoříme instanci třídy Skola a zavoláme metodu vypis(), bude vypsaná organizační struktura vypadat podobně jako na obrázku 18.4. Výsledek má dva nedostatky: útvary se nevypisují setříděně (nejlépe dle abecedy), nejsou vidět úrovně organizační struktury je potřeba vhodně doplnit odsazování. Obrázek 18.5 Schématické znázornění volání metod vypis() u jednotlivých instancí v situaci, kdy by v aplikaci byly dvě fakulty a dvě katedry 18.5.3. Setřídění výpisu Problém se tříděním lze vyřešit několika způsoby. My si zde popíšeme nejjednodušší pro uložení instancí podřízených útvarů se použije třída TreeSet(), která automaticky třídí uložené instance.

Projekt Škola strana 185 Předpokladem pro použití této třídy je však implementace rozhraní Comparable u objektů, které se mají vkládat do této datové struktury. Hlavičku třídy Utvar je potřeba proto rozšířit o implementaci rozhraní: public class Utvar implements Comparable <Utvar> { Rozhraní Comparable vyžaduje, aby třída obsahovala metodu public int compareto(utvar druhy) která vrací kladnou hodnotu, pokud aktuální objekt má být zařazen před objekt zadaný jako parametr, nulu, pokud na pořadí nezáleží (tj. je jedno, v jakém pořadí budou), zápornou hodnotu, pokud aktuální objekt má být zařazen za objekt zadaný jako parametr. Metoda compareto() by mohla vypadat následovně 38 : public int compareto(utvar druhy) { return zkratka.compareto(druhy.zkratka); Třídit se bude dle zkratky využije se metody compareto() ve třídě String. Vlastní změna z dynamické struktury HashSet na TreeSet je triviální úprava v konstruktoru třídy Utvar (nezapomeňte doplnit import java.util.treeset): podrizene = new TreeSet <Utvar>(); Pro setřídění osob v útvaru je potřeba též implementovat rozhraní Comparable ve třídě Osoba a u datového atributu pracovnici použít implementaci TreeSet. Pokud by jste ukládali útvary či osoby do seznamu (List), tak je možné tento seznam setřídit pomocí Collections.sort(pracovniciList); Opětně je předpokladem, že objekty vložené do seznamu implementují rozhraní Comparable. Statická metoda Collections.sort() nemůže třídit množiny (implementace Set). 18.5.4. Zvýraznění organizační struktury (odsazování) Odsazování je složitější abychom věděli, o kolik by se měl název konkrétního útvaru odsunout, potřebujeme vědět, na jaké úrovni řízení příslušný útvar je (na nulté úrovni je celá škola, na první úrovni fakulty, na druhé úrovni jsou katedry). Ve třídě Utvar si však neuchováváme informaci o této úrovni, ani o nadřízeném útvaru (pokud by byl známý nadřízený útvar, bylo by možné úroveň dopočítat). Úroveň řízení lze též zjistit z průběhu vlastního výpisu začíná se na nulté úrovni, při výpisu podřízených útvarů se úroveň řízení zvyšuje. Doplníme tedy metodu vypis() o druhý parametr, který bude určovat úroveň řízení. Metoda vypis() by nyní mohla vypadat následovně: public void vypis(boolean vcetneosob, int uroven) { for (int i=0; i< uroven; i++) { System.out.print(" "); System.out.println(zkratka+" - " + nazev); for (Utvar utvar : podrizene) { utvar.vypis(vcetneosob, uroven+1); 38 Někoho by mohlo na tomto kódu překvapit, že se porovná privátní datový atribut zkratka z této instance s privátním datovým atributem zkratka z druhé instance vypadá to na porušení zapouzdření. Modifikátory přístupu ale určují přístup k datovým atributům a metodám na úrovni třídy, ne na úrovni instancí. Zde jsou obě proměnné ze stejné třídy, tudíž k narušení zapouzdření u privátních proměnných nedochází.

Projekt Škola strana 186 Před spuštěním ještě nezapomeňte upravit volání metody vypis() ve třídě Skola je potřeba doplnit druhý parametr. Výpis poté bude vypadat následovně: Obrázek 18.6 Výpis útvarů se setříděním a odsazením jednotlivých úrovní 18.5.5. Doplnění výpisu osob Vypsání pracovníků je jednoduché do metody vypis() se doplní cyklus procházející seznam pracovníků. Jména pracovníků je též vhodné odsazovat protože odsazování je nyní potřeba na více místech, přesuneme kód pro odsazování do samostatné privátní metody. Metody vypis() a odsadit() by mohly vypadat následovně: public void vypis(boolean vcetneosob, int uroven) { odsadit(uroven*3); System.out.println(zkratka+" - " + nazev); if (vcetneosob) { for (Osoba osoba : pracovnici) { odsadit((uroven+1)*3); System.out.println("- " + osoba.tostring()); for (Utvar utvar : podrizene) { utvar.vypis(vcetneosob, uroven+1); private void odsadit (int pocetmezer) { for (int i=0; i<pocetmezer; i++) { System.out.print(" "); 18.6. Domácí úkoly 1. Doplňte do třídy Skola metodu, která by měla jako parametr zkratku útvaru a tento útvar vyhledala a vypsala.

Projekt Škola strana 187 2. Rozšiřte předchozí zadání o vypsání i nadřízených útvarů, tj. pokud bude parametrem KIT, vypíše se VSE Vysoká škola ekonomická F4 Fakulta informatiky a statistiky KIT katedra informačních technologií 3. Vytvořte obdobnou metodu, jako je v předchozím zadání, pro vyhledání osob. Nezapomeňte, že někteří pracovníci jsou ve více útvarech. 4. Doplňte evidenci funkcí u osob např. rektor, děkan, vedoucí katedry, člen katedry. Zamyslete se nad tím, zda stačí některou třídu doplnit o datové atributy či je potřeba použít další třídu. Nezapomeňte, že některé osoby mohou mít různé funkce v různých útvarech (např. děkan je současně i vedoucím/členem katedry). 5. Rozšiřte předchozí úlohu o setřídění výstupu dle funkcí např. u katedry by se osoby měly vypisovat dle následujícího pořadí funkcí: vedoucí katedry, zástupce vedoucího katedry, sekretářka, profesoři, docenti, odborní asistenti, asistenti, doktorandi.

Projekt Škola strana 188