Lista zadań z Pascala nr 5.

Transkrypt

Lista zadań z Pascala nr 5.
Lista zadań z Pascala nr 5.
Zad. 1. Napisz moduł pozwalający na korzystanie z list dwukierunkowych i oblicz metodą Monte Carlo średnią liczbę porównań wykonywanych przez algorytm
sortowania przez wstawianie do listy dwukierunkowej.
Lista dwukierunkowa (potrzebna w tym zadaniu) składa się z rekordów o trzech
polach. W dwóch polach pamiętane są wskaźniki do następnego i do poprzdniego
elementu listy. Trzecie pole zawiera informację przechowaną w tym elemencie listy. W naszym przypadku może to być wartość typu Integer. W przypadku listy
dwukierunkowej, a w przeciwieństwie do listy jednokierunkowej, aby mieć dostęp
do całej listy i informacji zgromadzonej na liście wystarczy znać wskaźnik do dowolnego elementu listy.
W module powinny się znaleźć procedury pozwalające utworzyć jednoelementową listę dwukierunkową, znaleźć pierwszy element niepustej listy dwukierunkowej,
wyświetlić kolejno wszystkie liczby pamiętane w kolejnych elementach listy, od
pierwszego do ostatniego, i inne (nie wymieniłem bardzo ważnej procedury). Ponieważ mamy sortować przez wstawianie, więc będzie zajmować się niemalejącymi
listami, w których kolejny element jest przynajmniej taki, jak poprzedni. Będzie
też potrzebna procedura pozwalająca wstawić dany element we właściwe miejsce
uporządkowanej listy dwukierunkowej.
Mając taki moduł możemy zaprogramować dwa algorytmy sortowania przez
wstawianie. Sortowane będą losowe ciągi danej długości, generowanych funkcją
Random liczb naturalnych, mniejszych od ustalonej, dość dużej liczby, większej
od długości tworzonych list (im mniejsza będzie ta liczba, tym sortowanie będzie
łatwiejsze). Pierwszy algorytm powinien wstawiać kolejno generowane liczby we
właściwe miejsce tworzonej listy i zostawiać wskaźnik do listy tak, aby pamiętał ostatni wstawiony element. Drugi algorytm ma symulować wstawianie do listy
jednokierunkowej, a więc po wstawieniu do listy kolejnego elementu wskaźnik do
listy powinien zostać cofnięty i wskazywać pierwszy element listy. Oba algorytmy uzupeniamy o liczniki zliczające wykonywane porównania sortowanych liczb.
Wykonując wielokrotnie sortowanie za pomocą takich algorytmów można obliczyć
też średnią liczbę porównań wymaganych przy porządkowaniu n losowych liczb (n
trzeba odpowiednio ustalić).
Średnia liczba porównań wykonywanych podczas sortowania przez wstawianie
2
.
n losowych liczb do listy jednokierunkowej wyraża się wzorem n +n−2
4
Twój program powinien umożliwiać testowanie powyższego wzoru i wyliczać
średnią liczbą porównań wymaganych podczas sortowania przez wstawianie do
listy dwukierunkowej.
Zad. 2. Zaprogramuj wersję obiektową zadania 1. Wersja obiektowa też może wykorzystywać moduł, ale rolę modułu z zadania 1 powinien przejąć typ obiektowy
Lista dwukierunkowa. Ten typ może być dziedziczony przez dwa inne typy Lista uporządkowana 1 i Lista uporządkowana 2, które wśród metod mają dodatkowo procedury sortujące.
Zad. 3. Napisz program, który wykorzystuje trzy typy obiektowe. Pierwszy typ o
nazwie Tablica, który przechowuje tablicę liczb cakowitych, umożliwia wypełnienie
tej tablicy losowymi wartościami oraz pokazanie jej zawartości.
Drugi typ, Tablica uporządkowana dziedziczy komponenty typu Tablica i posiada dodatkowo metodę umożliwiającą sortowanie tablicy. Metoda sortująca (w
jakiś prosty sposób) powinna jednak korzystać z jawnie zdefiniowanej z funkcji
porównaj porównującej dwa elementy tablicy (np. o treści: porwnaj := tab[i] <
tab[j]).
Trzeci typ dziedziczy komponenty typu Tablica uporządkowana i również zawiera metodę porównaj, której treść sprowadza się np. do wykonania podstawienia
porwnaj := tab[i] > tab[j].
Program powinien demonstrować możliwość sortowania tablic zarówno rosnąco,
jak i malejąco za pomocą tej samej procedury sortującej.
Zad. 4. (Zadanie 3.8. z listy pani dr Krupickiej) Pole obszaru zawartego między
krzywą o równaniu y = f (x) i osiź Ox w przedziale [a, b] jest równe wartości caki
oznaczonej z funkcji f (x) w tym przedziale. Przybliżoną wartość tej całki (pola)
mona obliczyć tzw. metodą trapezów w następujący sposób:
1) Cały obszar dzielimy na pionowe paski, które mają w przybliżeniu kształt
trapezu.
2) Obliczamy pole każdego trapezu.
3) Dodajemy do siebie pola wszystkich tak otrzymanych trapezów.
Podaj definicję funkcji calka, której parametrami są: funkcja f , końce przedziału
a i b oraz liczba trapezów n, a wynikiem całka z funkcji f w przedziale [a, b].
Wyświetl wartości funkcji całka z f w tym przedziale dla różnych (wzrastających)
wartości n. Do testowania wybierz różne funkcje f .
Uwaga1: zakładamy, że z danej funkcji f można obliczyć całkę w podanym
przedziale. Uwaga2: w rozwiązaniu zadania należy wykorzystać typ proceduralny
lub funkcyjny.
Zad. 5. Napisz program sortujący duży plik jednorodny (zawartość pliku to ciąg
danych pewnego rodzaju i zakładamy, że dane tego rodzaju potrafimy porównywać, np. danymi są liczby naturalne). Dodatkowo zakładamy, że dane z pliku
możemy czytać tylko w najprostszy sposób: po kolei począwszy od początku. Wykorzystaj jeden z niżej podanych algorytmów. W razie kłopotów możesz korzystać
z algorytmu 1 i założyć, że długość pliku jest potęgą 2.
Algorytm 1. Zakładamy, że dany plik jest podzielony na fragmenty tej samej
długości, poprawnie uporządkowane. Bezpośrednio po uruchomieniu te fragmenty
mają długość 1, później długość fragmentów będzie się podwajać. Ostatni fragment może być niepełny. Najpierw dany plik dzielimy na dwa pliki zawierające
w przybliżeniu tyle samo fragmentów. Następnie, scalamy kolejne fragmenty obu
plików (n-ty fragment pierwszego pliku scalamy z n-tym fragmentem drugiego)
zapisując efekt scalania do trzeciego pliku. Te czynności powtarzamy, aż cały plik
zostanie uporządkowany.
Algorytm 2. Jest podobny do algorytmu 1, wymaga scalania fragmentów różnej
długości. Każdy plik w naturalny sposób dzieli się na tzw. serie, czyli maksymalne,
poprawnie uporządkowane fragmenty. Dany plik dzielimy na dwie części i scalany –
podobnie jak w poprzednim algorytmie – kolejne serie, powtarzając te czynności aż
do skutku. Możemy zliczać zapisywane serie i na podstawie ich liczby decydować o
zakończeniu pracy algorytmu. Algorytm może się zapętlić, jeżeli będziemy dzielić
plik w zbyt prosty sposób, np. na pół. W tym przypadku dojdzie do zapętlenia,
jeżeli piersza seria zajmuje więcej niż połowę pliku i zostanie podzielona.
Antoni Kościelski