Paradygmaty programowania/Ćwiczenia 3: Typy, typy abstrakcyjne
Zadanie 1
Zaimplementuj bibliotekę do obsługi liczb w reprezentacji stałopozycyjnej. Biblioteka powinna umożliwiać tworzenie liczb w reprezentacji stałopozycyjnej o różnych wielkościach (tzn. o danej liczbie cyfr przed i po przecinku) oraz prowadzenie typowych obliczeń — powiedzmy działań arytmetycznych, potęgowania i pierwiastkowania. Pamiętaj, że rzecz ma sens tylko wtedy, gdy będzie działała szybko.
Zadanie 2
Napisz klasę w C++ lub Javie implementującą napisy w pełni dynamiczne. Oczywiście nie korzystaj z gotowych klas w rodzaju StringBuilder lub StringBuffer. Klasa powinna dawać przynajmniej takie metody: tworzenie napisu (pustego, ze stałej lub z innego napisu), sprawdzanie równości, porównywanie alfabetyczne, konkatenacja, długość, wycinanie fragmentu.
Zadanie 3
Zapisz ogólną postać wzoru na adres elementu tablicy wielowymiarowej pamiętanej wierszami przy założeniu, że tablica ma k wymiarów, indeksujemy od zera, liczba elementów w poszczególnych wymiarach to , a indeks, dla którego liczymy adres, to
Zadanie 4
Zaimplementuj tablice asocjacyjne w dowolnym języku (oczywiście nie korzystając z gotowego mechanizmu, jeśli on w języku już istnieje). Implementacja za pomocą funkcji haszujących pozwala uzyskać stały średni czas dostępu do tablicy, podczas gdy drzewo binarne daje średni czas rzędu log n, gdzie n jest liczbą elementów w tablicy. Czy w takim razie tablice haszujące są bezwzględnie lepsze od drzew w tej roli? W jakich sytuacjach drzewo mogłoby być lepsze?
Zadanie 5
Zaimplementuj sparametryzowaną klasę w C# lub Javie, obsługującą stos elementów dowolnego typu, z operacjami włożenia na stos, zdjęcia ze stosu i sprawdzenia, czy stos jest pusty. Jak zwykle, nie korzystaj z gotowych rozwiązań... Czy są sytuacje, gdzie lepiej zaimplementować kilka klas dla konkretnych typów zamiast jednej klasy sparametryzowanej?
Zadanie 6
Implementując klasy sparametryzowane, twórcy Javy zastosowali dość proste w istocie rozwiązanie. Kompilując kod sparametryzowany, kompilator usuwa z niego informacje o parametrach „typowych” i zastępuje je ogólnym typem Object, następnie generuje kod jak dla klas bez parametrów i w razie potrzeby dodaje konwersje typów. Jak sądzisz, dlaczego zdecydowano się na takie rozwiązanie?
Zadanie 7
Implementacja sparametryzowanych klas w C++, C# i Javie to trzy różne podejścia do sprawy. Jakie są wady i zalety tych rozwiązań? Ciekawe porównanie tych implementacji można znaleźć pod adresem http://www.artima.com/intv/generics.html.
Test
Pojęcie typu w językach imperatywnych bliskie jest pojęciu:
całki Riemanna
pary uporządkowanej
zbioru nieskończonego
zbioru skończonego
Który z opisanych poniżej typów można uznać za typ abstrakcyjny? Rzecz dzieje się w języku C:
struktura wraz z kilkoma działającymi na niej funkcjami
typ wskaźnikowy T *, gdzie T jest zdefiniowane następująco\: typedef int T[10];
wbudowany typ float
unia złożona z pól tego samego typu
W której sytuacji tablica asocjacyjna byłaby istotnie wygodniejsza niż zwykła tablica?
mamy katalogi ponumerowane od 1 do 100 i zapisujemy ich rozmiar
sortujemy obszerną tablicę liczb typu double
wyszukujemy największą liczbę w tablicy
zapisujemy kolor przejeżdżających samochodów, identyfikując je numerami rejestracyjnymi
Ewentualne luki między przechowywanymi w pamięci polami rekordu biorą się z:
konieczności sprawdzenia zgodności typów
konieczności umieszczania pól pod adresami, których 1 lub 2 najmniej znaczące bity są zerami
niedoskonałości kompilatorów
szybkich przesunięć cyklicznych w jednostce arytmetyczno-logicznej procesora
Załóżmy, że w języku C sprawdzamy równość struktur (oczywiście tego samego typu). Dlaczego w ogólności nie można tego zrobić przez porównywanie bloków pamięci?
istnieje kilka rozmiarów liczb całkowitych
napisy mogą zawierać nieistotne znaki za znacznikiem końca
nie można z góry przewidzieć, czy napisy są zapisane w kodzie ASCII, czy Unicode
reprezentacja liczb float i double nie jest jednoznaczna
Który operator języka C jest potrzebny, gdy wykorzystujemy wskaźniki do adresowania pośredniego?
&
++
--
nawiasy kwadratowe do indeksowania
Załóżmy, że p jest zmienną wskaźnikową. W którym języku wyrażenie ++p jest poprawne?
C++
C\#
Java
Pascal
Które stwierdzenie jest fałszywe w odniesieniu do klas w języku C++?
definicja klasy nie musi zawierać destruktora
funkcje z klasy mogą być kompilowane jako inline
konstruktor ma taką samą nazwę jak klasa
konstruktor nie może być przeciążany
W Javie obiekty są alokowane:
dynamicznie na stercie
dynamicznie na stosie
statycznie na stercie
statycznie na stosie
Sparametryzowane typy abstrakcyjne uzyskuje się w C++ za pomocą deklaracji z użyciem słowa kluczowego:
args
generic
params
template