Projekt końcowy Zadanie końcowe na koniec zajęć z Programowania Obiektowego polega na wykonaniu i oddaniu prowadzącemu ćwiczenia samodzielnie wykonanego projektów. Należy je zrealizować w wybranym języku obiektowym (może być to język nieomawiany podczas zajęć, jednak jego wybór musi być uzgodniony z prowadzącym ćwiczenia). Propozycje tematów podane są poniżej. Można też zaproponować własny temat, jednak musi być on wcześniej uzgodniony z prowadzącym. Przyjmujemy arbitralnie, że program ma zawierać przynajmniej siedem definicji klas.

Wolno korzystać z klas bibliotecznych, w szczególności związanych z przechowywaniem danych na dysku. Oczywiście te klasy nie wlicza się do bilansu, a ich użycie należy zaznaczyć w komentarzu.

W terminie ustalonym przez wykładowcę student oddaje cały projekt, tj. dokumentację oraz tekst źródłowy programu zgodny z opisanymi poniżej zasadami. Częścią projektu jest prezentacja programu. Opis programu ma być pisemny, najlepiej oddany na dyskietce w jakimś popularnym formacie, np. LaTeX, ps, MS Word, ASCII itp. Rysunki mogą być utworzone odręcznie.

Projekt nie musi być rozbudowany, bowiem w przeciwnym przypadku zakończenie go do końca semestru może być kłopotliwe. Dlatego proszę podejść realistycznie do projektu. Proszę przyjąć, że nie jest wymagana żadna wyszukana oprawa graficzna, to może być rozwiązane nawet za pomocą bardzo prymitywnych środków bez żadnych rozwijanych menu; lepiej skupić się na na dopracowaniu dokumentacji i ważnych klas.

Możliwy jest projekt zespołowy. Jednak powinien on umożliwiać wyraźne wyodrębnienie fragmentu programu, za który jest odpowiedzialna dana osoba (np. jedna osoba wykonuje bibliotekę pewnych klas, druga zaś wykorzystuje te klasy). Jednak w takim przypadku każda osoba przygotowuje odrębną dokumentację.

Cały projekt ma być napisany samodzielnie. W wypadku wykrycia plagiatu konsekwencją jest nieczyste sumienie, zepsuta opinia i oczywiście niezaliczenie przedmiotu. Nie jest uważane za plagiat skorzystanie z cudzego kodu (o ile autor zezwolił na to), jeżeli w programie wyraźnie zostanie zaznaczony odpowiedni fragment wraz ze źródłem. Jednak rozmiar 'cytatów' w programie nie może przekroczyć 20% rozmiaru programu.

Postać końcowa projektu

Ocenie podlega dokument dostarczony na koniec semestru składający się z trzech części. Należy dostarczyć też postać skompilowaną postać programu i program źródłowy.

Części składowe dokumentacji

Analiza obiektowa zadania
Wynik analizy zawiera przede wszystkim:
  • spis klas, które zawiera program;
  • tekstowy opis analizy:
    • akapit opisujący całościowo architekturę systemu;
    • po jednym akapicie opisującym każdą klasę/obiekt;
  • zidentyfikowane wzorce projektowe uzyte w programie; mogą to być wzorce inne niż omówione na wykładzie.
Pamiętaj, że analiza obiektowa ma być niezależna od języka, bez żadnych odwołań do składni czy funkcji bibliotecznych konkretnych języków.
Projekt obiektowy
  • Graficzny opis klas, związków między klasami, atrybuty i usługi. Rysunek może być odręczny.
Inne zastosowania
Opisz w jednym paragrafie hipotetyczną aplikację, w której można wykorzystać jedną z klas (lub kilka klas) wymienionych w w analizie problemu. Pamiętaj, że pytanie jest o tzw. reusing, tzn. sformułowania typu: zmieniając nieco deklarację klasy ... są niedopuszczalne.

Zasady oceniania

Zgodnie z zasadami przedstawionymi na początku semestru, za cały projekt można zdobyć 20 pkt. Oceniana jest całość wykonania, tj. sam program jak i jego opis. Liczba punktów jest proporcjonalna do stopnia realizacji wszystkich wymagań. Proszę pamiętać, że częścią oceny jest też wystąpienie podczas zajęć.

