Programowanie obiektowe:
tematy zadania projektowego
Zadanie 1
Zdefiniować klasę abstrakcyjną Sekwencja do reprezentowania sekwencji liczb całkowitych oraz jej konkretne klasy pochodne Wektor i Lista. Klasa Sekwencja reprezentuje wspólne cechy sekwencji niezależne od szczegółów implementacji i powinna udostępniać m.in. funkcje wirtualne realizujące następujące operacje:
dostęp sekwencyjny do elementów sekwencji (po kolei od pierwszego do ostatniego),
dostęp swobodny do elementów sekwencji (według numeru),
wykonanie podanej funkcji dla każdego elementu sekwencji,
dodawanie elementów na początku i na końcu,
wstawianie elementów w środek.
Klasa Wektor powinna implementować sekwencję jako wektor (tablicę) o zmiennej długości z pamięcią przydzielaną dynamicznie. Klasa Lista powinna reprezentować sekwencję jako listę jednokierunkową.
Dla każdej z klas zdefiniować konstruktory pozwalające na utworzenie sekwencji pustej, sekwencji o podanej początkowej długości i z podaną wartością początkową elementów, sekwencji zawierającej elementy danej tablicy liczb całkowitych oraz sekwencji będącej kopią innej sekwencji (dowolnego obiektu dowolnej klasy pochodnej klasy Sekwencja), a także odpowiednie destruktory zwalniające przydzieloną dla sekwencji pamięć. Ponadto zdefiniować operatory:
= (przypisanie sekwencji),
+= (zmodyfikowanie sekwencji przez dodanie do jej elementów odpowiednich elementów innej sekwencji lub dodanie do każdego elementu tej samej wartości),
-= (zmodyfikowanie sekwencji przez odjęcie od jej elementów odpowiednich elementów innej sekwencji lub odjęcie od każdego elementu tej samej wartości),
*= (zmodyfikowanie sekwencji przez pomnożenie jej elementów przez odpowiednie elementy innej sekwencji lub pomnożenie każdego elementu przez tę samą wartość),
/= (zmodyfikowanie sekwencji przez podzielenie jej elementów przez odpowiednie elementy innej sekwencji lub podzielenie każdego elementu przez tę samą wartość),
+ (dodawanie sekwencji element po elemencie),
- (odejmowanie sekwencji element po elemencie),
* (mnożenie sekwencji element po elemencie),
/ (dzielenie sekwencji element po elemencie).
Operatory powinny jako argumenty przyjmować sekwencje będące obiektami dowolnej klasy pochodnej klasy Sekwencja.
Zadanie 2
Zdefiniować klasę abstrakcyjną Wielomian do reprezentowania wielomianów oraz jej konkretne klasy pochodne WielomianTablica i WielomianLista. Klasa Wielomian reprezentuje wspólne cechy wielomianu niezależne od szczegółowej implementacji i powinna udostępniać m.in. funkcje wirtualne realizujące następujące operacje:
dostęp do współczynnika przy podanej potędze zmiennej,
dodanie do wielomianu nowego składnika określonego przez potęgę i współczynnik.
Klasa WielomianTablica powinna reprezentować wielomian jako tablicę współczynników przy kolejnych potęgach zmiennej, określonych przez indeks tej tablicy. Pamięć dla niej należy przydzielać dynamicznie i zmieniać jej rozmiar w razie potrzeby. Klasa WielomianLista powinna reprezentować wielomian jako jednokierunkową listę przechowującą pary złożone z potęgi zmiennej i współczynnika przy tej potędze, przy czym każdej potędze może odpowiadać co najwyżej jeden element listy i nie mogą w niej występować żadne elementy ze współczynnikami równymi 0.
Dla każdej z klas zdefiniować konstruktory umożliwiające utworzenie wielomianu „pustego” (stale równego 0), wielomianu o podanym stopniu i współczynnikach podanych w tablicy oraz wielomianu będącego kopią innego wielomianu (dowolnego obiektu dowolnej klasy pochodnej klasy Wielomian), a także destruktory zwalniające przydzieloną pamięć. Ponadto zdefiniować operatory:
= (przypisanie wielomianu),
+= (zmodyfikowanie wielomianu przez dodanie do niego innego wielomianu),
-= (zmodyfikowanie wielomianu przez odjęcie od niego innego wielomianu),
*= (zmodyfikowanie wielomianu przez pomnożenie go przez inny wielomian),
+ (dodawanie wielomianów),
- (dodawanie wielomianów),
* (mnożenie wielomianów).
Operatory powinny jako argumenty przyjmować wielomiany będące obiektami dowolnej klasy pochodnej klasy Wielomian.
Zadanie 3
Zdefiniować klasę abstrakcyjną BuforEdycji do reprezentowania bufora tekstu w edytorze oraz jej konkretne klasy pochodne BuforWierszowy i BuforCiagly. Klasa BuforEdycji reprezentuje wspólne cechy bufora tekstu niezależne od szczegółowej implementacji i powinna zawierać składowe-zmienne reprezentujące aktualną pozycję (wiersz i kolumnę) w buforze oraz udostępniać m.in. funkcje wirtualne realizujące następujące operacje:
przejście do znaku w podanym wierszu i kolumnie,
przejście do następnego/poprzedniego wiersza w tej samej kolumnie,
przejście do następnej/poprzedniej kolumny w tym samym wierszu,
dostęp do aktualnego znaku lub znaku w podanym wierszu i kolumnie oraz jego modyfikację,
usunięcie aktualnego znaku lub znaku w podanym wierszu i kolumnie,
dodanie znaku w aktualnym miejscu lub w podanym wierszu i kolumnie,
dodanie wiersza po aktualnym wierszu lub wierszu o podanym numerze,
usunięcie aktualnego wiersza lub wiersza o podanym numerze.
Klasa BuforWierszowy powinna reprezentować bufor tekstu jako tablicę wierszy, z dynamicznie przydzielaną pamięcią i możliwością zmiany liczby oraz długości wierszy. Każdy wiersz tekstu jest wówczas napisem (łańcuchem znakowym), na którego pierwszy znak wskazuje wskaźnik przechowywany w tablicy pod indeksem odpowiadającym numerowi wiersza. Klasa BuforCiagly powinna reprezentować bufor tekstu jako jeden „duży” ciągły napis (łańcuch znakowy), a podział na wiersze zaznaczają w nim znaki nowego wiersza. W tym przypadku pamięć powinna być przydzielana dynamicznie z zapasem i po jej zapełnieniu w razie potrzeby powiększana.
Dla każdej z klas zdefiniować konstruktory umożliwiające utworzenie bufora pozwalającego na przechowywanie tekstu liczącego co najmniej podaną liczbę wierszy i kolumn oraz bufora będącego kopią innego bufora (dowolnego obiektu dowolnej klasy pochodnej klasy BuforEdycji), a także destruktory zwalniające przydzieloną pamięć. Ponadto zdefiniować operatory:
= (skopiowanie tekstu z jednego bufora do drugiego, z zamazaniem jego poprzedniej zawartości),
+= (zmodyfikowanie bufora przez wklejenie do niego innego w aktualnym miejscu zawartości innego bufora),
-= (zmodyfikowanie bufora przez usunięcie z niego podanej liczby kolejnych znaków, licząc od aktualnego),
*= (zmodyfikowanie bufora przez dołączenie do niego na końcu zawartości innego bufora).
Operatory powinny jako argumenty przyjmować bufory będące obiektami dowolnej klasy pochodnej klasy BuforEdycji.