paz 1 c Programovanie algoritmy zloitos UINF PAZ

  • Slides: 31
Download presentation
paz 1 c Programovanie, algoritmy, zložitosť (UINF / PAZ 1 c) Diel III. Róbert

paz 1 c Programovanie, algoritmy, zložitosť (UINF / PAZ 1 c) Diel III. Róbert Novotný robert. novotny@upjs. sk 13. 10. 2006 PAZ 1 c

paz 1 c V minulom dieli ste videli. . . class Pes { String

paz 1 c V minulom dieli ste videli. . . class Pes { String rasa; int vek; inštančné premenné String stekaj() { return "Haf!" } metódy void pridaj. Rok() { vek = vek + 1; } } PAZ 1 c

paz 1 c Chráňte životné prostredie a inštančné premenné! Pes slayer = new Pes();

paz 1 c Chráňte životné prostredie a inštančné premenné! Pes slayer = new Pes(); slayer. vek = -125; Huh? záporný vek? Riešenie: • ku všetkým inštančným premenným budeme pristupovať pomocou metód • tešíme sa na kopu klepkania! PAZ 1 c

paz 1 c Chráňte životné prostredie a inštančné premenné! public class Pes { Pes

paz 1 c Chráňte životné prostredie a inštančné premenné! public class Pes { Pes slayer = new Pes(); //. . rasu vynecháme slayer. nastav. Vek(25); int vek. Psa = slayer. daj. Vek(); System. out. println(vek. Psa); void nastav. Vek(int novýVek) { vek = novýVek; } int daj. Vek() { return vek; } } PAZ 1 c Čo môj záporný vek?

paz 1 c Chráňte životné prostredie a inštančné premenné! public class Pes { To

paz 1 c Chráňte životné prostredie a inštančné premenné! public class Pes { To je //. . . lepšie void nastav. Vek(int novýVek) { if(novýVek >= 0) { vek = novýVek; } else { System. out. println("Vek nesmie byť < 0"); } } slayer. nastav. Vek(3); } System. out. println(slayer. daj. Vek()); slayer. nastav. Vek(-125); System. out. println(slayer. daj. Vek()); PAZ 1 c 3 Vek nesmie byť < 0 3

paz 1 c Chráňte životné prostredie a inštančné premenné! Pes slayer = new Pes();

paz 1 c Chráňte životné prostredie a inštančné premenné! Pes slayer = new Pes(); pes. nastav. Vek(25); pes. vek = -17000; Bwahahaha! Ako zabrániť zlému vedcovi páchať neprístojnosti? Vyhlásime inštančnú premennú v triede Pes za súkromnú private int vek; PAZ 1 c Au!

paz 1 c Súkromné vlastníctvo • k privátnym premenným môže pristupovať len kód v

paz 1 c Súkromné vlastníctvo • k privátnym premenným môže pristupovať len kód v danej triede public class Pes { private int vek; Pes slayer = new Pes(); int daj. Vek() slayer. vek = -17000; { return vek; Do kela! } Taká void nastav. Vek(int novýVek) premenná { neexistuje! vek = novýVek; } } PAZ 1 c

paz 1 c Súkromné vlastníctvo • Príklad použitia: chceme premennú, do ktorej nemôžeme zapisovať

paz 1 c Súkromné vlastníctvo • Príklad použitia: chceme premennú, do ktorej nemôžeme zapisovať (, , read only") public class Pes { private int vek; Pes slayer = new Pes(); int daj. Vek() { return vek; } Taká } premenná neexistuje! slayer. nastav. Vek(25); PAZ 1 c slayer. vek = -17000; Taká metóda neexistuje!

paz 1 c Daj a nastav po americky • Pre každú inštančnú premennú naklepkáme

paz 1 c Daj a nastav po americky • Pre každú inštančnú premennú naklepkáme 2 metódy: – daj. XXX daj. Vek(), daj. Rasu() – nastav. XXX nastav. Vek(. . . ), nastav. Rasu() • Premenné určené len na čítanie majú len jednu metódu – daj. XXX PAZ 1 c

paz 1 c Daj a nastav po americky • Dohoda: – metóda daj. XXX

paz 1 c Daj a nastav po americky • Dohoda: – metóda daj. XXX sa bude zapisovať ako get. XXX – metóda nastav. XXX sa bude zapisovať ako set. XXX , , nahodíme gettre a settre" • Nariadenie – odteraz pristupujeme k premenným triedy len cez get. XXX a set. XXX , , úplné zapúzdrenie" PAZ 1 c

paz 1 c Daj a nastav po americky • Problém so slovenčinou – správne

paz 1 c Daj a nastav po americky • Problém so slovenčinou – správne by malo byť: String daj. Rasu() – podľa dohody: get. Rasu() • zabudneme na Ľ. Štúra a na skloňovanie – nástroje predpokladajú takýto stav: • private String rasa; • get + rasa = get. Rasa() • set + rasa = set. Rasa(String nováRasa) • zabudneme na slovenčinu = riešenie odrodilca , , reč , ktorú z domu vieš , ó , jak je lichá" private String breed; String get. Breed() set. Breed(String a. Breed) PAZ 1 c

Dátové štruktúry paz 1 c • s obyčajnými dátovými typmi by sme sa ďaleko

Dátové štruktúry paz 1 c • s obyčajnými dátovými typmi by sme sa ďaleko nedostali • potrebujeme často reprezentovať komplikované štruktúry • spomni matematiku: – – množiny zoznamy funkcie (postupnosti) stromy (grafy) • spomni Pascal – polia (array [1. . 10] of integer) – záznamy (record meno: string; vek: integer; end; ) – množiny (set of integer) PAZ 1 c

Polia obyčajné paz 1 c , , . . . a od Preš ova

Polia obyčajné paz 1 c , , . . . a od Preš ova v tym poľu" • už poznáme • deklarácia a inicializácia pole dĺžky 4 String[] reťazce = new String[4]; • alternatívna deklarácia a inicializácia String[] reťazce = { "Ferko", "Miško" }; 2 pole dĺžky • prístup k prvkom poľa String prvý = reťazce[0]; • dĺžka poľa String dlzkabez = zátvoriek! reťazce. length; PAZ 1 c toto nie je metóda v kučeravých zátvorkách vymenujeme prvky poľa

paz 1 c Výhody a nevýhody polí +dĺžka poľa môže byť určená premennou +spomni

paz 1 c Výhody a nevýhody polí +dĺžka poľa môže byť určená premennou +spomni Pascal: len konštantou, alebo číslom pri deklarácii. • komplikované vkladanie prvkov do existujúceho poľa – nadeklarovať nové pole o jedna dlhšie – v cykle skopírovať prvú časť poľa, nový prvok, zvyšok • komplikované mazanie prvkov z poľa – nadeklarovať nové pole o jedna kratšie – v cykle skopírovať prvú časť poľa, zvyšok za vymazaným prvkom PAZ 1 c

paz 1 c Polia dynamické čili zoznamy • našťastie máme zoznamy – trieda java.

paz 1 c Polia dynamické čili zoznamy • našťastie máme zoznamy – trieda java. util. Array. List • deklarácia a inicializácia java. util. Array. List<String> mená = new java. util. Array. List<String>(); • pridanie prvku (na koniec zoznamu) mená. add("Rex"); • prístup k prvku String meno = mená. get(0); • dĺžka zoznamu int dĺžka = mená. size(); PAZ 1 c so zátvorkami! toto je metóda!

paz 1 c Polia dynamické čili zoznamy • odstránenie prvku mená. remove(2); – prvky

paz 1 c Polia dynamické čili zoznamy • odstránenie prvku mená. remove(2); – prvky sa posunú doľava • pridanie prvku na pozíciu mená. add(1, "Lassie"); – pridanie na , , druhú" pozíciu – prvky sa posunú doprava • ostatné operácie – viď dokumentácia PAZ 1 c

Polia vs. zoznamy paz 1 c • polia vieme previesť na zoznam a späť

Polia vs. zoznamy paz 1 c • polia vieme previesť na zoznam a späť • zoznam => pole potrebujeme String[] pole. Mien = mená. to. Array(new String[0]); • pole => zoznam sem dať prázdne pole java. util. List<String> mená = java. util. Arrays. as. List(pole. Mien); • porovnanie PAZ 1 c – prístup k poliam je rýchlejší – chlieviky v pamäti za sebou – v Jave 5: zoznamy majú všetky výhody polí a odstraňujú ich nevýhody

Prechádzame poľom paz 1 c • dva spôsoby prechádzania poľom String[] mená = {

Prechádzame poľom paz 1 c • dva spôsoby prechádzania poľom String[] mená = { "Rex", "Brok" }; • klasický for (int i = 0; i < mená. length; i++) { String meno = mená[i]; System. out. println(meno); nevieme zistiť } index prvku, • Java 5: for (String meno : mená) { System. out. println(meno); } PAZ 1 c ale často ho netreba

Prechádzame zoznamom paz 1 c • dva spôsoby prechádzania zoznamom • klasický for (int

Prechádzame zoznamom paz 1 c • dva spôsoby prechádzania zoznamom • klasický for (int i = 0; i < zoznam. Mien. size(); i++) { String meno = zoznam. Mien. get(i); System. out. println(meno); } • Java 5: for (String meno : zoznam. Mien) { System. out. println(meno); } PAZ 1 c

paz 1 c Ďalšie dátové štruktúry • v starej Jave – namiesto Array. List-ov

paz 1 c Ďalšie dátové štruktúry • v starej Jave – namiesto Array. List-ov bol java. util. Vector. – radšej používajme Array. List • existujú aj ďalšie dátové štruktúry – množina – java. util. Hash. Set – mapa – java. util. Hash. Map – o nich neskôr. . . PAZ 1 c

paz 1 c Utajené metódy práce s kávou • Je užitočné vedieť o niektorých

paz 1 c Utajené metódy práce s kávou • Je užitočné vedieť o niektorých , , utajených metódach" práce s objektami • traja zhavranelí bratia – to. String() , , znak si a v znak sa obrátiš" – equals() , , všetci sú si rovní, len niektorí sú si rovnejší" – hash. Code() PAZ 1 c , , heš!"

paz 1 c Metóda to. String() "buldog, 5 rokov" • Každá trieda môže mať

paz 1 c Metóda to. String() "buldog, 5 rokov" • Každá trieda môže mať metódu s hlavičkou public String to. String() • Metóda slúži na vrátenie ľubovoľného reťazca, ktorý popisuje objekt • Často používaná na ladenie PAZ 1 c

paz 1 c Metóda to. String() class Pes { "buldog, 5 rokov" private String

paz 1 c Metóda to. String() class Pes { "buldog, 5 rokov" private String rasa; to. String() private int vek; … public String to. String() { String s = "Pes rasy " + rasa + " s vekom " + vek; return s; } } Pes lajka = new Pes(); lajka. set. Rasa("buldog"); lajka. set. Vek(5); System. out. println(lajka. to. String()); System. out. println(lajka); PAZ 1 c Pes rasy buldog s vekom 5 pri volaní metódy println() sa metóda to. String() volá automaticky

paz 1 c Metóda to. String() public String to. String() { return String. format("Pes

paz 1 c Metóda to. String() public String to. String() { return String. format("Pes rasy %s s vekom %d", rasa, vek); } • Metóda format funguje na spôsob printf() v Cčku • Užitočná na formátovanie výstupu • %s a %d sú zástupné znaky • %s je zástupný znak pre reťazec. V príklade sa nahradí hodnotou premennej rasa • %d je zástupný znak pre celé číslo. V príklade nahradí hodnotou premennej vek PAZ 1 c

paz 1 c Formátovanie disku reťazcov String prvy = "Miško"; String druhy = "Ferko";

paz 1 c Formátovanie disku reťazcov String prvy = "Miško"; String druhy = "Ferko"; int vek 1 = 25; float vek 2 = 35. 0 f; String. format("%s - %d, %s - %f", prvy, vek 1, druhy, vek 2) • Prvý parameter je reťazcová premenná prvy, • Druhý celé číslo vek 1 • Tretím reťazec druhy • Štvrtým reálne číslo vek 2 PAZ 1 c Miško – 25, Ferko – 35. 0

Metóda equals() paz 1 c • Slúži na porovnávanie objektov • Ale ako môžeme

Metóda equals() paz 1 c • Slúži na porovnávanie objektov • Ale ako môžeme porovnávať dva objekty? – databázovo • ak majú dva objekty rovnaké ID, sú rovnaké • čo dvaja občania s rovnakým rodným číslom? – porovnaním atribútov • dva psy sú rovnaké, ak majú rovnakú rasu a rovnaký vek , , veľmi zjednoduš ené" • Každá trieda môže mať metódu public boolean equals(Object obj) PAZ 1 c

paz 1 c Metóda equals() • Častejšie sa zvykne používať porovnávanie atribútov • Metóda

paz 1 c Metóda equals() • Častejšie sa zvykne používať porovnávanie atribútov • Metóda sa ľahko pochopí, ale ťažko napíše public boolean equals(Object o) { Pes pes = (Pes) o; if(pes. get. Rasa(). equals(rasa) && pes. get. Vek() == vek) { return true; else { return false; } } PAZ 1 c Keďže parameter je Object (teda hocičo), musíme zmeniť dátový typ zo všeobecného Object-u na Psa (Viď dedičnosť)

paz 1 c Metóda equals() • Častejšie sa zvykne používať porovnávanie atribútov • Metóda

paz 1 c Metóda equals() • Častejšie sa zvykne používať porovnávanie atribútov • Metóda sa ľahko pochopí, ale ťažko napíše public boolean equals(Object o) { Pes pes = (Pes) o; if(pes. get. Rasa(). equals(rasa) && pes. get. Vek() == vek) { return true; else { return false; } } PAZ 1 c Tu môže prísť hocičo, aj objekt typu Asteroid Nesmierne komplikácie pri dedičnosti, treba ošetriť veľa bočných prípadov

paz 1 c Metóda equals() • Metóda sa ľahko pochopí, ale ťažko napíše Čítanie

paz 1 c Metóda equals() • Metóda sa ľahko pochopí, ale ťažko napíše Čítanie z listov Java. Docu, kapitola Object, metóda equals(); Vlastnosť , , rovná sa" musí byť • reflexívna • symetrická • tranzitívna • konzistentná • negatívna vzhľadom na null PAZ 1 c

paz 1 c Metóda equals() • Riešenie: inžiniersky prístup: použitím IDE (Eclipse) a jeho

paz 1 c Metóda equals() • Riešenie: inžiniersky prístup: použitím IDE (Eclipse) a jeho nástroja na vygenerovanie metódy. public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (get. Class() != obj. get. Class()) return false; final Pes other = (Pes) obj; if (rasa == null) { if (other. rasa != null) return false; } else if (!rasa. equals(other. rasa)) return false; if (vek != other. vek) return false; return true; PAZ 1 c }

Metóda hash. Code() paz 1 c ak to nie je splnené, množiny nebudú fungovať

Metóda hash. Code() paz 1 c ak to nie je splnené, množiny nebudú fungovať • Používaný v algoritmoch triedy pre množiny Hash. Set • Každý objekt by mal mať svoj čo najjedinečnejší kód. • Požiadavky: – ak sú dva objekty rovnaké (equal), majú rovnaký hash. Code – dva nerovnaké objekty môžu mať rovnaký hash. Code • Opäť inžiniersky prístup: generovanie pomocou IDE PAZ 1 c