Tematy projektów

Uwaga: nie należy traktować tych projektów jako ostatecznej wersji, ale jako pewien zarys propozycji. Zachęcam do ich modyfikacji i przystosowania do własnych zainteresowań.

Zachęca się również studentów do wymyślania własnych tematów projektów.

Firma przewozowa

Wstęp

Firma Kurierska (FK) przewozi dokumenty i małe paczki. Są one pakowane w kartony, które z kolei są transportowane samochodami z jednej stacji FK do innej.

Dane są dostarczane w dwóch plikach: jeden opisuje odległości między stacjami FK, drugi opisuje godziny, o jakich są dostarczane kartony do poszczególnych stacji.

Ustalenie problemu

Paczki są przywożone na stacje o różnych porach dnia; kierowca może przybyć zbyt wcześnie i musi czekać na paczkę do zawiezienia.

Zauważmy, że liczba przewiezionych paczek nie jest istotna. Najważniejszy jest powrót kierowców do stacji początkowej, potem czas przejazdów, minimalizacja czasu pracy jest najmniej ważna.

Zakładamy, że optymalna droga dla danego kierowcy jest znana przed ustaleniem drogi dla następnego. Każdy kierowca zaczyna dzień, gdy jego pierwsza paczka jest dostępna na stacji "start". Liczba kierowców nie jest ustalona, ale zawsze jest co najmniej jeden; nowi kierowcy pojawiają się, gdy są konieczni. Praca dla każdego kierowcy jest ustalana, gdy znana jest droga dla jego poprzednika na podstawie pozostałych kartonów.

Format danych wejściowych

Pierwszy plik, np. paczki, zawiera w kolejnych wierszach dane o paczkach następującej postaci:

  id skąd dokąd kiedy

gdzie id jest co najwyżej 9--cyfrową liczbą będącą identyfikatorem kartonu, skąd i dokąd oznaczają odpowiednio z jakiego miejsca do jakiego należy przewieźć karton; kiedy jest 4--cyfrową liczbą oznaczającą godzinę, o jakiej paczka będzie dostępna na stacji początkowej skąd. Plik mapa zawiera informacje o odległościach między miejscami wymienionymi w paczki następującej postaci:

  stacja1 stacja2 czas

gdzie czas oznacza czas potrzebny do przejechania ze stacji stacja1 do stacji stacja2, oraz w przeciwnym kierunku.

Wyniki

Plik wynikowy ma zawierać optymalną drogę dla każdego kierowcy, tj. jego identyfikator, jego "rozkład jazdy" wraz z identyfikatorami paczek, oraz całkowity czas pracy i czas poświęcony na przewożenie paczek; oraz wszystkie nieprzewiezione kartony.

Obiektowa baza danych

Opis

Zaprojektuj system zarządzania obiektową bazą danych, to znaczy taką bazą, która przechowuje w plikach dyskowych obiekty, umożliwia przeszukiwanie bazy, wkładanie elementów, usuwanie i modyfikowanie. Projekt może mieć postać biblioteki używanej w innym projekcie.

System zapamiętując i odtwarzając obiekty musi też uwzględniać różne dodatkowe informacje, np. przynależność do odpowiedniej klasy, uwzględnić fakt, że wartością pola obiektu może być inny obiekt (który w takim wypadku też należy odtworzyć).

Zadanie

Program ma przede wszystkim

Informacje dodatkowe

Można przyjąć, że klasy przechowywane w bazie danych są z góry zadane w odpowiednim pliku włączanym do programu podczas kompilacji. Oczywiście w takim przypadku dla każdego zestawu klas otrzymujemy odrębny program. Dla ułatwienia można też przyjąć, że nie są przechowywane jako jednostki kolekcje obiektów (drzewa, listy czy tablice). Można też dla ułatwienia przyjąć, że cała baza mieści się w pamięci operacyjnej.

System informacji geograficznej

Opis

System informacji geograficznej (GIS - Geographic Information System) jest to system gromadzący wszelkie dane o jakimś obszarze: ukształtowanie terenu, właściciele, informacje geologiczne, zabudowania czy przebieg dróg, rur i kabli.

Zadanie

