Krzysztof Barteczko - cwiczenia Java
Zadania na ćwiczenia
Zadanie 1. Odwracanie (max. 6 punktów)
Zadanie 2.
Sklep owocowy (max 6 punktów)
Dla realizacji zadania 2 należy skorzystać z POMOCY.
Zadanie 1 - odwrotności (max 6 punktów)
Zdefiniować interfejse Reversible z jedną metodą reverse() i zimplementować ją w klasach ReversibleString i ReversibleDouble.
Metoda reverse dla Stringów odwraca napis, a dla Doubli - odraca
liczbę (czyli z napisu kot robi tok a z liczby 3 robi 0.3333).
Zapewnić by następujący program wykonał się prawidłowo i dał pokazane wyniki:
public class ReverseTest { public ReverseTest() { Reversible[] r = new Reversible[] { new ReverseibleString("Kot"), new ReversibleDouble(2), new ReversibleDouble(3), new ReversibleString("Pies"), new ReversibleString("Ala ma kota i psa"), new ReversibleDouble(10), }; System.out.println("Normalne:"); // wypisanie inicjalnych wartości z tablicy r // odwrócenie wartości z tablicy r System.out.println("Odwrócone:"); // wypisanie odwróconych wartości z tablicy r System.out.println("Przywrócone i zmienione:"); // przywrócenie oryginalnych wartości (ponowne odwrócenie) i // i wypisanie ich z następującymi zmianami: // - dla Stringów dodanie przed napisem napisu "Tekst" // - dla liczb dodanie do liczby wartości 10 } public static void main(String[] args) { new ReverseTest(); }}Wynik:Normalne:Kot2.03.0PiesAla ma kota i psa10.0Odwrócone:toK0.50.3333333333333333seiPasp i atok am alA0.1Przywrócone i zmienione:Tekst Kot12.013.0Tekst PiesTekst Ala ma kota i psa20.0
Zadanie 2 (sklep owocowy - max 6 punktów)Kwiaciarnia
Napisać aplikację, która symuluje zakupy w kwiaciarni "samoobsługowej".
W kwiaciarni są kwiaty, kwiaty mają swoje nazwy oraz kolory. Ceny kwiatów znajdują się w cenniku.
Do kwiaciarni przychodzą klienci. Klienci mają imiona oraz dysponują jakimś
zasobem pieniędzy. Wybierają kwiaty i umieszczają je na wózku sklepowym. Następnie płacą
za zawartość wózka i przepakowują ją do pudełka (jakiegoś pudełka na kwiaty :-).
Aplikacja wymaga zdefiniowania kilku klas i umiejętnego ich użycia, w taki
sposób by następujący program działał poprawnie.
// Klasa "kwiaciarnia"class Florist { public Florist() { // Ustalenie cennika PriceList pl = PriceList.getInstance(); pl.set("róża", 10); pl.set("bez", 12); pl.set("piwonia", 8); }}// Klasa testującaclass FloristsTest { // tu definicja metody valueOf(Box pudelko, String kolor) zwracającej // sumaryczną wartość kwiatów o podanym kolorzez, znajdujących się w pudełku public static void main(String[] args) { // Kwiaciarnia samoobsługowa Florist kwiaciarnia = new Florist(); // Przychodzi klient janek. Ma 200 zł Customer janek = new Customer("Janek", 200); // Bierze różne kwiaty: 5 róż, 5 piwonii, 3 frezje, 3 bzy janek.get(new Rose(5)); janek.get(new Peony(5)); janek.get(new Freesia(3)); janek.get(new Lilac(3)); // Pewnie je umieścił na wózku sklepowyem // Zobaczmy co tam ma ShoppingCart wozekJanka = janek.getShoppingCart(); System.out.println("Przed płaceniem\n" + wozekJanka); // Teraz za to zapłaci... janek.pay(); // Czy przypadkiem przy płaceniu nie okazało się, // że w wozku są kwiaty na które nie ustalono jescze cceny? // W takim razie zostałyby usunięte z wózka i Janek nie płaciłby za nie System.out.println("Po zapłaceniu\n" + janek.getShoppingCart()); // Ile Jankowi zostało pieniędzy? System.out.println("Jankowi zostało : " + janek.getCash() + " zł"); // Teraz jakos zapakuje kwiaty (może do pudełka) Box pudelkoJanka = new Box(janek); janek.pack(pudelkoJanka); // Co jest teraz w wózku Janka... // (nie powinno już nic być) System.out.println("Po zapakowaniu do pudełka\n" + janek.getShoppingCart()); // a co w pudełku: System.out.println(pudelkoJanka); // Zobaczmy jaka jest wartość czerwonych kwiatów w pudełku Janka System.out.println("Czerwone kwiaty w pudełku Janka kosztowały: " + valueOf(pudelkoJanka, "czerwony") ); // Teraz przychodzi Stefan // ma tylko 60 zł Customer stefan = new Customer("Stefan", 60); // ąle nabrał kwiatów nieco za dużo jak na tę sumę stefan.get(new Lilac(3)); stefan.get(new Rose(5)); // co ma w wózku System.out.println(stefan.getShoppingCart()); // płaci i pakuje do pudełka stefan.pay(); Box pudelkoStefana = new Box(stefan); stefan.pack(pudelkoStefana); // co ostatecznie udało mu się kupić System.out.println(pudelkoStefana); // ... i ile zostało mu pieniędzy System.out.println("Stefanowi zostało : " + stefan.getCash() + " zł"); }}Program powinien wyprowadzić następujące wyniki:Przed płaceniemWózek własciciel Janekróża, kolor: czerwony, ilość 5, cena 10.0piwonia, kolor: czerwony, ilość 5, cena 8.0frezja, kolor: żółty, ilość 3, cena -1.0bez, kolor: biały, ilość 3, cena 12.0Po zapłaceniuWózek własciciel Janekróża, kolor: czerwony, ilość 5, cena 10.0piwonia, kolor: czerwony, ilość 5, cena 8.0bez, kolor: biały, ilość 3, cena 12.0Jankowi zostało : 74.0 złPo zapakowaniu do pudełkaWózek własciciel Janek -- pustoPudełko własciciel Janekbez, kolor: biały, ilość 3, cena 12.0piwonia, kolor: czerwony, ilość 5, cena 8.0róża, kolor: czerwony, ilość 5, cena 10.0Czerwone kwiaty w pudełku Janka kosztowały: 90.0Wózek własciciel Stefanbez, kolor: biały, ilość 3, cena 12.0róża, kolor: czerwony, ilość 5, cena 10.0Pudełko własciciel Stefanróża, kolor: czerwony, ilość 5, cena 10.0Stefanowi zostało : 10.0 zł
Uwaga: w pokazanym tekście programu występują odwołania do klas: PriceList, Customer, ShoppingCart, Box, Rose, Lilac, Freesia, Peony
. Trzeba te klasy odpowiednio zdefiniować, ale oprócz tego nalezy zdefiniować jeszcze
co najmniej dwie ważne klasy (których w programie nie widać) potrzebne do
spełnienia wymagań postawionych przed programem.
Trzeba też zdefiniować w klasie FloristsTest metodę valueOf(Box pudelko,
String kolor) zwracającą wartość kwiatów o podanym kolorze, znajdujących
się w pudełku.
Wymaganie podstawowe:
dodanie do powyższego programu zakupów innych kwiatów (np. orchidei)
ma byc bardzo łatwe.
Potrzeba tylko :
zdefiniowac nową klasę np. Orchid, przy czym ma to być jak najbardziej
oszczędna definicja (kilka wierszy kodu)dodać odpowiedni kod do powyższego programu (np. pl.set("orchidea", 20); janek.add(new Orchid(1)); )
Przy dodaniu nowego rodzaju kwiatów nie wolno modyfikować żadnych innych
klas programu.
Wymagania dodatkowe:
należy wykorzystać klasy abstrakcyjne i polimorfizmnależy zminimalizować kod klas ShoppingCart i Boxnależy zdefiniować klasę PriceList jako singleton (możemy mieć zawsze
tylko jeden cennik)
Ważne uwagi.
W kwiaciarni mogą być kwiaty, których zapomniano dodać do cennika. Wtedy
przy płaceniu są one usuwane z naszego wózka.Może się okazać, że klient nie dysponuje odpowiednią kwotą pieniędzy
aby zapłacić za całą zawartość wóżka. Wtedy z wózka usuwane są kwiaty, za
które klient nie może zapłacić (ale nie pojedyńczo, tylko w kompletach np.
po stefan.get(new Lilac(3)) usuwane są te trzy bzy na które Stefan nie ma
pieniędzy).Warto zwrócić uwagę na odpowiednio zdefiniowanie metody toString() w niektórych klasach.
I na koniec: nie przejmujemy się tym, że np. róże mogą mieć wiele kolorów.
Dla uproszczenia przyjęliśmy, że róże są czerwone itd.
Punktacja:
za spełnienie podstawowego wymagania i uzyskanie pokazanego działania programu - max. 5 punktów,
dodatkowo można uzyskać 5 punktów za dobre rozwiązania przy kodowaniu.
w sumie maksimum 10 punktów.
Pomoc 1 (Hashtable)
Przy ustalaniu cen skorzystać z klasy Hashtable, która umożliwia łatwe
odnajdywanie informacji wg kluczy.
Do Hashtable dodajemy za pomocą metody put - pary (klucz, wartość),
które są odniesieniami do obiektów typu Object.
Np. jeśli chcemy dodać pod kluczem "Ala" wartość typu double, to musimy z
double zrobić obiekt (do czego służy klasa Double):
Hashtable ht = new Hashtable();
double d = 1.7;
String s = "Ala";
ht.put(s, new Double(d)); // dodanie wartości (reprezentowanej przez obiekt
Double, który zawiera wartośc double 1.7) pod kluczem s ("Ala")
Z tablicy uzyskujemy wartości (które są odniesieniami do obiektów formalnego
typu Object) "po kluczu" za pomocą odwołania get(key) np. aby uzyskać
wartość zapisaną uprzednio (w wierszach wyżej) pod kluczem "Ala":
Object o = ht.get(s); // s wskazuje na "Ala" i jest kluczem
// jeżeli w tablicy nie będzie klucza s
("Ala") to metoda zwraca null
Double val = (Double) o; // obowiązkowa konwersja, by na uzyskanym obiekcie
stosować metody klasy Double
double dv = val.doubleValue(); // uzyskujemy wartość typu double, zapisaną
w obiekcie typu Double
Uwaga: w Javie 1.5 działa autoboxing dzięki któremu
wykonywane są
automatyczne konwersje typy proste <-> klasy opakowujące typy
proste (np. Integer czy Double). Oprócz tego kolekcje są
sparametryzowane typem elementów. Powyższe przykładowe fragmenty
można więc zapisać tak:
Hashtable<String, Double> ht = new Hashtable<String, Double>();
double d = 1.7;
String s = "Ala";
ht.put(s, d);
....
double dv = ht.get("Ala");
Pomoc 2 (Vector)
Umieszcanie kwiatów w wózku można oprogramować wykorzystując klasę Vector.
Obiekt klasy Vector to dynamiczna (zmieniająca swoje rozmiary w trakcie wykonania)
tablica dowolnych obiektów (typ Object).
Metody:
add(Object o) - dodaje referencję do obiektu o jako nowy element wektora,
Object get(int i) - zwraca referencję do obiektu, która zapisana jest w i-ym
lemencie wektora
remove(Object o) - usuwa referencję do obiektu o z wektora
remove(int i) - usuwa i-ty element wektora
int size() - zwraca aktualną liczbę elementów wektora
Pomoc 3 ( singleton)
Singleton - to klasa, którą można wykorzystać do stworzenia (w danym programie)
tylko jednego obiektu.
Typowa realizacja:
prywatny konstruktor,metoda statyczna get...(), która zwraca JEDYNY utworzony obiekt tej
klasy
-
Wyszukiwarka
Podobne podstrony:
cwicz2 3POPRLAK cwicz2cwicz22cwicz25 tachimetriacwicz2cwicz2Zalacznik Cwicz2 PP arytmet logikaGrafika cwicz2a2014Ćwicz2Cwicz27Ćwicz2MEcwicz2cwicz2więcej podobnych podstron