Programowanie obiektowe - laboratorium
Zadania na 3.06
Bardziej zaawansowany przykład: demomvc.zip z tej strony
Zasady zaliczania laboratorium
Na laboratorium będą dwa duże zadania po 10 punktów. Maksymalną liczbę punktów
można dostać tylko oddając zadanie w terminie. Za rozpoczęty tydzień
opóźnienia uzyskana liczba punktów jest mnożona przez 0.8, a za rozpoczęty
drugi tydzień opóźnienia przez 0.6. Rozwiązania spóźnione więcej niż pełne
dwa tygodnie nie będą sprawdzane. Do obu zadań będzie wraz z treścią podany
prosty test (dane i wynik), programy, które nie będą spełniać tego testu,
nie będą w ogóle oceniane.
Dodatkowo prowadzący grupę według swojego uznania rozdziela do 10 punktów za małe
zadania zadawane na poszczególnych zajęciach.
Małe zadania
Poniższe zadania są warte 1 punkt. Łącznie będzie nieco więcej niż 10 zadań,
więc nie trzeba oddawać wszystkich, aby zdobyć 10 punktów (jednocześnie nie
można dostać więcej niż 10 punktów).
Rozwiązanie zadania można przedstawić na zajęciach, na których zostało ono zadane, lub na
kolejnych.
- (4.03-11.03) Napisz program, który wczyta z wejścia dwie liczby
całkowite a,b
oraz wypisze na wyjście wszystkie liczby całkowite od a do
b.
- (11.03-18.03) Do wyboru jedno z dwóch zadań:
- Program, który 1) wczyta liczbę N z wejścia, 2) wyznaczy, wypisze i
zapamięta w tablicy wszystkie
liczby pierwsze od 2 do pierwiastek(N) sitem Eratostenesa, 3) wyznaczy
rozkład liczby N na czynniki pierwsze (korzystając z tablicy liczb
pierwszych z punktu 2).
- Wariant wież z Hanoi: na drugi drążek chcemy przenieść krążki o numerach
parzystych (czyli co drugi), pozostałe mają pozostać na pierwszym drążku.
Program ma wypisać sekwencję ruchów (który krążek, skąd, dokąd).
- (18.03-25.03) Przygotuj klasę implementującą duże liczby naturalne
(najlepiej dowolnego rozmiaru - gdy tablica się przepełni należy zaalokować większą).
Operacje (co najmniej): konwersja z napisu, na napis, dodawanie.
- (25.03-1.04)
Klasa Student z kilkoma atrybutami:
- imię,
- nazwisko,
- nr indeksu,
- nr roku,
- lista przedmiotów (np. w tablicy napisów, zakładamy, że nie ma więcej
przedmiotów niż 50, pamiętamy do jakiego miejsca pełna).
konstruktorami:
- biorący imię, nazwisko, rok, nrIndeksu, przedmioty
- biorący tylko imię, nazwisko, rok, nrIndeksu - natomiast na listę
przedmiotów wstawia jeden przedmiot "Programowanie Obiektowe"
metodami:
- wypisywanie (toString) - komplet danych w rodzaju (Jan Kowalski,
nr ind. 27228, rok 3, Programowanie Obiektowe, Indywidualny Projekt
Programistyczny).
-
zwiększRok
- dodajPrzedmiot(String)
- ewentualnie UsuńPrzedmiot(String) - znajdujemy, usuwamy, w jego miejsce wpisując ostatni
- nrIndeksu(), nrRoku()
- imięNazwisko() (daje Jan Kowalski)
Dla chętnych: stwórz także klasę Osoba, z której będzie dziedziczyć klasa Student.
Odpowiednio podziel odpowiedzialności między te dwie klasy.
- (1.04-8.04) Proszę zaimplementować jedno z dwóch zadań z ostatnich
ćwiczeń:
- Klasa bufor cykliczny (wstawianie/usuwanie z początku i końca,
obliczanie liczby elementów, sprawdzanie czy pusty). Implementacja: tablica;
cykliczny, bo uważamy, że po elemencie n-1 jest element 0-wy. Gdy tablica się
kończy przydzielamy większą.
- Klasa wielomian (jednej zmiennej), trzymamy w tablicy rozmiaru stopnia
wielomianu +1 współczynniki (tzn. tab[3] to współczynnik przy x3). Operacje
do zaimplementowania: dodawanie, wypisywanie (ładne, bez zerowych
współczynników, ale uwaga na samo 0), mnożenie, tworzenie z kilkoma
konstruktorami: jako jednomian, z tablicy współczynników, z innego wielomianu), obliczanie wartości w punkcie. Dla
ambitnych dzielenie.
- (8.04-22.04) Dziś proste zadanie na polimorfizm.
Napisz hierarchię klas Zwierząt zawierającą Psa i Kota.
Każde zwierzę ma mieć imię. Dodaj metodę odezwijSię. Stwórz tablicę różnych
zwierząt (co najmniej pięć), różnych rodzajów (psy i koty) oraz funkcję,
która dostawszy taką tablicę wypisuje dla każdego zwierzęcia jego imię oraz
to co miało ono do powiedzenia.
- (22.04-29.04) Implementujemy zadanie o wyrażeniach, które było na ćwiczeniach (nie
trzeba pisać wszystkiego - raczej jakąś część rozsądnej wielkości):
Chcemy zdefiniować klasę obiektów reprezentujących wyrażenia arytmetyczne
jednej zmiennej rzeczywistej (x). Interesują nas następujące operacje:
- policzenie wartości w zadanym punkcie,
- policzenie (symboliczne) pochodnej,
- policzenie (numeryczne) całki oznaczonej,
- wypisywanie,
- upraszczanie.
Wyrażenia mogą zawierać:
- stałe liczbowe,
- wystąpienia zmiennej x,
- operatory arytmetyczne (dwuargumentowe): +, -, *, /, ...
- funkcje jednoargumentowe: sin, lg, ...
- nawiasy okrągłe.
- (29.04-6.05) Przetestować konstrukcję try-with-resources.
Co się dzieje, gdy close w zasobie rzuca wyjątek (gdy wewnątrz try jest /
nie jest rzucany wyjątek)?
Co się dzieje, gdy konkstruktor zasobu rzuca wyjątek?
Czy jeśli close jednego zasobu rzuca wyjątek, to close drugiego zostanie
wywołany?
- (6.05-13.05) Stworzyć własną implementację listy Lista<T> umożliwiającą co najmniej wstawianie elementów oraz implementującą interfejs Iterable<T>.
- (13.05-20.05) Zaproponuj interfejs ImmutableSet<E> reprezentujący
niezmienialny zbiór (operacje wstawiania i usuwania mają tworzyć nowy
zbiór). Przygotuj implementację tego interfejsu za pomocą drzew BST (niech
wszystkie używane pola będą zadeklarowane jako final, wtedy na pewno
struktura będzie niezmienialna). Niech operacje takie jak size() i
isEmpty() działają w czasie stałym, natomiast wstawianie, wyszukiwanie i usuwanie w czasie
proporcjonalnym do wysokości (a nie do rozmiaru) drzewa. (Usuwanie
opcjonalnie).
- (20.05-27.05) Spróbujmy zaimplementować kalkulator.
Wczytuje on wyrażenie (jedną linię) ze standardowego wejścia i wylicza je.
Wyrażenie może zawierać liczby (rzeczywiste), dodawanie, odejmowanie, mnożenie, dzielenie; można dodać coś jeszcze.
Przykładowe wyrażenie: (10+9*8)*7.
Dobrze gdyby program obsługiwał wyrażanie zarówno z jak i bez spacji oddzielających poszczególne elementy.
Proszę zwrócić uwagę na liczby ujemne / minus jednoargumentowy.
- (27.05-3.06) Napisać jakiś ciekawy program korzystający z GUI.