516 S. ZORIENTOWANE OBIEKTOWO JEŻYKI ZAPYTAŃ
1) B*UNCTION AdresADT {: s CHAR (50), : c CHAR (2)
RETURNS AdresADT;
2) :a AdresADT;
BEGIN
3} : s := adresADT{) ;
4) :a.ulica := :s;
5) :a.miastQ := :c;
6) RETURN :a;
ENC;
7} FUNCTION adrR(:al AdresADT, :a2 AdresADT)
RETURNS BOOLEAN;
8) RETURN (:al.ulica = :a2.ulica AND
:al.miasto = a2.miasto);
9) FUNCTION adrMK(:al AdresADT, :a2 AdresADT)
RETURNS BOOLEAN;
10) RETURN ({:al.miasto < a2.miasto) OR
(:ai.miasto = :a2.miasto)
AND :al.ulica < a2.ulica));
11) FUNCTION całyAdres{:a AdresADT) RETURNS CHAR(82);
12} ;z CHAR(10);
BEGIN
13) :z = znajdźKod(:a.ulica, :a.miasto);
14) RETURN(:a.ulica II ' ' II
:a.miasto | ' 'II :z);
F.ND;
RYSUNEK 8.19 Niektóre funkcje adresu A OT
rzonyra, ponieważ mają one inne argumenty. A więc nie można zinterpretować wywołania w wierszu 3) jako wywołania rekurencyjnego. W wierszu 4) wartość pierwszego argumentu zostaje przypisana składowej ulica obiektu a, a w wierszu 5) określa się wartość składowej miasto obiektu a jako przypisanie wartości drugiego argumentu. W końcu, w wierszu 6) obiekt a staje się wynikiem działania funkcji.
W wierszach 7) i 8) definiuje się operator równości dla obiektów typu AdresADT. Na rysunku 8.17 w wierszu 4) określono, że ten operator ma się nazywać adrR, a więc stosujemy tutaj tę nazwę. Treść jego jest prosta: zwraca on wartość IRUE wtedy i tylko wtedy, gdy są identyczne wartości obu składowych w dwóch obiektach. Jest on zatem taki sam jak równość domniemana i można w związku /. tym zdefiniować go tak samo, jak zdefiniowano równość w przykładzie 8.31.
W wierszach 9) i 10) zapisano deklarację operatora <, czyli funkcji adrMN Określa się tutaj, że pierwsz>r adres jest mniejszy od drugiego, jeśli miastc z pierwszego adresu poprzedza leksykograficznie miasto z drugiego adresi (w znaczeniu alfabetycznym). Jeśli miasta są te same. to porównuje się ulice.
W wierszach od 11) do 14) definiuje się funkcję całyAdres, która ni podstawie obiektu ty pu AdrADT zwraca pełny adres, tzn. ulicę, miasto oraz S - cyfrowy kod pocztowy (wraz z myślnikiem). W wierszu 12) została zade klarowana zmienna lokalna : z, w której przechowuje się kod pocztowy W wierszu 13) jest wywołana funkcja znajdźKod. Jest to funkcja zewnętrz na, która ma dwa argumenty: ulicę i miasto, Postać deklaracji tej funkcji zewnętrznej zostanie omówiona w p. 8.6.3.
Funkcja znajdźKod zwraca wartość kodu pocztowego określonego adresu, a procedura może być bardzo skomplikowana, z przeszukiwaniem innej bazy' danych włącznie. Nie będziemy pisać definicji tej procedury. W końcu w wierszu 14) konkatenujemy adres zapisany w obiekcie : a z kodem pocztowym zapisanym w : z. Między składowymi adresu umieściliśmy spacje, pc to by je od siebie odseparować.
□
Typy ADT mogą zawierać również metody, które zapisuje się w pewnym języku podstawowym, niekoniecznie w $QL3. W takich sytuacjach w definicji typu ADT umieszcza się tylko sygnaturę funkcji oraz informację o języku, w którym jest ona określona. Postać deklaracji zewnętrznej jest następująca:
DEC LA RE r.x TERMA! <nazwa funkcji> <sygnatura>
LAMGUAGE <nazwa języka>
PRZYKŁAD 8.33
Aby skorzystać z funkcji znajdźKod, którą zdefiniowano w przykładzie 8.32, trzeba ją zadeklarować w definicji typu AdresADT. Funkcja la ma dwa parametry typu CHARACTER o długościach odpowiednio: 50 i 20, a zwraca jeden wynik, który- jest napisem o długości 10. Poniżej przedstawiamy poprawną deklarację funkcji:
DECLARF. EX TE RN AL znajdźKod
CHAR(50) CHAR(20} RETURNS CHAR(10)
LANGUAGE C;
Określenie języka jako C oznacza, że adres argumentu będzie przekazany do funkcji znajdźKod w postaci właściwej dla programów zapisanych w C.
□