Zaprojektuj i zaimplementuj klasy reprezentujące różne obiekty geograficzne. Uwzględnij w swoim projekcie takie elementy jak 'projektowane drogi czy kable'. Dla ułatwienia można przyjąć, że granicami 'obszarów' są nieprzecinające się łamane zamknięte. Zrealizuj graficzny system wizualizacji informacji dla wskazanego fragmentu mapy (dla ułatwienia wybrany fragment może mieć kształt prostokąta). Przyjmij, że możliwe jest dowolne wybieranie elementów, jakie mają się znaleźć na mapie.

Inne informacje

Dane mogą być przechowywane w zwykłym pliku tekstowym. W realizacji należy uwzględnić przynajmniej jakieś proste odwzorowanie ukształtowanie terenu (bez rzek itp.), budynki i drogi. Jako wizualizacja wystarcza zwykły rzut na płaszczyznę.

Planowanie budżetu

Opis

Przy planowaniu budżetu (choćby nawet domowego) zbiera się dane o przewidywanych dochodach i wydatkach wraz z przewidywanymi terminami wpływów pieniędzy i płatnościami. Płatności zwykle dzieli się na rodzaje, które w jakiś sposób odpowiadają ich ważności (zwykle wpierw płaci się rachunki za prąd i telefon, a jak coś zostanie, to można pójść za resztę do kina). Zazwyczaj jednak faktyczne wpływy i płatności różnią się od planowanych. Co więcej, mogą się pojawić nieprzewidziane wpływy lub wydatki. W przypadku bardziej skomplikowanych budżetów panowanie nad wszystkim może być poważnym problemem.

Zadanie

Zadanie polega na napisaniu programu wspomagającego panowanie nad budżetem. Podstawowe zadania programu to:

Dane

Można przyjąć, że dane są pamiętane w pliku (lub plikach) tekstowym o ustalonym formacie.

Labirynt

Wstęp

Zadaniem jest napisać program symulujący w bardzo uproszczony sposób gry polegające na poruszaniu się po tajemniczych labiryntach, zbieraniu skarbów itp. Aby tego dokonać, muszą zostać zdefiniowane podziemia. Podziemia składają się z komnat, z których można przez przejścia przechodzić do następnych komnat. Specjalnym rodzajem przejść są drzwi, przez które można przechodzić w dwie strony. Do drzwi jest jednak potrzebny odpowiedni klucz, aby je otworzyć. W komnatach mogą się znajdować różne rzeczy, np. klucze lub skarby. Użytkownik może poruszać się po komnatach wydając w trybie interakcyjnym polecenia:

przejdź "przejście"
otwórz "drzwi"
zamknij "drzwi"
rozejrzyj się - opisuje komnatę oraz podaje, jakie są w komnacie przedmioty 
oraz stworzenia;
sprawdź "przedmiot" - podaje dokładny opis przedmiotu;
weź "przedmiot"
połóż "przedmiot"
koniec

Dodatkowo po podziemiach mogą się błąkać w sposób losowy różne stwory. Dla uproszczenia przyjmijmy, że są to złodzieje, którzy mogą nam ukraść jeden posiadany przedmiot, jeśli go spotkamy w komnacie.

Arkusz kalkulacyjny

To zadanie polega na zaprogramowaniu prostego arkusza kalkulacyjnego rozumianego jako zbiór komórek zawierających wyrażenia arytmetyczne. Wśród wyrażeń arytmetycznych mogą się znajdować odwołania do innych komórek, co oznacza, że w takim wypadku najpierw jest obliczana wartość pierwotnej komórki, zaś uzyskana wartość może być argumentem dla innych wyrażeń. Oczywiście, nie może być tak, że powstają cykliczne zależności między komórkami, gdyż wtedy ich wartość jest niejednoznaczna. Przyjmij, że komórki są identyfikowane przez nazwę.

Dane wejściowe

Plik wejściowy zawiera w kolejnych wierszach dane następującej postaci:

identyfikator: <wyrażenie arytmetyczne>

gdzie identyfikator jest nazwą definiowanej komórki, a <wyrażenie arytmetyczne> definiuje wyrażenie obliczane w tej komórce.
Zadaniem programu jest wczytać tak zdefiniowany arkusz i jeśli jest poprawny, obliczyć i wypisać wartości obliczonych wyrażeń.

Powodzenia!