1
OBOP2_4 Aplikace
2
Vztahy (asociace) mezi třídami • Vztahy mezi třídami, vztahy mezi objekty (instancemi) • asociace jednosměrná, obousměrná, nepřímá • realizace kompozice • realizace agregace • diagramy tříd • jednoduché příklady (rodina, muslimská rodina) • bankovní systém • UML diagramy dalších jednoduchých aplikací
3
Asociace - link • Link je spojení mezi dvěma objekty nejrůznějších druhů. Link je instancí asociace. • Link označuje, že jeden objekt ví o druhém. Např. – jeden objekt vlastní druhý objekt jako svoji část, – jeden objekt může volat metodu druhého objektu
• jeden objekt vlastní ukazatel na druhý objekt • Asociace označuje vztah mezi třídami. Asociace rozlišujeme jednosměrné, obousměrné a nepřímé. • Jednosměrná asociace – jedna třída zná rozhraní druhé třídy • Obousměrná asociace – každá třída zná rozhraní svého partnera.
Jednosměrná a obousměrná asociace role
-manzel
-manzelka
Muz
Zena 1
-přítel
1
-přítelkyně
Muž
Žena -syn 1 0..*
-matka 1 1
4
5 package asociace; public class Muz { private String jmeno; jmeno; private String bydliste; bydliste; private Zena ukZena; ukZena; public Muz Muz( (String jmeno, jmeno, String bydliste, bydliste, Zena zena){ zena){ this. this.jmeno = jmeno; jmeno; this. this.bydliste = bydliste; bydliste; ukZena = zena; } public String toString(){ toString(){ return "Jmeno: Jmeno: "+jmeno "+jmeno+" jmeno+" bydliste: bydliste: "+bydliste "+bydliste+ bydliste+ukZena. ukZena.toString(); toString(); } public void tisk(){ System. System.out. out.println( println(this. this.toString()); toString()); } }
Osnova Programové řešení jednosměrné asociace
6 package asociace; public class Zena { private String jmeno; jmeno; private String bydliste; bydliste; public Zena(String Zena(String jmeno, jmeno, String bydliste){ bydliste){ this. this.jmeno = jmeno; jmeno; this. this.bydliste = bydliste; bydliste; } public String toString(){ toString(){ return "Zena jmeno: jmeno: "+jmeno "+jmeno+" jmeno+" bydliste: bydliste: "+bydliste "+bydliste; bydliste; } public void tisk(){ System. System.out. out.println( println(this. this.toString()); toString()); } }
Osnova
7 package asociace; public class MZTest1 { public static void main( main(String args[]){ args[]){ Zena Z1 = new Zena("Vlasta","Opava"); Muz M1 = new Muz("Pavel","Ostrava",Z1); Muz("Pavel","Ostrava",Z1); Z1.tisk(); M1.tisk(); } }
Osnova
8
Abstrakce relací • Samotná relace je často reprezentovaná samostatnou datovou entitou – třídou. Relace manželství je reprezentovaná třídou s datovým atributem datum svatby. • Muz i zena mohou mít přiřazeny více objektů třídy Manzelství
9
Kompozice – speciální druh asociace • vyjadřuje, že objekt třídy obsahuje jiné objekty • Java využívá pro vztahu mezi objekty pouze reference. Kompozice mezi objekty je realizovaná přímo v konstruktoru vytvářením objektů, které objekt obsahuje.
10
UML diagram kompozice
Auto
1 1 1 1 1 Karoserie
1 Motor
1 Volant
4 Kola
11 // kompozive ve tride tride Auto public class Auto { private Motor motor = new Motor(); private Karoserie karoserie = new Karoserie(); Karoserie(); private Volant volant = new Volant(); private Kolo kola[] = new Kolo[4]; ... }
Osnova
12
Agregace • speciální druh asociace • volnější spojení celku a částí
13
Agregace – UML diagram
RezervaceUbytovani
1 *
1
1 *
* Host
Hotel
Pokoj
14
Osnova public class RezervaceUbytovani { // deklarace datovych atributu Osoba osoba; osoba; Hotel hotel; hotel; Pokoj pokoj; pokoj; //konstruktor //konstruktor; konstruktor; public RezervaceUbytovani(Osoba host, Hotel hotel, hotel, Pokoj pokoj){ pokoj){ this.host = host; this.hotel = hotel; this.pokoj = pokoj; pokoj; ... }
Agregace kód v Javě
15
Rekurzivní vazby • odkazuje se sám na sebe • např. třída Osoba – odkaz na otce, matku, sourozence, příbuzné
16
Postup při vytváření diagramu tříd UML 1. Identifikace objektů – určení tříd 2. Dílčí skládání objektů • •
kompozice – třída obsahuje seznam agragace – seznam obsahuje další objekty
3. Dílčí vazby dědičnosti mezi třídami •
seznam je podtřídou dané třídy nebo rozhraní – seznam je např. podtřídou třídy ArrayList
4. Stanovení jednoho společného objektu např. Rodina, Bankovní systém …
UML diagram tříd rodiny Rodina
1
«interface» List
1 1
2
2
-seznamDeti
-rodice ArrayList
Osoba -otec, matka
1
1 *
2
-rodice
Osoba -dite
1
17
18 import java. java.util. util.Calendar; Calendar; public class Osoba { private String jmeno; jmeno; private int rokNarozeni; rokNarozeni; private Osoba otec; private Osoba matka; public Osoba(){ this("neuvedeno",0, this("neuvedeno",0, null, null, null); null); } public Osoba(String Osoba(String jmeno, jmeno, int rokNarozeni){ rokNarozeni){ this( this(jmeno, jmeno, rokNarozeni, rokNarozeni, null, null, null); null); } public Osoba(String Osoba(String jmeno, jmeno, int rokNarozeni, rokNarozeni, Osoba otec, Osoba matka){ this. this.jmeno = jmeno; jmeno; this. this.rokNarozeni = rokNarozeni; rokNarozeni; this.otec this.otec = otec; this.matka this.matka = matka; } public Osoba(Osoba o){ jmeno = o.jmeno o.jmeno; jmeno; rokNarozeni = o.rokNarozeni o.rokNarozeni; rokNarozeni; otec = null; null; matka = null; null; } public String getJmeno(){ getJmeno(){ return jmeno; jmeno; } . . . }
Osnova Programové řešení třídy rodina
19 import java. java.util.List; util.List; import java. java.util. util.ArrayList; ArrayList; import java. java.util. util.ListIterator; ListIterator; public class Rodina { private Osoba muz = new Osoba(); private Osoba zena = new Osoba(); private List
deti = new ArrayList(); ArrayList(); public Rodina(Osoba muz, muz, Osoba zena){ this. this.muz = new Osoba(muz Osoba(muz); muz); this.zena this.zena = new Osoba(zena); } public Osoba getZena(){ getZena(){ return zena; } public Osoba getMuz(){ getMuz(){ return muz; muz; } public void tisk(){ System. System.out. out.println("Rodina println("Rodina tisk"); System. System.out. out.print(" print("muz muz.tisk(); ("muz: muz: "); muz.tisk(); System. System.out. out.print("zena: print("zena: "); zena.tisk(); System. System.out. out.println(" println("Deti ("Deti tisk");
Osnova Programové řešení třídy rodina
20 Osoba dite; dite; ListIterator ListIterator iterator = deti. deti.listIterator(); listIterator(); while( while(iterator. iterator.hasNext()){ hasNext()){ dite = iterator. iterator.next(); next(); dite.tisk(); dite.tisk(); System. System.out. out.print(" print(" otec: "); dite. dite.getOtec().tisk(); getOtec().tisk(); System. System.out. out.println(" println(" matka: "); dite. dite.getMatka().tisk(); getMatka().tisk(); } } public void pridejDite(Osoba pridejDite(Osoba dite){ dite){ if( if(dite. dite.getOtec() getOtec() == null) null)dite. dite.setOtec( setOtec(muz); muz); if( if(dite. dite.getMatka() getMatka() == null) null)dite. dite.setMatka(zena); setMatka(zena); deti. deti.add( add(dite); dite); } public void odeberDite(Osoba odeberDite(Osoba dite){ dite){ deti. deti.remove( remove(dite); dite); } public Osoba najdiDite( najdiDite(String jmeno){ jmeno){ Osoba dite = null; null; ListIterator ListIterator iterator = deti. deti.listIterator(); listIterator(); while( while(iterator. iterator.hasNext()){ hasNext()){ dite = iterator. iterator.next(); next(); if( if(dite. dite.getJmeno(). getJmeno().equals jmeno)) return dite; dite; ().equals( equals(jmeno)) } return null; null; } }
Osnova Programové řešení třídy rodina
21 public class RodinaTest { public static void main( main(String[] String[] args) args) { Rodina r1 = new Rodina(new Rodina(new Osoba("Karel",1980), new Osoba("Marie",1982)); r1.tisk(); Osoba dite = new Osoba("Kamilka",2002); r1.pridejDite r1.pridejDite( pridejDite(dite); dite); r1.pridejDite r1.pridejDite( pridejDite(new Osoba("Jarecek Osoba("Jarecek",2004)); Jarecek",2004)); r1.tisk(); Osoba adam = new Osoba("Adam",1979); r1.pridejDite r1.pridejDite( pridejDite(new Osoba("Lucinka", 1999, adam, adam, null)); null)); r1.tisk(); } }
Osnova Programové řešení třídy rodina
22 Rodina tisk muz: muz: Jmeno: Jmeno: Karel vek: vek: 27 zena: zena: Jmeno: Jmeno: Marie vek: vek: 25 Deti tisk Rodina tisk muz: muz: Jmeno: Jmeno: Karel vek: vek: 27 zena: zena: Jmeno: Jmeno: Marie vek: vek: 25 Deti tisk Jmeno: 5 Jmeno: Kamilka vek: vek: otec: otec: Jmeno: Jmeno: Karel vek: vek: 27 matka: matka: Jmeno: Jmeno: Marie vek: vek: 25 Jmeno: 3 Jmeno: Jarecek vek: vek: otec: otec: Jmeno: Jmeno: Karel vek: vek: 27 matka: matka: Jmeno: Jmeno: Marie vek: vek: 25 Rodina tisk muz: muz: Jmeno: Jmeno: Karel vek: vek: 27 zena: zena: Jmeno: Jmeno: Marie vek: vek: 25 Deti tisk Jmeno: 5 Jmeno: Kamilka vek: vek: otec: otec: Jmeno: Jmeno: Karel vek: vek: 27 matka: matka: Jmeno: Jmeno: Marie vek: vek: 25 Jmeno: 3 Jmeno: Jarecek vek: vek: otec: otec: Jmeno: Jmeno: Karel vek: vek: 27 matka: matka: Jmeno: Jmeno: Marie vek: vek: 25 Jmeno: Jmeno: Lucinka vek: vek: 8 otec: otec: Jmeno: Jmeno: Adam vek: vek: 28 matka: matka: Jmeno: Jmeno: Marie vek: vek: 25
Osnova Programové řešení třídy rodina
23
Muslimská rodina • • • • • •
v rodině jedna osoba v roli muže několik osob v roli manželek několik osob v roli dětí seznam manželek – objekt / podtřída List seznam dětí – objekt / podtřída List jedna z možností řešení (konkrétní řešení závisí na požadavcích aplikační domény)
UML diagram tříd - muslimská rodina MuslimskaRodina
1
-rodice -muz
1 2
1
«interface» List
1
1
-Muz
-seznamManzelek
ArrayList
Osoba
1
-seznamDeti
ArrayList
1 1 -rodice -zena
1
* 2
1 -manzelka
Osoba
-rodice -dite2 * Osoba
1
-dite
24
25
Bankovní systém • jednoduchá aplikace, která se skládá ze tříd: – – – – –
Ucet Osoba / Klient SeznamKlientu SeznamUctuKlienta BankovnihoSystemu
• Vyskytují se agregace: ArrayList – Osoba, ArrayList - Ucet • Vyskytují se kompozice: Osoba – SeznamUctuKlienta, BankovniSystem – SeznamOsob
26 BankovniSystem
«rozhraní» List
ArrayList
+novyKlient() +novyUcet() +vlozeni() +vyber() +tiskKlientu() +tisk() 1* SeznamKlientu +najdiKlienta() +tiskKlientu() +tiskKlienta() 1* Osoba Adresa -ulice -cislo -mesto
1
1
-jmeno -rokNarozeni -ido +najdiUcet() +vlozeni() +vyber() +tiskKlienta() +tisk()
-uctyKlienta
1
ArrayList
* 1 * Ucet -cislo -stav +vlozeni() +vyber() +toString() +tisk()
27 class ZapornyZustatek extends Exception { public ZapornyZustatek(){ ZapornyZustatek(){ super("Zaporny super("Zaporny zustatek"); zustatek"); } } public class Ucet { private int cislo; cislo; private int stav; // Konstruktory tridy Ucet public Ucet() Ucet() { this(0, 0); } public Ucet( Ucet(int cislo, cislo, int stav) { this. this.cislo = cislo; cislo; this.stav this.stav = stav; } public void vlozeni (int castka castka) ) { stav = stav + castka; castka;
}
public int vyber (int (int castka) castka) throws ZapornyZustatek { if(stav if(stav - castka < 0) throw new ZapornyZustatek(); ZapornyZustatek(); stav = stav - castka; castka; return stav; } public String toString() toString() { String tx = "Cislo "Cislo uctu: uctu: " + cislo + " stav: " + stav; return tx; tx; }
Osnova
28 public class Adresa { private String ulice; private int cislo; cislo; private String mesto; mesto; // konstruktor deklarace public Adresa() { this(" this("nezadana“ nezadana“, 0, "neuvedene“ neuvedene“); } public Adresa(String Adresa(String ulice, int cislo, cislo, String mesto) mesto) { this.ulice this.ulice = ulice; this. this.cislo = cislo; cislo; this. this.mesto= mesto= mesto; mesto; } public String toString() toString() { return "Ulice: "+ ulice+ " cislo: cislo: "+ cislo+ cislo+ " mesto: mesto: "+ mesto; mesto; } public void tisk() { System. System.out. out.println( println( this. this.toString()); toString()); } }
Osnova
29 import java. java.util.*; util.*; public class Osoba { private String jmeno; jmeno; private int rokNarozeni; rokNarozeni; private Adresa adresa; adresa; private int ido; ido; // jednoznač jednoznačná identifikace private List Ucet> ucty; // seznam učtů osoby // deklarace konstruktoru public Osoba() { this("neuvedeno",0, this("neuvedeno",0,new ("neuvedeno",0,new Adresa(),0); } public Osoba(String Osoba(String jmeno, jmeno, int rokNarozeni, rokNarozeni, Adresa adresa, adresa, int ido) ido) { this. this.jmeno= jmeno= jmeno; jmeno; this. this.rokNarozeni = rokNarozeni; rokNarozeni; this.adresa this.adresa = adresa; this. this.ido = ido; ido; ucty = new ArrayList< ArrayList(); Ucet>(); } // pristupove a modifikacni metody public void setJmeno( setJmeno(String jmeno) jmeno) { this. } this.jmeno = jmeno; jmeno; public String getJmeno() getJmeno() { return jmeno; jmeno; } public void setRokNarozeni( setRokNarozeni(int rokNarozeni) rokNarozeni) { this. this.rokNarozeni = rokNarozeni; rokNarozeni; }
Osnova
30
Osnova
public int getRokNarozeni() getRokNarozeni() { return rokNarozeni; } rokNarozeni; public int getVek() getVek() { Calendar c = Calendar. Calendar.getInstance(); getInstance(); return c.get c.get(1) get(1) - getRokNarozeni(); getRokNarozeni(); } public void setAdresa(Adresa setAdresa(Adresa adresa) adresa) { this.adresa this.adresa = adresa; } public Adresa getAdresa() getAdresa() { return adresa; } public String toString() toString() { return String. String.format("%5s format("%5s %s %15s %4d %5s %s\ %s\n", "Jmeno", Jmeno",getJmeno ",getJmeno(),"rok getJmeno(),"rok narozeni:",getRokNarozeni narozeni:",getRokNarozeni(), getRokNarozeni(), "adresa:",adresa.toString "adresa:",adresa.toString()); toString()); } public void tiskOsoba() tiskOsoba() { System. System.out. out.println( println(this. this.toString()); toString());
}
public void tisk(){ tiskOsoba(); tiskOsoba(); ListIterator Ucet> iterator = ucty.listIterator ucty.listIterator(); listIterator(); while( while(iterator. iterator.hasNext()) hasNext()) iterator. iterator.next().tisk(); next().tisk(); }
31 public List getUcty(){ getUcty(){ return ucty; } public int getIdo(){ getIdo(){ return ido; ido; } public void setIdo( setIdo(int ido){ ido){ this. this.ido = ido; ido; } public Ucet novyUcet( novyUcet(int cislo, cislo, int stav){ Ucet ucet = new Ucet( Ucet(cislo, cislo, stav); ucty.add ucty.add( add(ucet); ucet); // př přidá idání účtu do seznamu účtů return ucet; ucet; } public Ucet najdiUcet( najdiUcet(int cislo){ cislo){ Ucet ucet = null; null; ListIterator Ucet> iterator = ucty.listIterator ucty.listIterator(); listIterator(); while( while(iterator. iterator.hasNext()){ hasNext()){ ucet= ucet=iterator. iterator.next(); next(); if( if(ucet. ucet.getCislo() getCislo() == cislo) cislo) return ucet; ucet; } return null; null; } }
Osnova
32 import java. java.util.*; util.*; public class SeznamKlientu extends ArrayList{ ArrayList{ public SeznamOsob(){ SeznamOsob(){ super(); } public Osoba najdiKlienta( najdiKlienta(int id){ Osoba ob = null; null; ListIterator ListIterator iterator = listIterator(); listIterator(); while( while(iterator. iterator.hasNext()) hasNext()) { ob = iterator. iterator.next(); next(); if(id if(id == ob.getIdo ob.getIdo()) getIdo()) return ob; } return null; null; } public void tisk(){ ListIterator iterator = listIterator(); listIterator(); while( while(iterator. iterator.hasNext()) hasNext()) iterator. iterator.next().tisk(); next().tisk(); } public void tiskKlientu(){ tiskKlientu(){ ListIterator iterator = listIterator(); listIterator(); while( while(iterator. iterator.hasNext()) hasNext()) iterator.next iterator.next(). next().tiskOsoba ().tiskOsoba(); tiskOsoba(); } }
Osnova
33 public class BankSystem { private SeznamOsob seznamOsob; seznamOsob; public BankSystem(){ seznamOsob = new SeznamOsob(); SeznamOsob(); } public void novaOsoba novaOsoba( (String jmeno, jmeno, int rokNarozeni, rokNarozeni, Adresa adresa, adresa, int ido){ ido){ Osoba osoba = new Osoba(jmeno Osoba(jmeno, jmeno, rokNarozeni, rokNarozeni, adresa, ido); ido); seznamOsob. seznamOsob.add(osoba); add(osoba); } public void novaOsoba(Osoba novaOsoba(Osoba osoba){ osoba){ seznamOsob. seznamOsob.add(osoba); add(osoba); } public void novyUcet( novyUcet(int ido, ido, int cislo, cislo, int stav){ Osoba osoba = null; null; osoba = seznamKlientu. seznamKlientu.najdiKlienta( najdiKlienta(ido); ido); if(osoba if(osoba == null) null)System. System.out. out.println( println(„Osoba se zadanym ido: ido: “ +ido+" ido+" v seznamu osob neni"); neni"); else osoba.novyUcet osoba.novyUcet( novyUcet(cislo, cislo, stav); }
Osnova
34 public void vlozeni( vlozeni(int ido, ido, int cislo, cislo, int castka){ castka){ Osoba klient = null; null; Ucet ucet = null; null; klient = seznamKlientu. seznamKlientu.najdiKlienta( najdiKlienta(ido); ido); if(osoba if(osoba == null) null)System. System.out. out.println( println(„Osoba se zadanym ido: ido: "+ido "+ido+ ido+ " v seznamu osob neni"); neni"); else { ucet = (Ucet (Ucet) Ucet) osoba.najdiUcet osoba.najdiUcet( najdiUcet(cislo); cislo); if( if(ucet == null) null) System. System.out. out.println(" println("Ucet ("Ucet s cislem: cislem: "+cislo "+cislo+" cislo+" v systemu neni"); neni"); else ucet. ucet.vlozeni( vlozeni(castka); castka); } } public void vyber(int vyber(int ido, ido, int cislo, cislo, int castka){ castka){ Osoba osoba = null; null; Ucet ucet = null; null; osoba = seznamKlientu. seznamKlientu.najdiKlienta( najdiKlienta(ido); ido); if(osoba if(osoba == null) null)System. System.out. out.println( println(„Osoba se zadanym ido: ido: "+ido "+ido+ ido+ " v seznamu osob neni"); neni"); else { ucet = (Ucet (Ucet) Ucet) osoba.najdiUcet osoba.najdiUcet( najdiUcet(cislo); cislo); if( if(ucet == null) null) System. System.out. out.println(" println("Ucet ("Ucet s cislem: cislem: "+cislo "+cislo+" cislo+" v systemu neni"); neni"); else try {ucet.vyber( ucet.vyber(castka .vyber(castka);} castka);} catch (ZapornyZustatek zz){ zz){ System. System.err. err.println( println(zz. zz.getMessage()); getMessage()); } } }
Osnova
35 public void tiskOsob(){ tiskOsob(){ seznamOsob. seznamOsob.tiskOsoba(); tiskOsoba(); } public void tisk(){ seznamOsob.tisk(); seznamOsob.tisk(); } }
Osnova
36 public class BankSystemTest { public static void main( main(String args[]){ args[]){ BankSystem bankSystem = new BankSystem(); bankSystem. bankSystem.novyOsoba("Jan",1950, novyOsoba("Jan",1950, new Adresa("Mlynska Adresa("Mlynska", Mlynska", 22, "Ostrava"),1); bankSystem. bankSystem.novaOsoba("Alena",1980, novaOsoba("Alena",1980, new Adresa("Hlavni", 14,"Havirov 14,"Havirov"),2); Havirov"),2); bankSystem. bankSystem.novyUcet(1,10,100); novyUcet(1,10,100); bankSystem. bankSystem.novyUcet(1,12,200); novyUcet(1,12,200); bankSystem. bankSystem.novyUcet(2,21,300); novyUcet(2,21,300); bankSystem. bankSystem.tiskKlientu(); tiskKlientu(); bankSystem.tisk(); bankSystem.tisk(); bankSystem. bankSystem.vlozeni(1,12,5555); vlozeni(1,12,5555); bankSystem.vyber(2,21,4444); bankSystem.vyber(2,21,4444); bankSystem.tisk(); bankSystem.tisk(); } }
Osnova
37 Jmeno Jan Ostrava Jmeno Alena Havirov Jmeno Jan Ostrava
rok narozeni: narozeni: 1950 adresa: adresa: Ulice: Ulice: Mlynska cislo: cislo: 22 mesto: mesto:
rok narozeni: narozeni: 1980 adresa: adresa: Ulice: Ulice: Hlavni cislo: cislo: 14 mesto: mesto:
rok narozeni: narozeni: 1950 adresa: adresa: Ulice: Ulice: Mlynska cislo: cislo: 22 mesto: mesto:
Cislo uctu: uctu: 10 stav: stav: 100 Cislo uctu: stav: : 200 uctu: 12 stav Jmeno Alena rok narozeni: narozeni: 1980 adresa: adresa: Ulice: Ulice: Hlavni cislo: cislo: 14 mesto: mesto: Havirov Cislo uctu: uctu: 21 stav: stav: 300 Nedostatecne kryti uctu Jmeno Jan rok narozeni: narozeni: 1950 adresa: adresa: Ulice: Ulice: Mlynska cislo: cislo: 22 mesto: mesto: Ostrava Cislo uctu: uctu: 10 stav: stav: 100 Cislo uctu: uctu: 12 stav: stav: 5755 Jmeno Alena rok narozeni: narozeni: 1980 adresa: adresa: Ulice: Ulice: Hlavni cislo: cislo: 14 mesto: mesto: Havirov Cislo uctu: uctu: 21 stav: stav: 300
Osnova
Bankovní systém – úprava rušení účtů a klientů •
rušení účtu: 1. vyhledat klienta (osobu) ze seznamuKlientů 2. vyhledat účet ze seznamuUčtů klienta 3. odstranit zadaný účet pomocí metody remove() / možno provést i pomocí iterace
•
rušení klienta 1. vyhledání klienta a zrušení všech jeho účtů 2. zrušení samotného klienta
38
39 CLASS OSOBA public void zrusUcet( zrusUcet(Ucet ucet){ ucet){ ucty. ucty.remove( remove(ucty. ucty.indexOf( indexOf(ucet)); ucet)); } CLASS BANKSYSTEM public void zrusitUcet( zrusitUcet(int ido, ido, int cislo){ cislo){ Osoba klient = null; null; klient = seznamKlientu. seznamKlientu.najdiKlienta( najdiKlienta(ido); ido); if(klient if(klient == null) null)System. System.out. out.println("Klient println("Klient se zadanym ido: ido: "+ido "+ido+ ido+ " v seznamu klientu neni"); neni"); else { Ucet ucet = klient.najdiUcet klient.najdiUcet( najdiUcet(cislo); cislo); if( if(ucet == null) null)System. System.out. out.println(" println("Ucet ("Ucet cislo: cislo: "+cislo "+cislo+ cislo+ " neni v seznamu"); else klient.zrusUcet klient.zrusUcet( zrusUcet(ucet); ucet); } } public void zrusitKlienta( zrusitKlienta(int ido){ ido){ Osoba klient = seznamKlientu. seznamKlientu.najdiKlienta( najdiKlienta(ido); ido); if(klient if(klient == null) null)System. System.out. out.println("Klient println("Klient se zadanym ido: ido: "+ido "+ido+ ido+ " v seznamu klientu neni"); neni"); else { klient.getUcty klient.getUcty(). getUcty().clear ().clear(); clear(); //zruseni //zruseni uctu klienta seznamKlientu. seznamKlientu.remove( remove(seznamKlientu. seznamKlientu.indexOf(klient)); indexOf(klient)); } }
Osnova Programové řešení třídy rodina
40 BANK SYSTEM TEST
RUSENI
bankSystem. bankSystem.zrusitUcet(1, zrusitUcet(1, 10); System. System.out. out.println(" println("Vypis ("Vypis"); Vypis"); bankSystem.tisk(); bankSystem.tisk(); bankSystem.zrusitKlienta bankSystem.zrusitKlienta(2); zrusitKlienta(2); System. System.out. out.println("Vypis2"); println("Vypis2"); bankSystem.tisk(); bankSystem.tisk();
Osnova Programové řešení třídy rodina
Bankovní systém nekonečná smyčka • hlavní program se upraví tak, aby obsahoval smyčku a skončil, až uživatel zadá konec • jinak si uživatel může vybírat z nabízených operací
41
42
Osnova boolean podmí podmínka = true; //implicitne //implicitne false while(podminka){ while(podminka){
// nastaveni nove podminky podminka = true; // false }
Programové řešení třídy rodina
43
Bankovní systém - úprava • bankovní systém obsahuje jeden seznam všech klientů a jeden seznam všech úctů • každý klient má navíc svůj seznam (svých) účtů • každý účet – objekt je v bankovním systému pouze jedenkrát, ale je uvedený ve dvou seznamech – viz UML diagram tříd
44
45
Počítání zadaných slov ve větách • • •
Je zadaných několik vět. Věty se skládají ze slov. Slovo může obsahovat vlastní řetězec a počet jeho výskytů. • Počet slov vyskytujících se více než? 1. Zobrazit pouze výstup 2. Vytvořit nový seznam vět pouze se slovy, vyskytujícími se více než …
Počítání zadaných slov ve větách Identifikace tříd • třída Slovo – obsahuje řetězec a počet výskytů – obsahuje všechny potřebné metody
• třída Veta – obsahuje seznam slov – obsahuje potřebné metody
• třída SeznamVet – obsahuje seznam vet
• řešení realizace seznamu v seznamu (mohou být i další)
46
Počet zadaných slov diagram tříd UML ArrayList
SeznamVet
1 * Veta
1 1 SeznamSlov
1 * Slovo
47
48 public class Slovo { private String slovo; private int pocet; pocet; public Slovo(){ this("", this("", 1); } public Slovo(String Slovo(String s, int p){ slovo = s; pocet = p; } public int getPocet(){ getPocet(){ return pocet; pocet; } public void increment(){ increment(){ pocet++; pocet++; } public void setSlovo( setSlovo(String s){ slovo = s; } public String getSlovo(){ getSlovo(){ return slovo; } public String toString(){ toString(){ return String. String.format("%s format("%s %d", getSlovo(), getSlovo(), getPocet()); getPocet()); } public boolean viceNez( viceNez(int cislo){ cislo){ if( if(getPocet()> getPocet()>cislo ()>cislo) cislo)return true; true; else return false; false; } }
Osnova
49 import java. java.util. util.ArrayList; ArrayList; import java. java.util.List; util.List; import java. java.util. util.ListIterator; ListIterator; public class Veta { private List<Slovo> veta; public Veta(){ veta = new ArrayList<Slovo>(); ArrayList<Slovo>(); } public void vlozit( vlozit(String string){ string){ Slovo slovo = hledat(string hledat(string); string); if (slovo == null) null) veta.add veta.add( add(new Slovo(string Slovo(string, string, 1)); else slovo.increment slovo.increment(); increment(); } public void vlozit(Slovo vlozit(Slovo slovo){ slovo){ veta.add veta.add(slovo); add(slovo); } public Slovo hledat(String hledat(String string){ string){ Slovo result = null; null; ListIterator<Slovo> ListIterator<Slovo> li = veta.listIterator veta.listIterator(); listIterator(); while(li. while(li.hasNext (li.hasNext()){ hasNext()){ result = li.next li.next(); next(); if( if(result. result.getSlovo(). getSlovo().equals ().equals( equals(string)) string))return ))return result; result; } return null; null; }
Osnova
50 public String viceNez( viceNez(int cislo){ cislo){ String string = ""; Slovo result = null; null; ListIterator<Slovo> ListIterator<Slovo> li = veta.listIterator veta.listIterator(); listIterator(); while(li. while(li.hasNext (li.hasNext()){ hasNext()){ result = li.next li.next(); next(); if( if(result. result.viceNez( viceNez(cislo)) cislo)) string += result. result.getSlovo(). getSlovo().toString ().toString()+" toString()+"\ ()+"\n"; } return string; string; } public String toString(){ toString(){ String retez = ""; ListIterator<Slovo> ListIterator<Slovo> li = veta.listIterator veta.listIterator(); listIterator(); while(li. while(li.hasNext (li.hasNext()) hasNext()) retez += li.next li.next(). next().toString ().toString()+" toString()+"\ ()+"\n"; return retez; retez; } public Veta novaVeta( novaVeta(int p){ Veta veta1 = new Veta(); Slovo vysledek = null; null; ListIterator<Slovo> ListIterator<Slovo> li = veta.listIterator veta.listIterator(); listIterator(); while(li. while(li.hasNext (li.hasNext()){ hasNext()){ vysledek = li.next li.next(); next(); if( if(vysledek. vysledek.getPocet()>p) getPocet()>p) veta1.vlozit veta1.vlozit( vlozit(vysledek); vysledek); } return veta1; } }
Osnova Programové řešení třídy rodina
51 import java. java.util. util.ArrayList; ArrayList; import java. java.util. util.StringTokenizer; StringTokenizer; import java. java.util. util.ListIterator; ListIterator; public class SeznamVet extends ArrayList{ ArrayList{ public SeznamVet(){ SeznamVet(){ super(); } public void vlozit( vlozit(String retez){ retez){ Veta veta = new Veta(); StringTokenizer st = new StringTokenizer( StringTokenizer(retez); retez); while(st. while(st.hasMoreTokens (st.hasMoreTokens()){ hasMoreTokens()){ String slovo = st.nextToken st.nextToken(). nextToken().toLowerCase ().toLowerCase(); toLowerCase(); veta.vlozit veta.vlozit(slovo); vlozit(slovo); } this. this.add(veta); add(veta); } public String toString( toString(int p){ String s = ""; ListIterator ListIterator li = listIterator(); listIterator(); while(li. while(li.hasNext (li.hasNext()){ hasNext()){ s += String. String.format("%d format("%d veta: \n", li.nextIndex li.nextIndex()+1); nextIndex()+1); s += li.next li.next(). next().viceNez ().viceNez(p); viceNez(p); } return s; }
Osnova
52 public void tisk(int tisk(int p){ System. System.out. out.println("Seznam println("Seznam slov tisk:\ tisk:\n"+this n"+this. this.toString(p)); toString(p)); } public String toString(){ toString(){ String s = ""; ListIterator ListIterator li = listIterator(); listIterator(); while(li. while(li.hasNext (li.hasNext()){ hasNext()){ s += String. String.format("%d format("%d veta: \n", li.nextIndex li.nextIndex()+1); nextIndex()+1); s += li.next li.next(). next().toString ().toString(); toString(); } return s; } public void tisk(){ System. System.out. out.println("Seznam println("Seznam slov tisk:\ tisk:\n"+this n"+this. this.toString()); toString()); } public SeznamVet novySeznam( novySeznam(int p){ SeznamVet seznam = new SeznamVet(); SeznamVet(); ListIterator ListIterator li = listIterator(); listIterator(); while (li.hasNext (li.hasNext()){ hasNext()){ Veta veta = li.next li.next(). next().novaVeta ().novaVeta(p); novaVeta(p); seznam.add seznam.add(veta);} add(veta);} return seznam; } }
Osnova Programové řešení třídy rodina
53 import java java. .util. util. Scanner; import java. java.util. util.StringTokenizer; StringTokenizer; public class VetaTest { public static void main( main(String[] String[] args) args) { SeznamVet seznamVet = new SeznamVet(); SeznamVet(); Scanner scanner = new Scanner(System Scanner(System.in); System.in); System. System.out. out.println("Zadejte println("Zadejte nekolik vet: "); String vstup = scanner.nextLine scanner.nextLine(); nextLine(); StringTokenizer tokenizer = new StringTokenizer(vstup, StringTokenizer(vstup, "."); while( while(tokenizer. tokenizer.hasMoreTokens()){ hasMoreTokens()){ String retez = tokenizer. tokenizer.nextToken(). nextToken().toLowerCase ().toLowerCase(); toLowerCase(); seznamVet. seznamVet.vlozit( vlozit(retez); retez); } seznamVet.tisk(2); seznamVet.tisk(2); SeznamVet sv = seznamVet. seznamVet.novySeznam(2); novySeznam(2); sv.tisk(); } }
Osnova
54 Zadejte nekolik vet: Jak se to to to ale ale ale. Jiny novy tak tak tak tak. Seznam slov tisk: 1 veta: to ale 2 veta: tak Seznam slov tisk: 1 veta: to 3 ale 3 2 veta: tak 4
Osnova
55
Jednoduchý IS knihovny • Základní třídy: – kniha – autor
• Další třídy: – seznam knih – seznam autorů – seznam knih autora
56
Jednoduchý IS knihovny Generický Seznam
Seznam Autorů
1
Seznam Knih
1 * Autor 1 1
*
1 Seznam Knih Autora
Kniha
1
1
57
IS knihovny - pokračování • Další doplněné třídy: – Čtenář – seznamČtenářů – Transakce – sekvenční soubor zaznamenávající transakce výpůjčky a vrácení – seznamTransakcí – generický seznam – nadtřída / rozhraní
58
IS knihovny - pokračování Knihovna
1
*
1
GenerickySeznam
1
*
* SeznamCtenaru
SeznamTransakci
*
SeznamKnih
1
1
*
*
Ctenar
Trarnsakce 1
1 1
1
1
* VypujceneKnihy
Kniha 1
1
59
Univerzita – základní diagram • Základní třídy: – Student, Kurz, Učitel
• Třídy seznamů: – – – –
seznamStudentů seznamUčitelů seznamKurzů seznamKurzůStudenta
• vazba kurzu na Učitele
60
61
Univerzita – rozšířený diagram • doplnění: – seznam vyučovaných kurzů učitele
• možno doplnit o: – seznam absolvovaných kurzů studenta
62
Univerzita – rozšířený diagram