Diagramy UML
Zad. 1
Dane są następujące klasy: Książka, Powieść, Kryminał, Romans, Regał_metalowy, Regał_drewniany, Biblioteka. Powiąż te klasy ze sobą wykorzystując dziedziczenie i kompozycję. Zaznacz klasy abstrakcyjne, wprowadź dodatkowe klasy abstrakcyjne jeżeli uznasz, że poprawi to hierarchie klas. Swoją propozycję przedstaw graficznie (diagram klas UML).
Zad. 2
Dane są następujące klasy: Zwierzę_wodne, Ryba, Rak, Pijawka, Jezioro_rynnowe, Jezioro_powierzchniowe, Pojezierze. Powiąż te klasy ze sobą wykorzystując dziedziczenie i kompozycję. Zaznacz klasy abstrakcyjne, wprowadź dodatkowe klasy abstrakcyjne jeżeli uznasz, że poprawi to hierarchie klas. Swoją propozycję przedstaw graficznie (diagram klas UML).
Zad. 3
Dane są następujące klasy: Plik,Plik_binarny, Plik_tekstowy, Plik_specjalny, Katalog_zdalny, Katalog_lokalny, System_plików. Powiąż te klasy ze sobą wykorzystując dziedziczenie i kompozycję. Zaznacz klasy abstrakcyjne, wprowadź dodatkowe klasy abstrakcyjne jeżeli uznasz, że poprawi to hierarchie klas. Swoją propozycję przedstaw graficznie (diagram klas UML).
Zad. 4
Dane są następujące klasy: Pasażer, Pasażer_normalny, Pasażer_ulgowy, Pasażer_specjalny, Pociąg, Wagon_klasy_1, Wagon_klasy_2. Powiąż te klasy ze sobą wykorzystując dziedziczenie i kompozycję. Zaznacz klasy abstrakcyjne, wprowadź dodatkowe klasy abstrakcyjne jeżeli uznasz, że poprawi to hierarchie klas. Swoją propozycję przedstaw graficznie (diagram klas UML).
Zad. 5
Dane są następujące klasy: Krzesło, Fotel, Szafa, Samochód, Silnik, Silnik_benzynowy, Koło, Samochód_osobowy. Powiąż te klasy ze sobą wykorzystując dziedziczenie i kompozycję. Zaznacz klasy abstrakcyjne, wprowadź dodatkowe klasy abstrakcyjne jeżeli uznasz, że poprawi to hierarchie klas. Swoją propozycję przedstaw graficznie (diagram klas UML).
Zad. 6
Dane są następujące klasy: Cieżarówka, Autobus, Traktor, Tramwaj, Komputer, Laptop, Monitor, Mysz_mechaniczna, Mysz. Powiąż te klasy ze sobą wykorzystując dziedziczenie i kompozycję. Zaznacz klasy abstrakcyjne, wprowadź dodatkowe klasy abstrakcyjne jeżeli uznasz, że poprawi to hierarchie klas. Swoją propozycję przedstaw graficznie (diagram klas UML).
Zad. 7
Dany jest zbiór pojęć: Samolot_odrzutowy, Drukarnia, Skrzydło, Tygodnik, Podręcznik, Silnik_odrzutowy, Album, Samolot_turbośmigłowy, Dziennik, Flota_powietrzna, Strona, Okładka, Kadłub, Kiosk_z_prasą, Biblioteka. Zaproponuj diagram klas opisujący te pojęcia wprowadzając zależności między odpowiednimi klasami (dziedziczenie, kompozycja, klasy abstrakcyjne). Jeśli uznasz to za konieczne (np. aby poprawić strukturę diagramu), możesz wprowadzić nowe klasy.
Zad. 8
Dany jest zbiór pojęć: Biedronka, Telewizor, Pająk, Radio_Cyfrowe, Mrówka_Czerwona, Radio_Analogowe, Mrówka_Czarna, Sklep_RTV, Mrowisko, Sklep_Meblowy, Las, Kanapa, Drzewo, Krzesło, Stół. Zaproponuj diagram klas opisujący te pojęcia wprowadzając zależności między odpowiednimi klasami (dziedziczenie, kompozycja, klasy abstrakcyjne). Jeśli uznasz to za konieczne (np. aby poprawić strukturę diagramu), możesz wprowadzić nowe klasy.
Zad. 9
Na podstawie słownego opisu systemu zaproponuj klasy i przedstaw je na diagramie klas, uwzględniając relację miedzy nimi (dziedziczenie i kompozycja). Zaznacz na diagramie klasy abstrakcyjne.
Biblioteka graficzna zawiera różnego rodzaje kontrolki: przyciski, pola tekstowe, listy, etykiety. Mogą byc one umieszczane w oknach zwykłych i dialogowych, ale nie bezposrednio, tylko za pośrednictwem różnego rodzaju menadżerów ułożeń (okno nie „zna” swoich kontrolek, zleca to swojemu menadżerowi ułożenia).
Zad. 10
Dany jest opis systemu informatycznego. Zaproponuj diagram klas wprowadzający zależności między odpowiednimi klasami (dziedziczenie, kompozycja). Zaznacz klasy abstrakcyjne, podstawowe konstruktory, metody i pola.
Plotter składający się z 10 pisaków rysuje na arkuszach papieru (zwykłym, kredowym, folii i kalce technicznej) rysunek wg zapisu na karcie perforowanej wkładanej do specjalnej szczeliny. Posiada on również wskaźniki stanu zużycia każdego z pisaków.
Zad. 11
Dany jest opis systemu informatycznego. Zaproponuj diagram klas wprowadzający zależności między odpowiednimi klasami (dziedziczenie, kompozycja). Zaznacz klasy abstrakcyjne, podstawowe konstruktory, metody i pola.
Maszyna składa 2 rodzaje produktów z 4 różnych podzespołów umieszczanych w jej zasobnikach. Maszyna posiada 2 potencjometry, które służą do jej regulacji i przełącznik rodzaju składanych produktów.
Zad. 12
Na podstawie opisu słownego zaproponuj diagram klas który umożliwiłby napisanie systemu informatycznego. Uwzględnij najważniejsze składowe klas (konstruktory, pola, metody) oraz powiązania między nimi (kompozycja i dziedziczenie).
Uwaga: nie pisz żadnego kodu metod, konstruktorów. Wystarczą nagłówki !!!
Koncern samochodowy ma kilka fabryk. Każda produkuje jeden określony model samochodu. Oprócz tego współpracuje z podwykonawcami, którzy produkują podzespoły. W każdej fabryce jest dział koordynujący dostawy od podwykonawców i zarządzający stanem magazynu fabryki. Kiedy stwierdzi, że danej części jest zbyt mały zapas w magazynie, wysyła zamówienie (ekspresowe lub zwykłe) do podwykonawcy. Dział produkcji produkuje samochody pobierając części z magazynu.
Zad. 13
Na podstawie opisu słownego zaproponuj diagram klas który umożliwiłby napisanie systemu informatycznego. Uwzględnij najważniejsze składowe klas (konstruktory, pola, metody) oraz powiązania między nimi (kompozycja i dziedziczenie).
Uwaga: nie pisz żadnego kodu metod, konstruktorów. Wystarczą nagłówki !!!
Sieć kolejowa Dragolandii łączy najważniejsze miasta. Tory między miastami mogą mieć trakcję elektryczne. Pociągi (towarowe i osobowe) składają się z różnego rodzaju wagonów i oczywiście lokomotywy (elektrycznej i spalinowej). Dział planowania przyjmuje zlecenia od klientów na przewozy towarowe i osobowe z miasta do miasta, wyznacza trasę, wyznacza skład pociągu i wysyła zlecenie do działu kontroli ruchu w celi realizacji.
Zad. 14
Dane są następujące klasy: Krzesło, Fotel, Szafa_metalowa, Szafa_drewniana, Samochód, Silnik, Silnik_benzynowy, Koło, Samochód_osobowy, Ciężarówka, Fotel_obrotowy. Powiąż te klasy ze sobą wykorzystując dziedziczenie i kompozycję. Zaznacz klasy abstrakcyjne, wprowadź dodatkowe klasy abstrakcyjne jeżeli uznasz, że poprawi to hierarchie klas. Swoją propozycję przedstaw graficznie (diagram klas).
Zad. 15
Podany jest następujący opis systemu. Zaproponuj do niego diagram klas. Zaznacz na nim relację dziedziczenia, kompozycji, typy abstrakcyjne, najważniejsze składowe.
Szpital, kierowany przez lekarza-dyrektora, składa się z kilku oddziałów (wewnętrzny, OIOM, zakaźny, okulistyczny, ...) kierowanych przez lekarzy-ordynatorów. Każdy z oddziałów przyjmuje pacjentów na określoną liczbę dni a informację o hospitalizacji (dane pacjenta, jednostka chorobowa z opisem, data przyjęcia i wypisania, dane o szpitalu i oddziale) wysyła do NFZ danego pacjenta w celu uzyskania refundacji za hospitalizację. Zajmuje się tym dział finansowy szpitala kierowany przez dyrektora administracyjnego.
Zad. 16
Podany jest następujący opis systemu. Zaproponuj do niego diagram klas. Zaznacz na nim relację dziedziczenia, kompozycji, typy abstrakcyjne, najważniejsze składowe:
Centrum obsługi kart płatniczych obsługuje płatności kartami kredytowymi, debetowymi i bankomatowymi. Z żądaniem autoryzacji każdej płatności mogą zwracać się sklepy, zakłady usługowe i firmy transportowe. Centrum autoryzuje płatność po wysłaniu zapytania do banku który wydał daną kartę płatniczą a informację o tym archiwizuję w postaci wpisu w swoim systemie bazodanowym.
Zad. 17
Podany jest następujący opis systemu. Zaproponuj do niego diagram klas. Zaznacz na nim relację dziedziczenia, kompozycji, typy abstrakcyjne, najważniejsze składowe:
System rezerwacji biletów pewnej firmy lotniczej przyjmuje żądania rezerwacji od klientów indywidualnych i firm-pośredników. Firma posiada flotę 10 samolotów 3 typów (każdy o innej liczbie miejsc i zasięgu) i obsługuję 20 tras między 10 lotniskami.
Zad. 18
Podany jest następujący opis systemu. Zaproponuj do niego diagram klas. Zaznacz na nim relację dziedziczenia, kompozycji, typy abstrakcyjne, najważniejsze składowe.
Na plaży Kopakabana oprócz plażowania toczą się też rozgrywki w 3 grach zespołowych: siatkówka plażowa, 2 ognie i przeciąganie liny. Każda z drużyn składa się ze stałej liczby zawodników. Toczą oni mecze/spotkania na zasadzie każdy z każdym. Pierwsze 4 drużyny z największą liczbą zwycięstw przechodzi do półfinałów a ich zwycięzcy do finałów. Każde ze spotkań sędziuje sędzia, a dodatkowo w siatkówce 2 sędziów pomocniczych.
Zad. 19
Podany jest następujący opis systemu. Zaproponuj do niego diagram klas. Zaznacz na nim relację dziedziczenia, kompozycji, typy abstrakcyjne, najważniejsze składowe.
Wydawnictwo ePress wydaje książki różnego rodzaju (sensacyjne, romanse, albumy, ...) oraz 2 czasopisma: tygodnik oraz miesięcznik. Współpracuje z autorami, których zatrudnia na umowę o pracę lub o dzieło (zajmuje się tym dział programowy wydawnictwa). Druk odbywa się w jednej z 3 drukarni, z tym że tylko 1 z nich zapewnia wystarczającą jakość druku dla albumów. Dystrybucją książek odbywa się poprzez internetową księgarnię-dział wydawnictwa ePress, zaś czasopism poprzez inny dział wydawnictwa-dział prenumerat.
Zad. 20
Zaprojektuj klasę lub hierarchię klas (podaj nazwy klas, ich składowe i nagłówki metod)
reprezentującą poniższy problem:
W lesie znajdują się mrowiska. Każde z nich zamieszkane jest przez mrówki: królową, robotnice, trutnie, żołnierzy, pielęgnice. Każdy rodzaj mrówki wykonuje swoją funkcję życiową: królowa znosi jaja, robotnice zbierają pokarm, trutnie zapładniają królową, żołnierze walczą z innymi mrówkami, pielęgnice opiekują się jajami. Co jakiś czas z jaja wylęga się nowa królowa, która opuszcza mrowisko i zakłada nowe.
Zad. 21
Zaprojektuj klasę lub hierarchię klas (podaj nazwy klas, ich składowe i nagłówki metod)
reprezentującą poniższy problem:
Program do "kontroli lotu". Dysponujemy radarem, na którym wyświetlana jest mapa (wczytywana z pliku), na radarze możemy umieścić dwa rodzaje obiektów reprezentowane przez odpowiednie znaki graficzne - naziemne (nie poruszają się) i samoloty (każdy jest opisany unikalnym numerem, samoloty możemy swobodnie przemieszczać). Powinien być sposób sprawdzania kolizji między obiektami, a także skalowania, obracania i przesuwania obrazu wyświetlanego na radarze.
Zad. 22
Podany jest następujący opis systemu. Zaproponuj do niego diagram klas. Zaznacz na nim relację dziedziczenia, kompozycji, typy abstrakcyjne, najważniejsze składowe:
Zawody sportowe obejmują 3 konkurencje: biegi, skoki i pływanie. Startują w nich drużyny składające się z 3 zawodników. W każdej konkurencji organizowane są rozgrywki: eliminacje (ćwierćfinały i półfinały) oraz finały. Po każdej rozgrywce sporządzane są listy wyników drużynowe i indywidualne a na koniec klasyfikacja końcowa drużynowa i indywidualna oraz przydzielane są medale.
Zad. 23
Podany jest następujący opis systemu. Zaproponuj do niego diagram klas. Zaznacz na nim relację dziedziczenia, kompozycji, typy abstrakcyjne, najważniejsze składowe:
Pomiary meteorologiczne obejmujące pomiar temperatury, ciśnienia, zachmurzenia, wilgotności, kierunku i prędkości wiatru wykonywane są co pewien czas w określonych stacjach pomiarowych. Informacje o nich spływają centralnego ośrodka który na podstawie tych prognoz i modelu przygotowuje prognozy 4, 8, 12, 24 i 48 godzinne dla 20 najważniejszych miast. Następnie dział weryfikacji centralnego ośrodka na podstawie pomiarów w czasie odpowiadającym terminom prognoz ocenia stopień sprawdzalności prognoz.
Zad. 24
Podany jest następujący opis systemu. Zaproponuj do niego diagram klas. Zaznacz na nim relację dziedziczenia, kompozycji, typy abstrakcyjne, najważniejsze składowe:
Zawody motocyklowe rozgrywane są na torach zamkniętych i otwartych. W każdych z nich startuje do 10 zawodników którzy są zgrupowani w drużyny. Z każdej drużyny może wystartować maksymalnie 2 zawodników. Kwalifikacje do zawodów, rozgrywane dzień wcześnie, polegają na indywidualnym pomiarze czasu, który jest podstawą kwalifikacji. Zwycięzca zawodów dostaje 10 pkt, drugi zawodnik 9, itd. Ostatni dostaje 1 pkt. 2 razy w roku rozgrywane są zawody w systemie pucharowym. Przyjmowanych jest 2n pierwszych zawodników wg kolejności przekroczenia progu
15 pkt. Losowane są pary - zwycięzca każdego pojedynku jeden na jeden przechodzi do następnej rundy
Zad. 25
Podany jest następujący opis systemu. Zaproponuj do niego diagram klas. Zaznacz na nim relację dziedziczenia, kompozycji, typy abstrakcyjne, najważniejsze składowe:
Produkcja samochodów osobowych, dostawczych i ciężarowych pewnej firmy odbywa się w jej fabrykach. Niektóre z nich produkują tylko podzespoły i posiadają działy trasportowe, które dostarczają gotowe podzespoły do innych, specjalizujących się w montażu gotowych pojazdów. Te z kolei posiadają działy logistyczne z magazynami, które zajmują się koordynacją dostaw. Centralny dział kontroli firmy raz w miesiącu wybiera pewną liczbę samochodów do kontroli. Wynik kontroli może znaleźć usterkę w samochodzie, która może być zawiniona przez fabrykę montującą lub fabrykę produkującą wadliwą część w samochodzie.
Zadania z tworzeniem nowym klas na podstawie klas istniejących
Zad. 1
Dana jest klasa Licznik (np. licznik kilometrów) zawierające m.in. podane niżej składowe class Licznik {
public Licznik(int cyfry); //konstruktor, pobiera ile pozycji będzie zawierał licznik, np. dla poz=3 licznik liczy od 000 do 999
public void zero(); //ustawia stan licznika na zero
public int czytaj(); //odczytuje stan licznika
public void impuls(); //zwiększa stan licznika o jeden, po dojściu do maksimum kolejne wywołania nie zwiększają już stanu licznika
protected void impuls_ujemny(); //zmniejsza stan licznika o jeden, po dojściu do zera kolejne wywołanie nie zmniejszają już stanu licznika
protected void ustaw(int poz); //ustawia stan licznika na
}
a) Wykorzystując mechanizm dziedziczenia napisz klasę Licznik_odwrotny z konstruktorem i metodami zero, czytaj i impuls, który umożliwia liczenie do tyłu, np. od 999 do 000 (każdy impuls zmniejsza stan licznika o jeden).
b) Wykorzystując mechanizm dziedziczenia napisz klasę Licznik_cykliczny z konstruktorem i metodami zero, czytaj i impuls, który po dojściu do maksymalnego stanu, po kolejnym impulsie przechodzi na 0 (np. 999->000).
c) Wykorzystując mechanizm dziedziczenia napisz klasę Licznik_parzysty z konstruktorem i metodami zero, czytaj i impuls, który na każdy impuls zmienia swój stan o 2 (000->002->004...). d) Wykorzystując mechanizm dziedziczenia napisz klasę Licznik dla_przesądnych z konstruktorem i metodami zero, czytaj i impuls, który nie ma stanu 13 (013, 0013): po dojściu do 12 kolejny impuls przestawi go na 14.
Zad. 2
Dany jest interfejs klasy Punkt i typ interfejsowy Przesuwany:
class Punkt {
public Punkt (int x, int y);
public void Przesun(int dx, int dy);
}
interface Przesuwany {
void Przesun(int dx, int dy);
}
Wykorzystując tą klasę i mechanizm kompozycji napisz definicję klasy Linia która implementuje typ interfejsowy Przesuwany (metoda Przesun powinna rzeczywiście przesuwać obiekt linii).
Zad. 3
Dany jest interfejs klasy Linia i typ interfejsowy Przesuwany:
class Linia {
public Linia (int x1, int y1, int x2, int y2);
public void Przesun(int dx, int dy);
}
interface Przesuwany {
void Przesun(int dx, int dy);
}
Wykorzystując tą klasę i mechanizm kompozycji napisz definicję klasy Trojkat która implementuje typ interfejsowy Przesuwany (metoda Przesun powinna rzeczywiście przesuwać obiekt trójkąta) .
Zad. 4
Dana jest klasa Cyfra (zapamiętuje cyfrę: od 0 do 9). Wykorzystując tą klasę i mechanizm kompozycji napisz klasę LiczbaTrzycyfrowa która będzie miała takie same metody (ten sam interfejs) co klasa Cyfra (Uwaga: ich implementacje muszą wykorzystywać metody klasy Cyfra). class Cyfra {
public Cyfra(); //konstruktor, ustawia wartość cyfry na 0
public int stan(); //zwraca wartość cyfry
void zeruj(); //ustawia wartość cyfry na 0
void zwieksz(); //zwiększa wartość cyfry o 1
}
Zad. 5
Dana jest klasa Magazyn, która ma funkcjonalności (metody) związane z przechowywaniem pewnych Towarów. Wykorzystując te klasy i mechanizm dziedziczenia napisz klasę MagazynInfo, który będzie miała te same metody co klasa Magazyn (ten sam interfejs), ale przy każdej operacji będzie wyświetlała komunikat o jej wykonaniu na ekran. Wskazówka: w metodach klasy potomnej należy wywołać metody klasy bazowej.
class Towar {...} //klasa towaru, nieważne co jest w środku
class Magazyn {
public Magazyn(int pojemnosc); //konstruktor
public void dodajTowar(Towar t, int ilosc); //dodaje do magazynu dana ilość towaru
public void pobierzTowar(Towar t, int ilosc);//pobiera z magazynu dana ilość
//sprawdza, ile w magazynie jest danego towaru
public int sprawdzIlosc(Towar t);
}
Zad. 6
Wykorzystując klasę Punkt i składnię kompozycji napisz definicję klasy Trójkąt, reprezentującej trójkąt składający się z trzech punktów, zawierającą metodę umożliwiającą wypisanie współrzędnych trójkąta na ekranie (powinna wykorzystywać metodę toString klasy Punkt).
Punkt{
private int x, y;
public Punkt(int _x, int _y);
public String toString();
}
Zad. 7
Wykorzystując klasę Punkt i składnię kompozycji napisz definicję klasy Linia, reprezentującej linię składający się z dwóch punktów, zawierającą metodę umożliwiającą wypisanie współrzędnych linii na ekranie (powinna wykorzystywać metodę toString klasy Punkt).
Punkt{
private int x,y;
public Punkt(int _x, int _y);
public String toString();
}
Zad. 8
Wykorzystując klasę File (poszczególne jej metody zwracają wartość false w wypadku wystąpienia błędu) i składnię kompozycji napisz definicję klasy FileExc, która w wypadku błędu będzie wyrzucać odpowiednie wyjątki.
class IOException extends Exception {}
class OpenException exnteds IOException {}
class WriteException exnteds IOException {
class File{
boolean open(String name); boolean write(int value); boolean close();
}
Zad. 9
Wykorzystując klasę File (poszczególne jej metody wyrzucają wyjątki w wypadku wystąpienia błędu) i składnię dziedziczenia napisz definicję klasy FileConsole, która w wypadku wystąpienia błędu będzie wypisywać na ekranie stosowny komunikat.
class File{
void open(String name) throws OpenException; void write(int value) throws WriteException; void close() throws IOException;
}
Zad. 10
Dana jest klasa w Javie, której interfejs podany jest poniżej :
class BladPliku extends Exception {} class PlikNieznany extends BladPliku{} class BladZapisu extends BladPliku{} class BladOdczytu extends BladPliku{}
class TymczasowyBladOdczytu extends BladOdczytu{}
class PermanentyStalyBladOdczytu extends BladOdczytu {}
class Plik {//tu jest pełna definicja klasy, niezamieszczona z braku miejsca
public Plik(String nazwa) throws PlikNieznany; //otwiera plik o danej nazwie
public void zamknij() throws BladPliku; //zamyka plik public void zapisz(int i) throws BladZapisu; //zapisuje do pliku liczbę public int odczytaj() throws BladOdczytu; //odczytuje z pliku liczbę
public boolean eof() throws BladPliku; //czy przy odczycie plik osiągnął koniec
}
Wykorzystując mechanizm dziedziczenia napisz klasę PlikSzyfrowany o tym samym interfejsie i tej samej funkcjonalności (otwarcie w konstruktorze, zapis, odczyt, zamknięcie, sprawdzenie dojścia do końca pliku). Z tym, że tymczasowe niepowodzenie w odczycie (wyjątek TymczasowyBladOdczytu) powinno skutkować automatycznym powtórzeniem odczytu: metoda ma prawo wrócić tylko w przypadku sukcesu lub z powodu wyjątku: PermanentnyBladOdczytu. Szyfrowanie ma polegać na dodaniu do zapisywanej liczby (i odjęciu od odczytywanej) innej wartości liczbowej - klucza, który jest podawany przy konstrukcji pliku.
Zad. 11
Dana jest klasa o podanym niżej interfejsie:
class Plik {
public Plik(String nazwa) throws IOException;//otwiera plik i konstruuje obiekt
public void zamknij() throws IOException; //zamyka plik
public void pisz(byte b) throws IOException; //zapisuje bajt do pliku
public byte czytaj() throws IOException; //odczytuje bajt z pliku
}
Wykorzystując tę klase i mechanizm kompozycji (w 2. wersji - dziedziczenia) napisz klasę PlikSzyfrowany, z takimi samymi metodami/konstruktorami. Szyfrowanie powinno polegać na dodaniu (przy pisaniu) i odjęciu (przy czytaniu) określonego klucza (liczby typu byte) modulo 256. Klucz powinien być podawany przy konstrukcji obiektu-pliku.
Zad. 12
Dana jest klasa KontenerImpl w Javie, której interfejs podany jest poniżej :
class BladPamieci extends Exception {} class BladZapisu extends BladPamieci{} class BladOdczytu extends BladPamieci{}
class TymczasowyBladOdczytu extends BladOdczytu{}
class PermanentyStalyBladOdczytu extends BladOdczytu {}
interface Kontener {
void zwolnij() throws BladPamieci; //zwalnia pamięć kontenera
void zapisz(int i, int ind) throws BladZapisu;//zapisuje liczbę pod indeks
int odczytaj(int ind) throws BladOdczytu; //odczytuje liczbę spod indeksu
int rozmiar() throws BladPamieci; //zwraca rozmiar kontenera
}
class KontenerImpl implements Kontener {
//tu jest pełna definicja klasy, niezamieszczona z braku miejsca //tworzy kontener o podanym rozmiarze
public Kontener1(int rozmiar) throws BladPamieci {...}
... //metody wynikające z typu interfejsowego Kontener
}
Wykorzystując mechanizm kompozycji napisz klasę KontenerImplExt o tym samym interfejsie i tej samej funkcjonalności (konstrukcja, zapis, odczyt, sprawdzenie rozmiaru). Z tym, że tymczasowe niepowodzenie w odczycie (wyjątek TymczasowyBladOdczytu) powinno skutkować automatycznym powtórzeniem odczytu: metoda ma prawo wrócić tylko w przypadku sukcesu lub z powodu wyjątku: PermanentnyBladOdczytu. Dodatkowo KontenerImplExt musi pamiętać ile razy dana komórka została zapisana i odczytana i zwracać te wartości w metodach (Uwaga: liczba zapisów i odczytów też jest typu integer):
//ile razy odczytywana zawartość komórki o indeksie
public int ile_odczytow(int ind) throws BladOdczytu; //ile razy ustawiano zawartość komórki o indeksie
public int ile_zapisow(int ind) throws BladOdczytu;
Zad. 13
Java: Dana jest klasa serwera nazw o podanym niżej interfejsie:
class DNSException extends Exception {}
class NameNotFoundException extends DNSException {} class DuplicatedNameException extends DNSException {} class DNS {
public DNS(String id) throws Exception; //tworzy nowy DNS o podanym id
//dodaje nowy wpis do bazy DNS odwzorowujący adres 'name' na adres 'IP'
public void put(String name, String IP) throws DuplicatedNameException;
//znajduje adres IP odpowiadający wpisanej wcześniej nazwie
public String getIP(String name) throws NameNotFoundException;
//usuwa wpis z daną nazwą 'name' z DNS-u
public void remove(String name) throws NameNotFoundException;
//sprawdza, czy w DNS-ie jest informacja o danym adresie 'name'
public boolean contains(String name) throws DNSException; } Wykorzystując mechanizm kompozycji napisz klasę ListDNS, z takimi samymi metodami który może być elementem listy DNS-ów. W konstruktorze oprócz id powinien pobierać 2 DNS-y: poprzedni i następny (w szczególnym przypadku 'null'). Jeśli podczas zapytania getIP w bieżącym DNS nie ma szukanego wpisu, powinien on przekazać zapytanie do poprzedniego (a potem następnego) DNS-u w liście PS. Co zrobić, żeby ustrzec się przed nieskończonym zapętleniem w przypadku cyklicznej listy DNS-ów ?
Zad. 14
Dana jest klasa OknoGraficzne o poniższym interfejsie umożliwiające rysowanie linii i kół. Wykorzystując tą klasę i mechanizm dziedziczenia napisz klasę OknoPodwojne o takim samym interfejsie, które zamiast pojedynczej figury rysuje podwójną (z „cieniem”), gdzie 2. figura jest przesunięta w stosunku do pierwszej o wektor [x,y] podawany podczas konstrukcji okna.
class OknoGraficzne {
public OknoGraficzne(int szerokosc, int wysokosc) throws ZleWymiary;
public void rysujLinie(int x1, int y1, int x2, int y2) throws FiguraPozaOknem;
public void rysujKolo(int x, int y, int r) throws FiguraPozaOknem;
public void odswiez();
}
Zad. 15
Dana jest klasa MagazynRozproszony o poniższym interfejsie i działaniu. Wykorzystując tą klasę i mechanizm kompozycji napisz klasę MagazynPotrójny, która wstawia Produkt do 3 magazynów rozproszonych po to, aby przy pobieraniu wybrać ten, który jest najbliżej.
class MagazynRozporoszony {
//wstawia produkt p, nie wiadomo w jakiej odległości
public void wstaw(Produkt p) throws WyjatekProduktJuzJest;
//w jakiej odległości jest produkt o danej nazwie
public int odleglosc(String nazwa) throws WyjatekProduktuNieMa;
//pobiera produkt o danej nazwie
public Produkt pobierz(String nazwa) throws WyjatekProduktuNieMa;
}
Uwaga: Do tego zadanie nie jest Ci potrzebna wiedza na temat interfejsu klasy Produkt
Zad. 16
Dana jest klasa Baza o poniższym interfejsie, implementująca N-elementową bazę Towarów (N - rozmiar bazy podawany przy konstrukcji). Wykorzystując tę klasę i mechanizm kompozycji napisz klasę BazaDynamiczna, która również przechowuje Towary ale może dynamicznie zmieniać swój rozmiar. Dla przykładu: jeśli wykorzystywana Baza w danej chwili ma pojemność 30 towarów a ktoś chce wstawić towar na pozycję 40., należy stworzyć nową Bazę, co najmniej 40-elementową, przepisać pierwszych 30 towarów ze starej do nowej Bazy, wstawić towar na pozycji 40. i “podmienić” starą bazę na nową.
class Towar {...}
class Baza {
public Baza(int rozmiar) throws BladPamieci;
//wstawia towar 't', na miejsce 'pozycja'
public void wstaw(int pozycja, Towar t) throws BladPamieci;
//zwraca towar z pozycji 'pozycja', wyrzuca wyjątek jeśli brak 'pozycji'
public Towar czytaj(int pozycja) throws BladIndeksu;
public int rozmiar(); //zwraca rozmiar bazy
}
Zad. 17
Dane są dwie klasy implementujące poniższe interfejsy (w C++ dziedziczące z analogicznych klas abstrakcyjnych):
interface IAuto {
int ladownosc();
ind masaZaladowana();
zaladuj(int ile) throws ZaDuzo;
void wyladuj(int ile) throws ZaDuzo;
int pozycja();
void przemiescDo(int pozycja) throws ZlaPozycja;
}
interface IPrzyczepa {
int ladownosc();
ind masaZaladowana();
zaladuj(int ile) throws ZaDuzo;
void wyladuj(int ile) throws ZaDuzo;
}
class Auto implements IAuto { ... }
class Przyczepa implements IPrzyczepa { ... }
Wykorzystując te typy i mechanizm kompozycji napisz klasę Zestaw reprezentujący auto z przyczepami (do 5 sztuk). Składniki zestawu (obiekty klas implementujących powyższe typy) podawane są podczas jego konstrukcji. Żądana klasa powinna mieć takie same metody jak typ Auto.
Zad. 18
Dane są dwie klasy implementujące poniższe interfejsy (w C++ dziedziczące z analogicznych klas abstrakcyjnych). Wykorzystując te typy i mechanizm kompozycji napisz klasę FirmaTransportowa posiadającą tabor złożony z obiektów tych 2 klas, podawanych podczas jej konstrukcji. Klasa powinna mieć metody umożliwiające odpowiedź na pytanie, czy możliwy jest transport towaru o podanej masie do danego miasta i ile ewentualnie to kosztuje.
interface IAuto {
int ladownosc();
bool czyJezdziDo(String miasto);
int kosztKursuDo(String miasto) throws NieObsluguje;
}
interface ISamolot {
int ladownosc();
bool czyLataDo(String miasto);
int kosztLotuDo(String miasto) throws NieObsluguje;
}
class Auto implements IAuto { ... }
class Samolot implements ISamolot { ... }
Zad. 19
Dana jest klasa MyChannel implementująca interfejs Channel wysyłająca i odbierająca bajty. Wykorzystując tą klasę i mechanizm kompozycji napisz klasę MultipleChannel implementująca ten sam interfejs Channel i przyspieszający transmisję bajtów dzięki wykorzystaniu N (parametr konstruktora) równoległych kanałów klasy Channel. Każdy z tych N kanałów wykorzystywany jest do transmisji 1/N części oryginalnej tablicy bajtów.
interface Channel {
//wysyła tablicę bajtów, wyrzuca wyjątek jeśli nie jest to możliwe
void send(byte bytes[]) throws SendExc;
//odbiera tablicę bajtów, wyrzuca wyjątek jeśli nie jest to możliwe
void receive(byte bytes[]) throws ReceiveExc;
}
class MyChannel implements Channel {
//otwiera plik o numerze id, wyrzuca wyjątek jeśli kanał o takim numerze już jest
public MyChannel(int id) throws IOExc;
...
}
Zad. 20
Dana jest klasa File o poniższym interfejsie i działaniu. Wykorzystując tą klasę i mechanizm dziedziczenia napisz klasę BufferFile, posiadający takie same składowe co File ale wykonujący operacje czytania i pisania przez 2 wewnętrzne bufory o rozmiarze N podanym w konstruktorze (bajty wędrują z dysku i na dysk tylko po N, nigdy pojedynczo; podczas gdy użytkownik ma cały czas możliwość zapisu i odczytu pojedynczych bajtów).
class File {
public File(String name) throws FileNotFoundExc; //otwiera plik
public void write(byte b) throws NotFreeSpaceExc;//zapisuje bajt do pliku
public byte read() throws EndOfFileExc; //odczytuje baj z dysku
}
Zad. 21
Dana jest klasa Konsola umożliwiająca wypisywanie znaków na ekranie. Wykorzystując tą klasę i mechanizm dziedziczenia napisz (w Javie, C# lub C++) klasę KonsolaEx, która umożliwia również wypisanie całego ciągu znaków, a wszystkie operacje wykonywane są przez bufor o rozmiarze 100.
class Konsola{
public Konsola();
public void put(char c);
}
Zad. 22
Dana jest klasa Okno o podanym niżej interfejsie (wszystkie współrzędne są globalne):
class Okno {
//konstruuje okno o wymiarach (szer,wys) i lewym-górnym rogu w punkcie (x,y)
public Okno(int x, int y,int szer, int wys) throws WndException;
public void wyswietl() throws WndException; //wyświetla okno,
//przesuwa okno o wektor [dx,dy]
public void przesun(int dx, int dy) throws WndException;
//sprawdza, czy punkt o podanych współrzędnych zawiera się w oknie
public boolean zawiera(int x, int y);
//na pozycji (x,y) w oknie rysuje punkt o kolorze 'kolor' o ile należy on do okna
public void punkt(int x, int y, int kolor) throws WndException;
}
Wykorzystując mechanizm kompozycji i powyższą klasę napisz klasę PodwojneOkno, z takimi samymi metodami/konstruktorami. Podwójne okno powinno być podzielone na 2 równe części: lewą i prawą (w innej wersji: górną i dolną) zajmowane przez mniejsze okna (klasy Okno).
Zad. 23
Dana jest klasa Plik z podstawową, sekwencyjną (bez możliwości przesuwania pozycji bieżącej) funkcjonalnością zapisu i odczytu liczb. Wykorzystując tą klasę napisz 2 klasy realizujące mechanizm pliku z buforem. Obie mają działać identycznie, ale jedna z nich ma się opierać na kompozycji a druga na dziedziczeniu. Rozmiar bufora N ma być parametrem konstruktora.
Podczas zapisu dane nie wędrują za każdym razem na dysk tylko do wewnętrznego bufora. Dopiero po N takich zapisach za jednym razem wszystkie wysyłane są na dysk aby opróżnić bufor, itd. Podobnie przy czytaniu: na początku do bufora wczytywane jest od razu N liczb. Kolejne N czytań nie czyta z dysku tylko z tego bufora. Kiedy bufor jest pusty, wczytywanych jest kolejnych N liczb, itd. Zaproponuj odpowiednią hierarchię klas wyjątków. Uwaga: nie przechwytuj więcej wyjątków niż to jest niezbędne - przechwycony wyjątek nie poinformuje o błędzie tego, kto wywołał metodę/konstruktor.
class Plik {
//tryb: 0 - do pisania, 1 - do czytania
public Plik(String nazwa, int tryb) throws FileNotFoundException, AccessException;
public void pisz(int i) throws NotEnoughPlaceException; public int czytaj() throws ReadException, EOFException; public void close();
}
10