OOPR_05. Případové studie

Podobné dokumenty
OOPR_05. Případové studie

Přehled probírané látky

Obsah přednášky. dědičnost modifikátory (specifikátory) přístupu

Obsah přednášky. dědičnost modifikátory (specifikátory) přístupu

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

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

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

Deklarace a vytváření

Java - řazení objektů

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

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

Abstraktní datové typy: zásobník

Programování v Javě I. Leden 2008

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

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

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

Výčtový typ strana 67

Úvod do programovacích jazyků (Java)

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

Typický prvek kolekce pro české řazení

20. Projekt Domácí mediotéka

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

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/

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

Seminář Java II p.1/43

Java a XML. 10/26/09 1/7 Java a XML

KTE / ZPE Informační technologie

Návrhové vzory Design Patterns

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

17. Projekt Trojúhelníky

Principy objektově orientovaného programování

Java - výjimky. private void vstup() throws IOException {... }

Generické programování

typová konverze typová inference

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

7. Datové typy v Javě

Konstruktory. Konstruktor je speciální metoda, pro vytváření a inicializaci nových objektů (instancí). Název metody je totožný s názvem třídy.

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

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

1. Programování proti rozhraní

Objektové datové typy

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

Jazyk C# (seminář 6)

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

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

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

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

Teoretické minimum z PJV

Programovací jazyk Java

Podmínky na zápočet. Java, zimní semestr

Programovací jazyk Java

Obsah přednášky. Postup při vytváření objektů. Postup při vytváření objektů. Alokace paměti. Inicializace hodnot atributů

Algoritmizace a programování

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů

Algoritmizace a programování

Třídy a objekty -příklady

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

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

Datové struktury. alg12 1

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

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

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

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

KTE / ZPE Informační technologie

Projekt Obrázek strana 135

5 Rekurze a zásobník. Rekurzivní volání metody

int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sys.readint();... t7=sys.readint(); prume pru r = r = ( 1+t 1+t t3+ t3+ t4 t5+ t5+ +t7 +t7 )/ ;

Tabulková data. budeme pracovat s CSV soubory položky oddělené středníkem, např.

1. Téma 03 - Rozhodování

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

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

Třídy a dědičnost. A0B36PR1-Programování 1 Fakulta elektrotechnická České vysoké učení technické

6. PRÁCE S DATOVÝMI PROUDY

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

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

ADT/ADS = abstraktní datové typy / struktury

OBJEKTOVĚ ORIENTOVANÉ PROGRAMOVÁNÍ

Algoritmizace a programování

15. Projekt Kalkulačka

PREPROCESOR POKRAČOVÁNÍ

Java Enum Java, zimní semestr ,2017 1

Objektově orientované programování 1 XOBO1. Autor: Doc. Ing. František Huňka, CSc.

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

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

Dědičnost (inheritance)

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

Java Cvičení 01. CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics

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

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

Objekty, třídy, instance

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

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.

Abstraktní třída a rozhraní

Více o konstruktorech a destruktorech

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

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

Seminář Java IV p.1/38

Úvod do programovacích jazyků (Java)

Kolekce, cyklus foreach

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

Transkript:

OOPR_05 Případové studie 1

Přehled probírané látky příklad skládání objektů - čára příklad skládání objektů kompozice a agregace přetížené konstruktory pole jako datový atribut 2

Grafický objekt - čára Třída čára datové atributy: počátek Bod + / - délka ve směru osy x + / - délka ve směru osy y Vlastní implementace zjištění hodnoty pro cyklus for getmax() orientace vykreslování -1, 0, 1 kontrola správnosti parametrů délka 3

