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  treœci
procedur   i   funkcji   modułu  (oraz  informacje   o   innych
deklaracjach  z  modułu). Jeœli 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 <liœcie eksportowanych deklaracji> podajemy same
nagłówki eksportowanych procedur, ich treœci (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)  Jeœli 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ż umieœcić 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 wartoœci 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 wskaŸnikowe sš niezwykle elastyczne i pozwalajš budować
praktycznie dowolnie wymyœlne 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.