ZSI.Techniki Programowania Wykład 7 Janusz Jabłonowski Moduły w Pascalu Często zdarza się, że tworzymy zestaw procedur (funkcji, stałych, typów i zmiennych) realizujšcych powišzane ze sobš operacje (zwykle dotyczšce jednego typu danych, np. operacje na wektorach). Ponieważ taki zestaw można potem wykorzystać w wielu programach, byłoby wygodnie nie musieć kopiować go tekstowo za każdym razem, gdy chcemy go użyć, lecz móc tyko wskazać, że dany zestaw ma być teraz użyty. (Podobnie jak z procedurš, raz jš definiujemy, a potem wielokrotnie używamy podajšc tylko jej nazwę). Taki zestaw nazywamy modułem. Zwykle moduł zawiera deklaracje potrzebne lokalnie (na potrzeby modułu) oraz deklaracje eksportowane, czyli takie, które będzie widać poza modułem. Moduły można bardzo łatwo tworzyć w Pascalu (precyzyjniej: w różnych implementacjach Pascala, jak np. Free Pascal, Delphi, Turbo Pascal). Moduł zapisujemy w pliku z rozszerzeniem .pas. W samym module trzeba dopisać kilka specjalnych klauzul i informację o eksportowanych deklaracjach (opisane poniżej). Po skompilowaniu otrzymujemy plik o takiej nazwie jak plik .pas ale o innym rozszerzeniu (.ppw we Free Pascalu, .dcu w Delphi, .tpu w Turbo Pascalu). Ten plik zawiera skompilowane treci procedur i funkcji modułu (oraz informacje o innych deklaracjach z modułu). Jeli kto chce skorzystać z tego modułu, to potrzebuje TYLKO pliku skompilowanego, plik ródłowy (.pas) nie jest już potrzebny! ˇ Struktura modułu Moduł ma następujšcš strukturę: unit <nazwa>; interface <lista eksportowanych deklaracji> implementation <lista deklaracji lokalnych i definicje eksportowanych procedur> begin <inicjalizacja> end. Uwagi: 1) <nazwa> musi być taka jak nazwa pliku. 2) W <licie eksportowanych deklaracji> podajemy same nagłówki eksportowanych procedur, ich treci (wraz z powtórzonymi nagłówkami) muszš się znajdować w częci implementation. 3) <inicjalizacja> wykonuje się tylko raz, przed rozpoczęciem wykonywania głównego programu. 4) Jeli inicjalizacja jest zbędna, to można jš pominšć wraz ze słowem begin. 5) Zamiast słowa kluczowego begin można użyć słowa initialization. W takim przypadku można też umiecić w module częć rozpoczynajšcš się słowem finalization, opisujšcš operacje, które majš się wykonać, podczas kończenia pracy programu. ˇ Korzystanie z modułów Korzystanie z modułów jest bardzo proste: na poczštku korzystajšcego z nich programu (lub modułu) umieszczamy klauzulę uses <nazwa>; i od tej pory wszystkie deklaracje z importowanego modułu sš widoczne w programie tak, jakby były w nim zadeklarowane. ˇ Struktura programu korzystajšcego z modułów (rysunek) ˇ Zalety stosowania modułów ˇ lepsza strukturalizacja programu, ˇ ukrywanie implementacji, ˇ szybsza kompilacja. Kolejki i stosy W bardzo wielu algorytmach pojawia się potrzeba wykorzystania struktury danych, umożliwiajšcej wstawianie i pobieranie danych. Dwiema najprostszymi taki strukturami sš stos i kolejka. ˇ Stos Umożliwia wstawianie elementów i ich pobieranie z poczštku (wierzchołka) stosu. Czasami mówi się, że stos realizuje strategię wstawiania/pobierania LIFO (Last In, First Out; ostatni wszedł, pierwszy wyjdzie). Stos odwraca kolejnoć wstawianych elementów. Operacje: procedure wstaw(var s: TStosu; elt: TDanych); procedure pobierz(var s: TStosu; var elt: TDanych); function pusty(s: TStosu): boolean; ----------------------------------------------- procedure pierwszy(s: TStosu; var elt: TDanych); procedure ini(var s: TStosu); procedure usuń_wszystko(var s: TStosu); Uwagi implementacyjne: ˇ co to jest TDanych, ˇ jak reprezentować stos, czyli co to jest TStosu (tablica, lista), ˇ czemu pierwszy i pobierz nie sš funkcjami, ˇ czy parametr funkcji pusty powinien być przekazywany przez zmiennš, czy przez wartoć, ˇ czasami definiuje się trochę inne operacje (pobierz tylko usuwa element ze struktury danych), ˇ często spotykane nazwy angielskie (wstaw - push; pobierz - pop; pusta - empty; pierwszy - top), ˇ czym się różni ini od usuń_wszystko, ˇ czy warto wprowadzać usuń_wszystko. ˇ Kolejka Umożliwia wstawianie nowych elementów na koniec i pobieranie elementów z poczštku. Czasami mówi się, że kolejka realizuje strategię wstawiania/pobierania FIFO (Firsty In, First Out; pierwszy wszedł, pierwszy wyjdzie). Kolejka zachowuje kolejnoć wstawianych elementów. Operacje: procedure wstaw(var k: TKolejki; elt: TDanych); procedure pobierz(var k: TKolejki; var elt: TDanych); function pusta(k: TKolejki): boolean; ----------------------------------------------- procedure pierwszy(k: TKolejki; var elt: TDanych); procedure ini(var k: TKolejki); procedure usuń_wszystko(var k: TKolejki); Uwagi implementacyjne: ˇ co to jest TDanych, ˇ jak reprezentować kolejkę, czyli co to jest TKolejki (tablica, lista), ˇ czemu pierwszy i pobierz nie sš funkcjami, ˇ czy parametr funkcji pusta powinien być przekazywany przez zmiennš, czy przez wartoć, ˇ czasami definiuje się trochę inne operacje (pobierz tylko usuwa element ze struktury danych), ˇ często spotykane nazwy angielskie (wstaw - enqueue, put; pobierz - dequeue, get; pusta - empty; pierwszy - first), ˇ czym się różni ini od usuń_wszystko, ˇ czy warto wprowadzać usuń_wszystko. ˇ Przykłady zastosowań: Algorytmy grafowe (stos, kolejka), realizacja rekursji (stos), ONP i wyliczanie wartoci wyrażeń (stos). ˇ Realizacja stosu i kolejki za pomocš modułów ˇ podział na częć publicznš i prywatnš ˇ decyzja czy operacje majš mieć strukturę danych (stos, kolejkę) jako pierwszy parametr Struktury listowe Typy wskanikowe sš niezwykle elastyczne i pozwalajš budować praktycznie dowolnie wymylne struktury danych. Oprócz pojedynczych list można definiować tablice list, listy tablic, listy list itp. Przykłady zastosowań bardziej rozbudowanych struktur listowych: ˇ rzadkie macierze (skrypt) ˇ sortowanie topologiczne (skrypt) Dużo informacji o strukturach listowych można znaleć w skrypcie (dostępnym w naszej bibliotece) "Pracownia Programowania I" pod redakcjš M. Cichego i S. Szpakowicza.