public class Cara { private Bod pocatek; private int delkax; private int delkay; public Cara(Bod bod, int delkax, int delkay) { pocatek = new Bod(bod); delkax = delkax; delkay = delkay; public Bod getpocatek() { return pocatek; public int getdelkax() { return delkax; public int getdelkay() { return delkay; // maximalni hodnota pro cyklus public int getmax() { if(math.abs(getdelkax()) > Math.abs(getDelkaY())) return Math.abs(getDelkaX()); else return Math.abs(getDelkaY());

// orientace vykreslovani public int orientace(int cislo) { int vysledek; if(cislo == 0) vysledek = 0; else if(cislo < 0) vysledek = -1; else vysledek = 1; return vysledek; // kontrola delek public boolean kontrola() { if((getdelkax() == 0) (getdelkay() == 0)) return true; else if(math.abs(getdelkax()) == Math.abs(getDelkaY())) return true; System.out.println("Chyba delek cary"); return false;

public void vykresli() { int dx = orientace(getdelkax()); int dy = orientace(getdelkay()); int hranice = getmax(); if(kontrola()) { for(int i = 0; i < hranice; i++){ pocatek.vykresli(dx*i, dy*i);

import java.awt.color; public class CaraTest { public static void main(string[] args) { Bod bod = new Bod(120, 100, Color.blue); Cara cara1 = new Cara(bod, 40,0); cara1.vykresli(); Cara cara2 = new Cara(bod, 0, 40); cara2.vykresli(); Cara cara3 = new Cara(bod, -40, 0); cara3.vykresli(); Cara cara4 = new Cara(bod, 0, -40); cara4.vykresli(); Vykreslený obrázek čar Cara cara5 = new Cara(bod, 40, 40); cara5.vykresli(); Cara cara6 = new Cara(bod, -40, 40); cara6.vykresli(); Cara cara7 = new Cara(bod, 40, -40); cara7.vykresli(); Cara cara8 = new Cara(bod, -40, -40); cara8.vykresli();

Problém Chceme vytvořit aplikaci, kdy osoba má datum narození a účet (v bance). První (naivní) řešení: vytvoříme jednu třídu, která obsahuje vše výhody: relativně rychlé řešení nevýhody: při každé změně adresy nebo účtu musíme měnit výchozí třídu. Lépe datum narození a účet uložit do samostatných tříd. Propojení tříd budeme řešit pomocí kompozice a agregace. 8

Problém Samostatné třídy Osoba, Ucet a Datum. Datum bývá stabilnější a proto asociace Osoba Datum bude řešeno pomocí kompozice kopírovacího konstruktoru. Účet podléhá častější změně, a proto bude tato asociace řešena pomocí agregace. 9

Diagram tříd úkolu 10

import java.util.calendar; public class Datum { private int den; // 1-31 private int mesic; // 1-12 private int rok; private Calendar kalendar = Calendar.getInstance(); // kalendar.get(1) = rok, kalendar.get(2) +1 = mesic, kalendar.get(5) = den //konstruktory public Datum( int den,int mesic, int rok) { this.mesic = mesickontrola( mesic ); // kontrola mesic this.rok = kontrolarok(rok); // bez kontroly this.den = denkontrola( den); // kontrola den public Datum() { mesic = kalendar.get(2) + 1; den = kalendar.get(5); rok = kalendar.get(1); public Datum(int den) { mesic = kalendar.get(2) + 1; this.den = denkontrola(den); rok = kalendar.get(1); public Datum(int den, int mesic) { this.mesic = mesickontrola(mesic); this.den = denkontrola(den); rok = kalendar.get(1); Třída Adresa

public Datum(int den, String mesic, int rok) { this.mesic = mesickontrola(mesic); this.den = denkontrola(den); this.rok = kontrolarok(rok); public Datum(int den, Mesic mesic, int rok) { this.mesic = mesic.ordinal() + 1; //System.out.println("mesic: " + this.mesic); this.den = denkontrola(den); this.rok = rok; // kopirovaci public Datum(Datum d) { mesic = d.getmesic(); den = d.getden(); rok = d.getrok(); Třída Adresa

public int getden() { return den; public int getmesic() { return mesic; public int getrok() { return rok; public void setden(int den) { this.den = denkontrola(den); public void setmesic(int mesic) { this.mesic = mesickontrola(mesic); public void setrok(int rok) { this.rok = rok; Třída Adresa private int mesickontrola( int mesic) { if ( mesic > 0 && mesic <= 12 ) return mesic; else { System.out.printf( "Neplatny mesic (%d) nastaveni na 1.", mesic ); return 1;

private int mesickontrola(string mesic) { String[] mesice = {"leden", "unor", "brezen", "duben", "kveten", "cerven", "cervenec", "srpen", "zari", "rijen", "listopad", "prosinec"; for(int i = 0; i < mesice.length; i++) if(mesic == mesice[i]) return i+1; System.out.printf("neplatny mesic (%s) nastaveni na leden ", mesic); return 1; private int denkontrola( int den ) { int dnuvmesici[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ; // kontrola rozsahu dne v mesici if ( den > 0 && den <= dnuvmesici[ getmesic() ] ) return den; Třída Adresa // kontrola prestupny rok if ( getmesic() == 2 && getden() == 29 && ( getrok() % 400 == 0 ( getrok() % 4 == 0 && getrok() % 100!= 0 ) ) ) return den; System.out.printf( "Neplatny den (%d) nastaveni na 1.", den ); return 1; public int kontrolarok(int r) { if(r>=1900 && r <= 2100) return r; else return kalendar.get(1);

public enum Mesic { LEDEN, UNOR, BREZEN, DUBEN, KVETEN, CERVEN, CERVENEC, SRPEN, ZARI, RIJEN, LISTOPAD, PROSINEC Třída Adresa

public class Ucet { private int cislo; private int stav; // Konstruktory tridy Ucet public Ucet() { this(0, 0); public Ucet(int cislo, int stav) { this.cislo = cislo; this.stav = stav; Třída Ucet public void vlozeni (int castka) { setstav(getstav() + castka); public int vyber (int castka) { setstav(getstav() castka); //stav = stav - castka; return stav; // pristupove a modifikacni metody... public String tostring() { return String.format("Cislo uctu: %d stav uctu: %d", getcislo(), getstav()); public void tisk() { System.out.println(this.toString());

public class Osoba { private String jmeno; private Datum datumnarozeni; //kompozice private Ucet ucet; // agregace - referencni kompozice // deklarace konstruktoru public Osoba() { this("neuvedeno", new Datum(), new Ucet()); Třída Osoba public Osoba(String jmeno, Datum datum, Ucet ucet) { this.jmeno= jmeno; datumnarozeni = new Datum(datum); // kopirovaci konstruktor this.ucet = ucet; //agregace // pristupove a modifikacni metody public void setjmeno(string jmeno) { this.jmeno = jmeno; public String getjmeno(){ return jmeno; public void setdatum(datum datum) { datumnarozeni = new Datum(datum); public Datum getdatumnarozeni() { return datumnarozeni;

public String tostring() { String tx= String.format("\nJmeno: %s datum narozeni: %s" + "\nucet: %s", getjmeno(), getdatumnarozeni().tostring(), ucet.tostring()); return tx; public void tisk() { System.out.println(this.toString()); public void setucet(ucet ucet) { this.ucet = ucet; public Ucet getucet(){ return ucet; public void vlozeni(int castka){ getucet().vlozeni(castka); public int vyber(int castka) { return getucet().vyber(castka); public void tiskucet(){ System.out.println("Ucet: "+ucet.tostring()); public void tiskdatumnarozeni(){ System.out.println("Datum narozeni: "+ getdatumnarozeni().tostring());

public class OsobaTest { public static void main(string[] args) { Datum datum = new Datum(10, 12, 1999); Osoba o1 = new Osoba("Kamil",datum, new Ucet()); Ucet u1 = new Ucet(1,200); Osoba o2 = new Osoba("Petr",new Datum(6, Mesic.KVETEN, 1956), u1); Ucet u2 = new Ucet(2, 300); o1.setucet(u2); o2.setucet(u1); o1.tisk(); o2.tisk(); o1.vyber(300); o2.vlozeni(800); u1.tisk(); u1 = null; o1.tiskucet(); o2.tiskdatumnarozeni(); Třída Osoba

Jmeno: Kamil datum narozeni: 10/12/1999 Ucet: Cislo uctu: 2 stav uctu: 300 Jmeno: Petr datum narozeni: 6/5/1956 Ucet: Cislo uctu: 1 stav uctu: 200 Cislo uctu: 1 stav uctu: 1000 Ucet: Cislo uctu: 2 stav uctu: 0 Datum narozeni: 6/5/1956 Třída OsobaTest

Rozšiřování funkčnosti Ve třídě Ucet máme částku na účtu vedenou v primitivním datovém typu int (celé číslo). Není zcela vyhovující: 1. vedení i části za desetinnou čárkou 2. chceme další možnosti sčítání, odčítání, násobení, tisk, převody na euro Nutno vytvořit samostatnou třídu Koruny a vyřešit její napojení na Ucet a Osobu. 21

Rozšiřování funkčnosti Požadavky na řešení: sčítání, odčítání, částek vrací nový objekt třídy Koruny s požadovanou hodnotou, násobení s reálným číslem (může představovat úrok) vrací nový objekt třídy Koruny s výslednou hodnotou, metoda tostring() vrací hodnoty např. 12,65 Kc nebo 8,09 Kc, zadávání ve formě: new Koruny(30.91) nebo instancí třídy Koruny 22

Rozšiřování funkčnosti V jakém typu proměnné uchovávat částku: double int, int String long a pouze v haléřích pro výstup se převede na koruny a haléře 23

public class Koruny { private long halere; private static final int HALERU_DO_KORUNY = 100; //konstruktory public Koruny(double castka) { this.halere = Math.round(castka * HALERU_DO_KORUNY); public Koruny(Koruny koruny) { halere = koruny.gethalere(); public long getkoruny() { //vraci počet korun return gethalere() / HALERU_DO_KORUNY; public long gethalere() { // vraci castku v halerich return halere; public long getzbylehalere() { // vraci zbyle halere bez korun return gethalere() % HALERU_DO_KORUNY; public boolean iszero() { return gethalere() == 0;

public boolean equals(object obj) { if(!obj.getclass().equals(this.getclass())) return false; Koruny castka = (Koruny) obj; return this.gethalere() == castka.gethalere(); public Koruny plus(koruny castka) { return new Koruny(1.0 *(this.gethalere() + castka.gethalere()) / HALERU_DO_KORUNY); public Koruny minus(koruny castka) { return new Koruny((double) (this.gethalere() castka.gethalere()) / HALERU_DO_KORUNY); public Koruny nasobeni(double cislo) { return new Koruny((double) (Math.round(this.getHalere() * cislo)) /HALERU_DO_KORUNY);

public String tostring() { StringBuffer vysledek = new StringBuffer(""); if(gethalere() < 0) vysledek.append( - ); vysledek.append(math.abs(getkoruny())); vysledek.append(','); long zbylehalere = Math.abs(this.getZbyleHalere()); if(zbylehalere == 0) vysledek.append("00"); else { if(zbylehalere > 0 && zbylehalere < 10) vysledek.append( 0 ); vysledek.append(zbylehalere); vysledek.append(" Kc"); return vysledek.tostring(); public void tisk() { System.out.println(this.toString());

public class KorunyTest { public static void main(string[] args) { Koruny castka1 = new Koruny(3.5678); Koruny castka2 = new Koruny(7.08); Třída KorunyTest Koruny vysledek = castka1.plus(castka2); vysledek.tisk(); vysledek = castka1.minus(new Koruny(7.08)); vysledek.tisk(); Koruny castka3 = new Koruny(5.94); vysledek = castka3.nasobeni(1.28); vysledek.tisk();

Celková aplikace 1 1 1 1 Student Účet Koruny Diagram tříd celé aplikace. 28

public class Ucet { private int cislo; private Koruny stav; Třída Ucet // Konstruktory tridy Ucet public Ucet(){ this(0, 0); public Ucet(int cislo, double castka) { this(cislo, new Koruny(castka)); public Ucet(int cislo, Koruny stav) { this.cislo = cislo; this.stav = stav; public void vlozeni (double castka) { // vyvola metodu vlozeni s parametrem Koruny this.vlozeni(new Koruny(castka));

public void vlozeni(koruny castka) { stav = stav.plus(castka); public Koruny vyber (double castka) { // vyvola metodu vyber s parametrem Koruny return this.vyber(new Koruny(castka)); Třída Ucet public Koruny vyber(koruny castka) { stav = stav.minus(castka); return getstav(); public Koruny getstav(){ return stav; public String tostring() { return String.format("Ucet cislo: %d stav uctu: %s", getcislo(), getstav().tostring());

public class Student { private String jmeno; private Ucet mujucet; public Student(String jmeno, Ucet ucet){ this.jmeno = jmeno; mujucet = ucet; // agregace public Ucet getucet() { return mujucet; public void setucet(ucet ucet) { mujucet = ucet; public void vlozeni(double castka) { // vyvola metodu vlozeni s parametrem Koruny this.vlozeni(new Koruny(castka));

public void vlozeni(koruny koruny) { this.getucet().vlozeni(koruny); public Koruny vyber(double castka) { // vyvola metodu vyber s parametrem Koruny return this.vyber(new Koruny(castka)); public Koruny vyber(koruny koruny) { return this.getucet().vyber(koruny); public String tostring() { return String.format("Jmeno: %s \n%s", getjmeno(), getucet().tostring()); public void tisk() { System.out.println(toString());

Deklarace tříd s přetíženými konstruktory Přetěžování konstruktorů je důležité. Pro přetěžování se využívá pseudoproměnná this, která v dané třídě znamená, že odkazuje sama na sebe. Takže pokud je v následujícím příkladu uvedeno v těle konstruktoru this(0, 0, 0); 33

Třída Time Prakticky uvedeme třídu Time s přetíženými konstruktory a validačními metodami, které ošetří možné chyby zadání nesprávného času. 34

public class Time { private int hodina; // 0-23 private int minuta; // 0-59 private int vterina; // 0 59 // konstruktory public Time() { this( 0, 0, 0 ); public Time( int h ) { this( h, 0, 0 ); public Time( int h, int m ) { this( h, m, 0 ); public Time( int h, int m, int v ) { // vyvola metodu settime k validaci casu settime( h, m, v ); // kopirovaci konstruktor public Time( Time time ) { this( time.gethodina(), time.getminuta(), time.getvterina() );

public void settime( int h, int m, int v ) { sethodina( h ); setminuta( m ); setvterina( v); public void sethodina( int h ) { hodina = ( ( h >= 0 && h < 24 )? h : 0 ); public void setminuta( int m ) { minuta = ( ( m >= 0 && m < 60 )? m : 0 ); public void setvterina( int v ) { vterina = ( ( v >= 0 && v < 60 )? v : 0 ); public int gethodina() { return hodina; public int getminuta() { return minuta; public int getvterina() { return vterina;

// prevede na String v universalnim casovem // formatu (HH:MM:SS) public String touniversalstring() { return String.format("%02d:%02d:%02d", gethodina(), getminuta(), getvterina() ); // prevede na String ve standardnim casovem formatu // (H:MM:SS AM nebo PM) public String tostring() { return String.format( "%d:%02d:%02d %s", ( (gethodina() == 0 gethodina() == 12)? 12 : gethodina() % 12 ), getminuta(), getvterina(), ( gethodina() < 12? "AM" : "PM" ) ); public void printu() { System.out.println(" "+this.touniversalstring()); public void prints() { System.out.println(" "+this.tostring());

public void tisk() { System.out.printf("%s %03d %2d %2d","Aktualni cas: ", gethodina(),getminuta(), getvterina());

public class TimeTest { public static void main(string[] args) { Time t1 = new Time(); // 00:00:00 Time t2 = new Time( 2 ); // 02:00:00 Time t3 = new Time( 21, 34 ); // 21:34:00 Time t4 = new Time( 12, 25, 42 ); // 12:25:42 Time t5 = new Time( 27, 74, 99 ); // 00:00:00 Time t6 = new Time( t4 ); // 12:25:42 System.out.println( "Vytvoreno s:" ); System.out.println( "t1: vsechny argumenty defaultni" ); t1.printu(); t1.prints(); System.out.println( "t2: specifikovana hodina; minuta a vterina defaultni"); t2.printu(); t2.prints(); System.out.println( "t3: specifikovana hodina a minuta; vterina defaultni"); t3.printu(); t3.prints();

System.out.println( "t4: specifikovana hodina, minuta a vterina"); t4.printu(); t4.prints(); System.out.println( "t5: specifikovany vsechny neplatne hodnoty" ); t5.printu(); t5.prints(); System.out.println( "t6: ma specifikovane hodnoty objekty t4" ); t6.printu(); t6.prints();

Pole jako datový atribut Třída Student má pole známek a pole oblíbených jídel. Pole známek obsahuje pouze celá číslo v rozsahu 1.. 3. Pole oblíbených jídel je pole řetězců. Cíl blíže se seznámit s práci s poli. 41

import javax.swing.joptionpane; public class Student { private String jmeno; private int[] zkousky = {1, 3, 2, 2, 1; private String[] oblibenajidla; public Student() { jmeno = "nezadane"; oblibenajidla = new String[1]; oblibenajidla[0] = "nezadana"; public Student(String jmeno){ this.jmeno = jmeno; initoblibenajidla(); public String getjmeno() { return jmeno; public String[] getoblibenajidla(){ return oblibenajidla;

public int[] getzkousky() { return zkousky; public void setjmeno(string jmeno) { this.jmeno = jmeno; public void setoblibenajidla(string[] jidla) { oblibenajidla = jidla; public void setzkousky(int[] zkousky) { this.zkousky = zkousky; public String tostring() { return String.format("Jmeno: %s \noblibena jidla + %s\nzkousky %s\nprumer: %.2f", getjmeno(), jidlatostring(), zkouskytostring(), getprumer());

public String jidlatostring() { String s = ""; for(int i = 0; i < getoblibenajidla().length; i++) s += "\n" + (i + 1) + " " + oblibenajidla[i]; return s; public String zkouskytostring() { String s = ""; for(int i = 0; i < getzkousky().length; i++) s += "\n" + (i + 1) + " " + zkousky[i]; return s; public void tisk() { System.out.println(toString());

public void initoblibenajidla() { String odpoved = JOptionPane.showInputDialog("Pocet oblibenych jidel: "); int pocet = Integer.parseInt(odpoved); oblibenajidla = new String[pocet]; for(int i = 0; i < pocet; i++) { odpoved = JOptionPane.showInputDialog("Jidlo [" + (i+1) + "] "); oblibenajidla[i] = odpoved; public double getprumer() { double vysledek = 0; for (int i = 0; i < getzkousky().length; i++) vysledek += zkousky[i]; vysledek = vysledek / getzkousky().length; return vysledek; public String prumertostring() { return ""+ getprumer();

1 public class StudentTest { 2 public static void main(string[] args) { 3 Student student = new Student("Eva"); 4 student.tisk(); 5 String[] jidlo = {"cocka s vejci", "vepro knedlo zelo", 6 "michana zelenina"; 7 int[] vysledky = {3, 3, 2, 1 ; 8 student.setoblibenajidla(jidlo); 9 student.setzkousky(vysledky); 10 student.tisk();

Případová studie Karty K dispozici 52 karet, mají barvu a hodnotu. Deklarace třídy Karta se dvěma atributy výčtového typu. Uložení hodnot karet do pole. 47

public enum Barva { Krize, Herce, Kary, Piky 1 public class BarvaTest { 2 public static void main(string[] args) { 3 Barva bp = Barva.Piky; 4 Barva bh = Barva.Herce; 5 if(bp == Barva.Piky) System.out.println("ANO Piky"); 6 else System.out.println("Ne Piky"); Možnosti výčtových typů 7 // jedna moznost pruchodu vyctovymi hodnotami 8 for(barva bv: Barva.values()) 9 System.out.println("Barva: " + bv); 10 System.out.println(); // prazdny radek ve vypisu 11 // klasicka moznost pruchodu vyctovymi hodnotami 12 Barva[] pole = Barva.values(); 13 for(int i = 0; i < pole.length; i++) 14 System.out.println("Barva: " + pole[i]);

public enum Hodnota { Eso, Dve, Tri, Ctyri, Pet, Sest, Sedm, Osm, Devet, Deset, Kluk, Dama, Kral

public class Karta { private final Hodnota hodnota; // hodnota karty private final Barva barva; // barva karty // konstruktor public Karta( Hodnota kartahodnota, Barva kartabarva ) { hodnota = kartahodnota; // inicializace hodnoty karty barva = kartabarva; // inicializace barvy karty public Hodnota gethodnota() { return hodnota; public Barva getbarva() { return barva; public String tostring() { return String.format( "%s %s", gethodnota(), getbarva());

import java.util.list; import java.util.arrays; import java.util.collections; 1 public class BalicekKaret { 2 private Karta[] balicek = new Karta[52]; 3 private int count = 0; // pocet karet index pro pole 4 5 private List< Karta > list; // deklarace seznamu karet 6 7 // vytvoreni balicku karet = konstruktor 8 public BalicekKaret() { 9 for(barva barva: Barva.values()) { 10 for(hodnota hodnota: Hodnota.values()) { 11 balicek[count] = new Karta(hodnota, barva); 12 count++; 13 14 15 list = Arrays.asList( balicek ); // vytvori List 16

17 public Karta[] getbalicek() { 18 return balicek; 19 20 public void zamichanikaret() { 21 Collections.shuffle(list); 22 23 public void tiskseznamukaret() { 24 // zobrazi 52 karet ve dvou sloupcich 25 for ( int i = 0; i < list.size(); i++ ) 26 System.out.printf( "%-20s%s", list.get( i ), 27 ( ( i + 1 ) % 2 == 0 )? "\n" : "" ); 28 29 public void tiskkaret() { 30 for( int i = 0; i < getbalicek().length; i++) 31 System.out.printf( "%-20s%s", balicek[i], 32 ( ( i + 1 ) % 2 == 0 )? "\n" : "" ); 33 System.out.println();

public void michanikaret() { Random rnd = new Random(); int prvni, druhy, pocet; Karta karta; pocet = getbalicek().length -1; for(int i = 0; i < 10; i++) { prvni = rnd.nextint(pocet); druhy = rnd.nextint(pocet); System.out.println("prvni: " + prvni + " druhy: " + druhy); karta = balicek[prvni]; balicek[prvni] = balicek[druhy]; balicek[druhy] = karta;

public class BalicekKaretTest { public static void main(string[] args) { BalicekKaret balicek = new BalicekKaret(); balicek.tiskkaret(); balicek.zamichanikaret(); balicek.tiskseznamukaret();