Programowanie obiektowe - laboratorium

[up]

Zasady zaliczania laboratorium

Na laboratorium są dwa duże zadania po 10 punktów. Maksymalną liczbę punktów można dostać tylko oddając zadanie w terminie. Za każdy rozpoczęty dzień opóźnienia od wyniku odejmowany jest jeden punkt, aż do osiągnięcia liczby zero, od tego momentu nie dostaje się już punktów a zadanie nie jest sprawdzane.

Do zadań wraz z treścią może być 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 według swojego uznania rozdziela do 10 punktów za małe zadania zadawane na poszczególnych zajęciach (w tym za zadanie o szybkości Javy).

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; ewentualnie, w razie nieobecności, można przesłać e-mailem.
  1. (27.02-06.03) Zaprojektuj klasy służące do reprezentowania różnych rodzajów pojazdów: autobus, helikopter, statek spacerowy, barka, ciężarówka, samolot pasażerski. Zapewnij, że pojazdy będą potrafiły się opisywać oraz podawać zużycie paliwa na pokonanie trasy od zadanego startu do celu. Diagram rysujemy w programie "dia" lub "Visual Paradigm".
  2. (06.03-13.03) Wygonaj diagram (model dziedzinowy) dla gry w brydża - rysunek np. w programie dia.
  3. (13.03-20.03) Napisz program wczytujący liczbę N i wypisujący liczby pierwsze pomiędzy 2 a N, za pomocą sita Eratostenesa.
  4. (20.03-3.04) Napisz program, który wczytuje z wejścia dwie dowolnie długie liczby i wypisuje ich sumę.
  5. (3.04-17.04) Klasa wielomian (jednej zmiennej), trzymamy w tablicy rozmiaru stopnia wielomianu +1 współczynniki (tzn. tab[3] to współczynnik przy x^3). 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.
  6. (17.04-8.05) Różne implementacje napisów: interfejs Napis opisujący dostępne operacje; klasa abstrakcyjna NapisAbstr (implementacja niektórych metod, niezależnych od reprezentacji, np. sklejanie dwóch napisów); dwie podklasy: NapisTab, NapisLst (napis w tablicy i w liście). Operacje z grubsza dowolne (długość(), dajZnak(int), ustawZnak(int, char), doklejZnak(char)). Oczywiście nie używamy String czy StringBuilder.
  7. (24.04-15.05) Hierarchia wyrażeń logicznych (analogiczne do wyrażeń arytmetycznych, które były w ostatnim czasie na ćwiczeniach): Operacje: Szkic rozwiązania:
  8. (8.05-15.05) Szachy. Gracze losowo przesuwają figury po planszy szachowej (przy nieco uproszczonych zasadach gry). Pełna treść zadania TUTAJ. Zadanie można sobie uprościć, według uznania. Ważne, aby wystąpiła hierarchia klas i podmienianie metod (dla figur). Jeśli ktoś zrobi dwa rodzaje figur zamiast wszystkich sześciu, to też będzie OK. Hierarchia/podmienianie występuje także dla graczy (ale mamy tylko jeden rodzaj gracza - gracz losowy). Dla ułatwienia implementacji można założyć, że gracz tylko wybiera figurę (losowo), a konkretny ruch wybiera już figura (więcej sensu miałoby wybieranie ruchu przez gracza, ale wtedy figura musiałaby przekazywać listę dozwolonych ruchów - trochę trudniej to zrobić).
  9. (15.05-22.05) Wyrażenia nawiasowe:
  10. (22.05-5.06) Stwórz klasę Wektor sparametryzowaną typem elementów K (właściwe skojarzenie: przestrzeń liniowa nad ciałem K). Implementacja w tablicy lub z użyciem np. ArrayList. Nasza klasa powinna udostępniać operacje na wektorach (porównywanie, mnożenie przez skalar, iloczyn skalarny, wypisywanie, porównywanie, ...) - należy zastanowić się, jakie ograniczenia na K nakładamy.
  11. (22.05-5.06) Należy stworzyć klasę TablicaZLicznikami. Implementuje ona tablicę zawierającą elementy wskazanego typu (parametr klasy) oraz tablicę liczników (int) dostępów do elementów (żeby można było wykonać jakiś algorytm na tablicy, a potem sprawdzić jak często używał poszczególnych elementów). Można rozróżniać czytanie/pisanie (wtedy dwie tablice liczników) albo nie, dowolnie. Dodatkowo (jak starczy czasu) tablica ma mieć metodę sortuj (dowolny algorytm przez porównywanie) z parametrem klasy implementującej interfejs Porównywacz.  Porównywacz<T> ma tylko jedną metodę int porównaj(T, T), służącą do porównywania elementów (wyniki -1, 0, 1 lub alternatywnie wynik boolean dla <=).
  12. (5.06-12.06)
  13. (12.06-19.06) 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.