Programowanie obiektowe - laboratorium
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.
- (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".
- (06.03-13.03) Wygonaj diagram (model dziedzinowy) dla gry w brydża -
rysunek np. w programie dia.
- (13.03-20.03) Napisz program wczytujący liczbę N i wypisujący liczby pierwsze pomiędzy
2 a N, za pomocą sita Eratostenesa.
- (20.03-3.04) Napisz program, który wczytuje z wejścia dwie dowolnie długie liczby i
wypisuje ich sumę.
- (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.
- (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.
- (24.04-15.05)
Hierarchia wyrażeń logicznych (analogiczne do wyrażeń arytmetycznych,
które były w ostatnim czasie na ćwiczeniach):
- stałe: True, False,
- zmienna: x
- operatory 2-argumentowe: and, or, ...
- operatory 1-argumentowe: not, ...
Operacje:
- wypisz
- policz wartość dla zadanego x (który może być prawdą lub fałszem)
Szkic rozwiązania:
- interfejs "wyrażenie logiczne" z powyższymi dwiema operacjami
- klasy abstrakcyjne dla operatora 2-argumentowego i operatora 1-argumentowego
- klasy konkretne
- (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ć).
- (15.05-22.05)
Wyrażenia nawiasowe:
- Dane jest na wyjściu wyrażenie nawiasowe z '(' i ')'; sprawdzić, czy jest poprawne
(licznik typu int różnicy między liczbą lewych i prawych, cały czas musi byc >=0, na końcu 0).
- To samo dla dwóch rodziajów nawiasów '( )' i '[ ]'.
Teraz zamiast liczby potrzeba stosu (lewych nawiasów).
- W zadaniu staramy się zastosować wyjątki (np. pusty stos, niepoprawny znak, przepełnienie stosu - stos zbyt mały) i konstrukcję try/catch.
- (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.
- (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 <=).
- (5.06-12.06)
-
Napisać program, który wczytuje kolejne słowa z pliku, a na koniec wyświetla listę napotkanych słów bez powtórzeń.
Korzystamy z File, Scanner oraz Set (spróbować HashSet, LinkedHashSet, TreeSet).
-
Druga wersja: znowu wczytujemy słowa z pliku, lecz tym razem na koniec dla każdego słowa wypisujemy listę numerów wierszy, w których to słowo wystąpiło
(z powtórzeniami, jeśli wystąpiło dwukrotnie w jakimś wierszu).
Przydatny będzie Map oraz List.
A jak dobrać się do numerów wierszy? (podpowiedź: Scanner można zainicjalizować Stringiem)
- (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.