PB162/1213: Porovnání verzí

Z FI WIKI
Přejít na: navigace, hledání
m (Kolekce, Generické typy, Porovnávání)
(Příklad)
 
(Není zobrazena jedna mezilehlá verze od stejného uživatele.)
Řádka 125: Řádka 125:
 
** add()...
 
** add()...
 
* Seznam = rozhraní List
 
* Seznam = rozhraní List
 +
* Fronta = rozhraní Queue
 
* Vector, Hashtable (synchronizované)
 
* Vector, Hashtable (synchronizované)
 
Implementace
 
Implementace
Řádka 151: Řádka 152:
  
 
=== Příklad ===
 
=== Příklad ===
počítáme důchody
+
počítáme důchody
 
# záznamy o důchodovém pojištění jsou uloženy v ročních záznamech. Ty mají u sebe určen '''rok''' ve kterém proběhly, a tzv. '''znak hodnocení''', textový popisek -> třída DobaPojisteni. Že jsou záznamy duplicitní se pozná podle toho, že mají zadaný tentýž rok i znak hodnocení.
 
# záznamy o důchodovém pojištění jsou uloženy v ročních záznamech. Ty mají u sebe určen '''rok''' ve kterém proběhly, a tzv. '''znak hodnocení''', textový popisek -> třída DobaPojisteni. Že jsou záznamy duplicitní se pozná podle toho, že mají zadaný tentýž rok i znak hodnocení.
 
# záznamy jednoho budoucího důchodce jsou uloženy společně s jeho rokem narození a jménem -> třída Zadatel
 
# záznamy jednoho budoucího důchodce jsou uloženy společně s jeho rokem narození a jménem -> třída Zadatel

Aktuální verze z 19. 11. 2007, 14:09

Úloha na 3. cvičení

Simulace mezinárodního obchodu se zbraněmi

  • samotné zbraně
  • výrobci
  • obchodníci
  • oběti

Zbraň

 
public class Weapon {
	private String name;
	private int price;
	public Weapon(String newName, int price) {
		name=newName;
		this.price=price;
 
	}
	public String getName() {
		return name;
	}
	public int getPrice() {
		return price;
	}
}

Výrobce

 
public class WeaponFactory {
	private String name;
	public Weapon buildWeapon(String name, int price);
	public static void main(String[] args);
}

Obchodníci

 
public interface WeaponDealer {
	int getWeaponCount();
	void buyWeapon(Weapon w);
	void sellWeapon(Weapon w);
	void resellWeapon(Weapon w, WeaponDealer wd);
}


Úkol

  • Překupník, má své jméno, má své peníze, může být dealerem, může zároveň obchodovat jen s jednou zbraní. nákup zbraně musí zaručit svými penězi (tj. když koupí zbraň, o její cenu se sníží množství jeho penez v peněžence).
  • Stát - ti jsou taky překupníky zbraní nákup a prodej nepracuje s penězi, to se zaplatí ze státního rozpočtu
    • navíc má atribut "počet obyvatel", a metodu "testovat zbraň", ta dostane jako parametr zbraň a po jejím testu se sníží počet obyvatel o 5000.
    • bonusový úkol v bonusové úloze - může pracovat až se 2 zbraněmi naráz
    • akce sell a buy vypisou informace, kdo co koupil
  • Továrna - vyrábí zbraně.
    • + spustitelná metoda ...
      • vytvoříme překupníka a nějak nápaditě ho pojmenujeme
      • vytvoříme stát, který je schopný otestovat aspoň jednu zbraň, vyhlásíme nezávislost
      • vytvoříme továrnu
        • tovarna postupně vyrobí několik zbraní
        • jednu prodá státu, ten ji vyzkouší na obyvatelstvu
        • druhou prodá překupníkovi, ten ji prodá státu, ten mu ji prodá zpět a on ji prodá pryč...
  • začátek budeme řešit na cvičení, dokončit můžete doma (+ bod za přidání globální statistiky, výpisu stavu objektů...)

4. cvičení

  • Úloha 3; ... do 19. října
  • objekty:
    • obdélník
    • čtverec
  • objekty:
    • trojúhelník
    • rovnostranný trojúhelník
  • objekty:
    • trojúhelník
    • obdélník
  • objekty:
    • vrchol
    • trojúhelník

Úkoly

0)

  • vytvořte rozhraní Rotable s metodou void rotate(int angle);

