Lista3

Transkrypt

Lista3
Kurs języka Pascal
Grupa HKR
Lista 3
W rozwiązaniach należy uwzględnić: listę łączoną, drzewo binarne, parametry wywołania programu. Co najmniej jedno rozwiązanie zadania z tej listy należy przedstawić w Delphi.
3.1. Napisz moduł procedur umożliwiający następujące operacje na łączonej liście liniowej liczb całkowitych:
a) Wstawiającą dany element na początek listy.
b) Wstawiającą dany element na koniec listy.
c) Określającą długość listy.
d) Określającą, czy lista jest pusta.
e) Inicjującą listę pustą.
f) Wstawiającą dany element na właściwe miejsce w uporządkowanej niemalejąco liście.
g) Znajdującą numer elementu z danym kluczem w liście (0, jeśli nie ma takiego elementu).
h) Usuwającą pierwszy element listy.
i) Usuwającą ostatni element listy.
j) Usuwającą wszystkie elementy o danym kluczu z listy .
k) Wypisującą do danego pliku tekstowego wszystkie klucze z listy.
l) Odwracającą kolejność elementów na liście (bez tworzenia jej kopii).
m) Usuwającą całą listę (i zwalniającą pamięć).
n) Podającą numer elementu z listy, w którym jest klucz o minimalnej wartości (0 dla listy pustej).
Napisz program, który korzystając z opisanego modułu wczyta liczby z danego pliku tekstowego, posortuje je i zapisze do wynikowego pliku tekstowego. Nazwy obu plików należy podać jako parametry
wywołania programu. Aby mieć pewność, że cała pamięć dynamiczna została zwolniona wypisz na
ekranie wartości funkcji MemAvail i MaxAvail z początku i z końca działania programu.
3.2. Wyrażenie algebraiczne może być reprezentowane w postaci następującej struktury (przykład):
Ciąg poprawnych danych wyrażeń jest zapisany w pliku tekstowym (w jednym wierszu jedno wyraże-
–
*
(3+4)*5–7*(8–3)
+
3
*
5
4
7
–
8
3
nie). Podaj specyfikację wyrażenia w postaci EBNF lub BNF.
Napisz program, który do wyczerpania danych z pliku tekstowego (lub do znacznika końca danych):
• czyta poprawne wyrażenie z pliku
• tworzy podaną strukturę (drzewo wyrażenia)
• zapisuje do tekstowego pliku wynikowego (w nowym wierszu) klucze z drzewa wyrażenia w
porządku postorder
• oblicza wartość wyrażenia korzystając ze struktury drzewa tego wyrażenia
• zapisuje do tekstowego pliku wynikowego (w tym samym wierszu): znak równości i obliczoną wartość wyrażenia
Na przykład dla danego wyrażenia ( 3 + 4 ) * 5 – 7 * (8 – 3 ) w jednym wierszu pliku wynikowego będzie zapisane: 34+5*783–*–=0
Dodatkowe ustalenia: argumentami wyrażeń są cyfry dziesiętne, spacje przed, po i wewnątrz wyrażenia należy pomijać, działaniami są +, –, * i / (jako dzielenie całkowite).
3.3. Napisz program, który czyta zawartość plików tekstowych, których nazwy są parametrami wywołania programu, zapamiętuje słowa w drzewie (drzewach) BST, a następnie informuje, w jakich plikach wystąpiło dane słowo; podanie słowa pustego powoduje zakończenie działania programu.
Przykładowe wywołanie programu:
slowa plik1.txt plik2.txt slowa.pas
Podaj slowo: program
Slowo program wystapilo w plikach:
plik2.txt, slowa.pas
Podaj slowo: xyz
Slowo xyz nie wystapilo w zadnym z danych plikow
Podaj slowo:
Koniec
3.4. Napisz program, który dla danych liczb naturalnych n (n>=2) i k (k>=1) przeprowadzi następujący eksperyment. Ustawiamy liczby 1, 2, ..., n w cykl. Dopóki w cyklu pozostało jeszcze więcej liczb
niż dwie usuwamy z cyklu kolejne liczby co k. Odliczanie zaczyna się od pozycji nr 1, a pierwsza usuwana liczba ma numer (k-1) mod n +1. Wynikiem eksperymentu są numery dwu liczb, które pozostały
nieusunięte.
Program tworzy jednokierunkową listę cykliczną (zob. rysunek) zawierającą liczby 1, 2, ..., n, a następnie symuluje przebieg eksperymentu usuwając liczby z listy.
2
start
3
1
8
4
5
7
6
3.5. Słownik
Napisz program, który wypisze na ekranie wszystkie słowa występujące w pliku tekstowym o nazwie
podanej przez użytkownika wraz z numerami wierszy, w których dane słowo występuje. Słowo powinno być wypisane w kolejności alfabetycznej, numery wierszy w kolejności rosnącej. Nawet jeśli
słowo występuje w tym samym wierszu więcej niż raz, numer tego wiersza powinien się pojawić na
wyjściu tylko raz. Program powinien nie rozróżniać wielkich i małych liter, a wiec 'AbC' i 'aBc' są zapisem tego samego słowa, które na wyjściu powinno pojawić się jako 'abc' (wszystkie litery małe).
Słowo definiujemy jako najdłuższy ciąg złożony z samych liter (małych i wielkich). Można założyć,
ze długość słów nie przekracza 255 znaków.
Przykładowo dla pliku o zawartości:
Ala ma kota.
TAK !!! KOTA !!!
Ale ta Ala NIE MA psa.
program powinien wypisać4
ala 1 3
ale 3
kota 1 2
ma 1 3
nie 3
psa 3
ta 3
tak 2
Należy także wypisać wielkość zajętej pamięci z początku i końca działania programu.
Słownik reprezentujemy jako listę list. Wszystkie niezbędne definicje oraz implementacje operacji na
"slowniku" powinny być umieszczone w oddzielnym module zawierającym co najmniej następujące
procedury:
procedure inicjuj(var s:slownik);
procedure dodaj(var s:slownik; slowo:string; nr:integer);
{dodanie do slownika 's' slowa 'slowo' (o ile go tam jeszcze nie ma), }
{dodanie do listy wystapien liczby 'nr' (o ile jej tam jeszcze nie ma).}
procedure wypisz(s:slownik);
{wypisanie na ekranie zawartosci slownika 's'}
procedure usun(var s:slownik);
{usuniecie zawartosci slownika 's'}
3.6. Dane są następujące deklaracje:
type
drzewo=^wezel;
wezel=record
slowo:string; {klucz drzewa BST}
ile:Integer; {ilosc wystapien slowa}
lewy, prawy:drzewo; {dowiazania do synów}
end;
Napisz program, który dla zadanego przez użytkownika pliku tekstowego wypisze posortowane alfabetycznie słowa z tego pliku wraz z informacją o ilości ich wystąpień.
Program należy zrealizować przy użyciu drzewa BST. Przy wczytywaniu kolejnego słowa należy je
wyszukać, a jeśli nie ma go w drzewie, to utworzyć nowy węzeł (przy zachowaniu warunku dla drzew
BST). Następnie należy zaktualizować informacje w węźle (wartość ile). Wypisywanie słów zrealizować jako wypisanie informacji z drzewa BST w odpowiednim porządku.
Słowo definiujemy jako najdłuższy ciąg złożony z samych liter. Można założyć, ze słowa mają nie
więcej niż 255 liter. Przed zakończeniem programu należy usunąć drzewo z pamięci (dla sprawdzenia
na początku i końcu programu należy wypisać ilość dostępnej pamięci).
3.7. Dla danego drzewa binarnego (na przykład otrzymanego w poprzednim zadaniu po wczytaniu
wszystkich słów z pliku), połączyć wszystkie węzły w porządku inorder w listę liniową.
Zatem przy deklaracjach:
type
drzewo=^wezel;
wezel=record
slowo : string; {klucz drzewa BST}
ile:Integer; {ilość wystąpień słowa}
lewy, prawy:drzewo; {dowiązania do synów}
nast:drzewo; {następnik na liście liniowej}
end;
napisać funkcję:
Fastryga (d:drzewo):drzewo;
która wypełnia pole nast w węzłach drzewa BST tworząc z nich listę liniową. Wynikiem funkcji ma
być początek tej listy (głowa listy).
3.8. Pole obszaru zawartego między krzywą o równaniu y=f(x) i osią Ox w przedziale [a, b] jest równe
wartości całki oznaczonej z funkcji f(x) w tym przedziale. Przybliżoną wartość tej całki (pola) można
obliczyć tzw. metodą trapezów w następujący sposób:
a) Cały obszar podziel na pionowe paski w kształcie trapezów.
b) Oblicz pole każdego paska.
c) Dodaj do siebie pola wszystkich paskó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(x) w
tym przedziale dla różnych (wzrastających) wartości n. Do testowania wybierz różne funkcje f(x).
Uwaga1: zakładamy, że z danej funkcji f można obliczyć całkę w podanym przedziale.
Uwaga2: w rozwiązaniu zadania należy wykorzystac typ rpceduralny lub funkcyjny.
3.9. Zdefiniuj (w module) dla stałych m i n typ TZbior = array[0..n] of Boolean, który reprezentuje
zbiory liczb naturalnych od 0 do n, oraz napisz następujące podprogramy (procedury | funkcje):
a)
b)
c)
d)
e)
f)
g)
h)
i)
j)
tworzenie pustego zbioru,
tworzenie pełnego zbioru,
dodanie zadanego elementu do zbioru,
usunięcie zadanego elementu ze zbioru,
sprawdzenie, czy element należy do zbioru,
znalezienie maksymalnego | minimalnego elementu zbioru,
obliczenie sumy, różnicy i iloczynu dwu zbiorów,
obliczenie mocy zbioru,
wypisanie elementów zbioru,
utworzenie zbioru na podstawie m-elementowej tablicy liczb z przedziału [0, n].
Napisz program, który dla danej liczby n
a) testuje powyższe operacje na zbiorach
b) korzystając z tego modułu operacji na zbiorach znajduje liczby pierwsze nie większe niż n za
pomocą algorytmu „sito Eratostenesa”.
3.10. Zdefiniuj (w module) klasę (typ obiektowy) operacji na figurach graficznych. Figurę można narysować, wymazać, animować (przesuwać). Zdefiniuj figury: punkt, odcinek, okrąg, oraz figurę końcową do wyboru: samolot lub samochód. Wykorzystaj dziedziczenie i metody wirtualne (przyjmij, że
końcową figurę można narysować co najmniej na dwa sposoby, np. z wypełnieniem okręgu lub bez).
Napisz program powodujący prostą animację (np. poruszanie się) końcowej figury na ekranie.