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