1)

  • vytvořte třídu Point... atribut x,y, parametrický konstruktor s dvěma parametry, toString "[x,y]"
  • vytvořte třídu MyTriangle... 3 atributy pro vrcholy a 3 atributy pro délky stran, to String "A [x,y], B [x,y], C [x,y]"
  • jeho metoda main ... vytvoří 2 trojúhelníky, nainicializuje různými hodnotami, vypíše o nich informace

2)

  • vytvořte (prázdnou) třídu Square
  • vytvořte (prázdnou) třídu Triangle
  • vytvořte (prázdnou) třídu Point
  • vytvořte (prázdnou) třídu GeometricalObject
    • jaké vytvoříte vztahy mezi těmito třídami pomocí rozhraní Rotable a dědičností?

3)

  • vytvořte třídu EquilateralTriangle ... rovnostranný trojúhelník
    • jak?

5. cvičení

Mějme svět, kde existují studenti a předměty. Student má jméno a učo. Definujte pro něj gettery, settery a toString. Předmět má kód (textový), název. Mohou se do něj nahlásit maximálně dva studenti (je to opravdu malý předmět). Nadefinujte konstruktor s kódem a názvem, nadefinujte konstruktor s kódem, názvem, a jménem a učem dvou studentů. Vytvořte toString předmětu (výpis jeho dat a jeho studentů)

Vymyslete si jména a uča dvou studentů a kódy jednoho předmětu. Vytvořte předmět a přihlašte do něj dva studenty, vypište výsledek.

Kolekce, Generické typy, Porovnávání

Vlastnosti

  • Objekt
  • Jiný než přístup pomocí indexu
    • iterator
      • iterator(), hasNext(), next()
    • foreach cyklus
    • indexy (např. Vector)
  • Možnost změn mimo deklaraci
  • Možnost dalších algoritmů
    • Colections

Typy

  • Asociativní kolekce - klíč -> hodnota = rozhraní Map
    • put(), get(), remove()
  • Množina = rozhraní Set
    • add()...
  • Seznam = rozhraní List
  • Fronta = rozhraní Queue
  • Vector, Hashtable (synchronizované)

Implementace

  • Hash* = hashovací tabulky
    • nutné hashCode()
      • pravidlo u hashCode()
        • pro stejný objekt musí vrátit vždy stejnou hodnotu
        • pokud jsou objekty "stejné" podle equals, musí mít stejné hashCode
      • pravidlo pro equals()
        • reflexivnost, transitivnost, konsistentnost, symetričnost, s null = false
  • Tree* = uspořádaná množina/asociativní kolekce, pomocí černobílého stromu
    • nutná implementace rozhraní Comparable, nebo dodat třídu Comparator (v konstruktoru)

Generické typy

  • určení povoleného obsahu v kolekci (jinak Object)
  • ale i např. v rozhraní

Porovnávání

  • tvořím svou = mohu implementovat rozhraní Comparable<T>
    • compareTo(T o)
      • <0 = "náš" je menší, 0 = "náš" je stejný, >0 = "náš" je větší
      • dost často stačí this.id - o.id
  • Potřebuju pracovat s cizí, existující třídou, kterou nemohu měnit = třída comparator
    • compare(T o1, T o2)
      • <0 = o1 je menší, 0 = o1 je stejný, >0 = o1 je větší

Příklad

počítáme důchody

  1. záznamy o důchodovém pojištění jsou uloženy v ročních záznamech. Ty mají u sebe určen rok ve kterém proběhly, a tzv. znak hodnocení, textový popisek -> třída DobaPojisteni. Že jsou záznamy duplicitní se pozná podle toho, že mají zadaný tentýž rok i znak hodnocení.
  2. záznamy jednoho budoucího důchodce jsou uloženy společně s jeho rokem narození a jménem -> třída Zadatel
  3. určitá žádost je určena žadatelem a rokem, kdy žádost podal. - trida Zadost
    • tato třída v sobě bude mít i metodu na zkontrolování nároku testRetirement(Zadatel zadatel)
      • vypíše buď "Žádost žadatele <JMENO>, narozeného <ROKNAR> byla schválena", nebo "Žádost žadatele <JMENO>, narozeného <ROKNAR> byla zamítnuta, neboť seznam jeho dob pojištění obsahuje duplicitu".
    • Třída bude mít spustitelnou metodu. Ta vytvoří zkušebního žadatele, jemu zavede 5 zkušebních dob pojištění (z toho 1 duplicitní), vypíše tyto doby seřazeně dle roku (jako kolekci?) a na závěr zkontroluje nárok na důchod (pustí výše zmíněnou metodu)