====== 3. Cvičení ====== Toto cvičení je zaměřeno na základy práce s objekty a jejich metodami. Následuje jejich aplikace ve spojovém seznamu. ===== Úkoly na cvičení ===== ====Část 1==== - Vytvořte v Netbeans nový projekt, v balíčku ''cz.cvut.fel.pjv'' vytvořte třídu ''Main'' obsahující metodu ''main'' - vstupní bod programu. - V balíčku ''cz.cvut.fel.pjv.cars.model'' vytvořte třídu Car s následujícími vlastnostmi a zajistěte vhodné zapouzdření: * ''manufacturer'' * ''modelName'' * ''year'' - Přidejte vlastnost vinCode datového typu UUID, při inicializaci generujte novou hodnotu pomocí ''UUID.randomUUID()''. - Přepište metodu ''toString'', která bude vracet řetězec typu "Volkswagen Polo year 2010 VIN: 38e8a15e-521c-466a-98e0-f78c03fcdb94.". - Realizujte čítač vytvořených aut. Aktuální počet bude vracet metoda ''getNumberOfExistingCars()''. - Implementujte metody ''equals'' a ''hashcode''. Při zjišťování zda objekty jsou stejné porovnávejte pouze ''vinCode''. - Přidejte následující kód do metody ''main'' a ověřte výstup programu. Car car1 = new Car("Volkswagen", "Polo", 2010); System.out.println(car1); System.out.println("Počet aut: " + Car.getNumberOfExistingCars()); Car car2 = new Car("Chevrolet", "Corvette", 1980); System.out.println(car2); System.out.println("Počet aut: " + Car.getNumberOfExistingCars()); Volkswagen Polo year 2010 VIN: 38e8a15e-521c-466a-98e0-f78c03fcdb94. Počet aut: 1 Chevrolet Corvette year 1980 VIN: 38d302ff-e1e1-41b5-b53b-5df1a3add882. Počet aut: 2 ====Část 2==== - Implementujte třídu ''Engine'' se zapouzdřenou vlastností type. Implementujte metody equals, hashcode, toString. Pomocí kompozice realizujte vazbu has-a mezi ''Car'' a ''Engine'', do konstruktoru Car přidejte řetězec popisující typ motoru jako vstupní parametr. - Implementujte třídu ''ServiceBook'' obsahující pole řetězců serviceRecords o interně dané kapacitě. Vytvořte konstruktor ''ServiceBook(Car car)'', který vytvoří servisní knížku pro dané auto. ''ServiceBook'' přidejte jako další datový atribut do třídy ''Car'' a implementujte jako vlastnost pouze pro čtení. Realizujte obousměrnou vazbu mezi třídami ''ServiceBook'' a ''Car''. V případě, že auto již servisní knížku má, bude tato přepsána. Situaci by však bylo vhodnější ošetřit pomocí výjimky (naučíte se později). - Upravte kód metody ''main'' následovně a ověřte výstup programu. Car car1 = new Car("Volkswagen", "Polo", 2010, "AKK"); ServiceBook serviceBook1 = new ServiceBook(car1); serviceBook1.addRecord("První servisní prohlídka."); System.out.println(car1); System.out.println("Počet aut: " + Car.getNumberOfExistingCars()); System.out.printf("Servisní záznamy %s %s:\n%s\n", car1.getManufacturer(), car1.getModelName(), car1.getServiceBook()); Car car2 = new Car("Chevrolet", "Corvette", 1980, "LS7"); ServiceBook serviceBook2 = new ServiceBook(car2); serviceBook2.addRecord("První servisní prohlídka."); serviceBook2.addRecord("Porucha motoru."); System.out.println(car2); System.out.println("Počet aut: " + Car.getNumberOfExistingCars()); System.out.printf("Servisní záznamy %s %s:\n%s\n", car2.getManufacturer(), car2.getModelName(), car2.getServiceBook()); Volkswagen Polo year 2010 VIN: 5ab16b5f-c504-41f3-ab28-8111c3fb4ab1. Počet aut: 1 Servisní záznamy Volkswagen Polo: První servisní prohlídka. Chevrolet Corvette year 1980 VIN: d18fe38c-dedc-42f3-90b4-0f63b2e40cfa. Počet aut: 2 Servisní záznamy Chevrolet Corvette: První servisní prohlídka. Porucha motoru. ====Část 3==== - V balíčku ''cz.cvut.fel.pjv.data'' implementujte třídu TimeSpan představující časový interval. Třída bude zapouzdřovat časové údaje ''hour'' (kladné celé číslo), ''minute'' (hodnota 0-60) , ''second'' (hodnota 0-60). - Implementujte přetížení konstruktorů ''(), (second), (minute, second), (hour, minute, second)'' a metodu ''setTime(hour, minute, second)''. V případě chybějících údajů umožněte přepočet na vyšší jednotky, tj. 70 sekund je 1 minuta a 10 sekund. V případě zadání vyššího údaje, ošetřete povolený rozsah. Pro 0 minut, 70 sekund bude chybný údaj sekund nastaven na 0 (později vhodné ošetření výjimkou). - Implementujte kopírovací konstruktor a metody ''equals, hashCode, toString''. Umožněte porovnání instancí této třídy podle celkového času. - Implementujte metodu ''getTotalSeconds()'' a metodu ''add(int second)'', která modifikuje danou instanci a vrátí referenci na ni. - Přidejte následující kód do metody ''main'' a ověřte výstup programu. TimeSpan t1 = new TimeSpan(0, 0, 130); System.out.println("T1: " + t1); t1 = new TimeSpan(130); System.out.println("T1: " + t1); TimeSpan t2 = new TimeSpan(t1).add(70); System.out.println("T1: " + t1); System.out.println("T2: " + t2); System.out.printf("Časy se %s.\n", t1.equals(t2) ? "rovnají" : "nerovnají"); t1 = t1.add(70); System.out.println("T1: " + t1); System.out.println("T2: " + t2); System.out.printf("Časy se %s.\n", t1.equals(t2) ? "rovnají" : "nerovnají"); T1: 0 hours 0 minutes 0 seconds T1: 0 hours 2 minutes 10 seconds T1: 0 hours 2 minutes 10 seconds T2: 0 hours 3 minutes 20 seconds Časy se nerovnají. T1: 0 hours 3 minutes 20 seconds T2: 0 hours 3 minutes 20 seconds Časy se rovnají. ====Část 4==== - V balíčku ''cz.cvut.fel.pjv.data'' implementujte třídu ''RaceResult''. Třída bude reprezentovat dvojici klíč-hodnota, kde klíčem bude auto (''Car'') a hodnotou čas jízdy daného auta (''TimeSpan''). Umožněte porovnání instancí třídy ''RaceResult'' podle evidovaného času. - V balíčku ''cz.cvut.fel.pjv.utils'' implementujte třídu ''ArrayUtil''. Zajistěte, že třídu nebude možné instancovat. Implementujte metodu třídy s názvem ''sort'', která provede řazení algoritmem Bubble sort nad polem objektů implementujících rozhraní ''Comparable'', tj. porovnatelných objektů. - Do třídy ''Car'' přidejte vlastnost ''speed'' udávající rychlost auta. - V balíčku ''cz.cvut.fel.pjv.data'' implementujte třídy ''CarListNode'' a ''CarLinkedList'' implementující spojový seznam aut. Implementujte metodu toArray() převádějící spojový seznam na pole o velikosti počtu prvků ve spojovém seznamu. - V balíčku ''cz.cvut.fel.pjv.cars'' implementujte třídu Race představující automobilový závod. Závod bude mít jako povinný parametr délku trasy ''length''. Závod bude mít neomezený počet startovních pozic (využijte spojový seznam). Metodou ''addRacingCar(Car car)'' se přidá vůz na první volnou startovní pozici. Metodá vrátí ''true'' při úspěchu a ''false'' v případě, že závod již odstartoval. Implementujte metody ''getWinner()'' a ''getWinningTime()'', které vrátí instanci vyhrávajícího auta, resp. čas jeho jízdy. V případě stejných časů bude výsledkem jedno z aut. Zajistěte, že výpočet výherce proběhne pouze jednou a bude cashován uvnitř třídy. Využijte pomocnou metodu ''getRaceResults()'' vracející pole ''RaceResult'' (párů auto-čas). Spojový seznam aut nejprve převeďte na pole. Při výpočtu času jízdy předpokládejte zjednodušenou situaci, kdy každé auto se od startu až po cíl (''length'') pohybuje konstantní rychlostí ''speed''. - Přidejte následující kód do metody ''main'' (existující první dva řádky upravte) a ověřte výstup programu. Car car1 = new Car("Volkswagen", "Polo", 2010, "AKK", 40); Car car2 = new Car("Chevrolet", "Corvette", 1980, "LS7", 45); Car car3 = new Car("Trabant", "P601", 1990, "Air cooled, 0.6-liter 2-stroke", 20); Car car4 = new Car("BMW", "3", 2006, "318d", 42); Car car5 = new Car("McLaren", "F1", 2014, "V12", 107); Race race = new Race(1000); race.addRacingCar(car1); race.addRacingCar(car2); race.addRacingCar(car3); race.addRacingCar(car4); race.addRacingCar(car5); System.out.println("Závodníci:"); System.out.println(race); System.out.printf("Výhercem se stává %s s časem %s.\n", race.getWinner(), race.getWinningTime()); System.out.printf("Pořadí v cíli:\n%s\n", race); Závodníci: Volkswagen Polo year 2010 VIN: 2b8a89b2-f15d-4a5a-a14e-8de9aca023d8 Chevrolet Corvette year 1980 VIN: 75e880b1-822d-49b5-9b5e-e8cca5f48e99 Trabant P601 year 1990 VIN: fce81b1e-2916-492a-974a-cac9d623608d BMW 3 year 2006 VIN: 7fb6c0b3-092a-4fb6-8e7f-590443ecadcc McLaren F1 year 2014 VIN: be54715d-54b1-40d3-9323-029f27a124c3 Výhercem se stává McLaren F1 year 2014 VIN: be54715d-54b1-40d3-9323-029f27a124c3 s časem 0 hours 0 minutes 9 seconds. Pořadí v cíli: McLaren F1 year 2014 VIN: be54715d-54b1-40d3-9323-029f27a124c3, time: 0 hours 0 minutes 9 seconds. Chevrolet Corvette year 1980 VIN: 75e880b1-822d-49b5-9b5e-e8cca5f48e99, time: 0 hours 0 minutes 22 seconds. BMW 3 year 2006 VIN: 7fb6c0b3-092a-4fb6-8e7f-590443ecadcc, time: 0 hours 0 minutes 23 seconds. Volkswagen Polo year 2010 VIN: 2b8a89b2-f15d-4a5a-a14e-8de9aca023d8, time: 0 hours 0 minutes 25 seconds. Trabant P601 year 1990 VIN: fce81b1e-2916-492a-974a-cac9d623608d, time: 0 hours 0 minutes 50 seconds. ===== Studijní materiály ===== ==== Debugging ==== V tomto cvičení byste se měli seznámit se základním použitím debuggeru v Netbeans. [[courses:b0b36pjv:tutorials:03:debug|Návod zde]]. ==== Javadoc ==== Javadoc je systém pro tvorbu dokumentace zdrojových kódů v Javě ve formátu prolinkovaného HTML. Několik pomůcek: * [[https://www.youtube.com/watch?v=BhkDnIjXVL8|Netbeans a generování Javadoc - YouTube]] * [[http://www.oracle.com/technetwork/articles/java/index-137868.html|Návod od Oracle]]