Wstęp do programowania
wykład 13
Agata Półrola
Wydział Matematyki i Informatyki UŁ
sem. zimowy 2012/2013
Agata Półrola Wydział Matematyki i Informatyki UŁ
Podprogramy - uwaga dot. parametrów typu niezawężonego
Jeśli parametrem procedury lub funkcji jest tablica typu
niezawężonego, to pisząc dany podprogram nie można zakładać
że indeksowanie tablicy zaczyna się od 1 - może to prowadzić
do blędnych wyników, a podprogram nie jest uniwersalny!
(a
powinien
być uniwersalny, tzn. zadziałać poprawnie dla
każdej
tablicy dla której zostanie wywołany)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (konsekwencje błędnych założeń o indeksowaniu tablic
niezawęzonych)
w i t h ada . t e x t i o ,
ada . i n t e g e r t e x t i o ;
u s e ada . t e x t i o ,
ada . i n t e g e r t e x t i o ;
p r o c e d u r e
w 1 4 z a k r e s y
i s
t y p e Tab i s
a r r a y
( i n t e g e r
r a n g e <>) o f
i n t e g e r ;
t a b p u s t a :
e x c e p t i o n ;
p r o c e d u r e Get ( t :
o u t t a b )
i s
b e g i n
f o r
i
i n t ’ r a n g e l o o p
g e t ( t ( i ) ) ;
end l o o p ;
end g e t ;
p r o c e d u r e Put ( x :
i n
t a b )
i s
b e g i n
f o r
i
i n x ’ r a n g e l o o p p u t ( x ( i ) , 2 ) ;
p u t ( ” , ” ) ;
end l o o p ;
end p u t ;
f u n c t i o n
G d z i e M a x z l e ( x :
i n
t a b )
r e t u r n
i n t e g e r
i s
max , mmaxa :
i n t e g e r ;
b e g i n
max:= x ( 1 ) ; mmaxa : = 1 ;
f o r
i
i n
1 . . x ’ l a s t
l o o p
i f
x ( i )>max t h e n max:= x ( i ) ; mmaxa:= i ; end
i f ;
end l o o p ;
r e t u r n mmaxa ;
end G d z i e m a x z l e ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (konsekwencje błędnych założeń - cd)
f u n c t i o n
G d z i e M a x o k ( x :
i n
t a b )
r e t u r n
i n t e g e r
i s
max , mmaxa :
i n t e g e r ;
b e g i n
i f
x ’ l e n g t h =0 t h e n
r a i s e
t a b p u s t a ; end
i f ;
max:= x ( x ’ f i r s t ) ;
mmaxa:= x ’ f i r s t ;
f o r
i
i n x ’ f i r s t + 1 . . x ’ l a s t
l o o p
i f
x ( i )>max t h e n max:= x ( i ) ; mmaxa:= i ; end
i f ;
end l o o p ;
r e t u r n mmaxa ;
end G d z i e m a x o k ;
k :
t a b ( − 5 . . 5 ) ;
m:
i n t e g e r ;
b e g i n
g e t ( k ) ;
p u t ( k ) ;
n e w l i n e ;
p u t l i n e ( ” u z y c i e
p o p r a w n e j
f u n k c j i
z w r a c a j a c e j
i n d e k s
m i e j s c a maxa : ” ) ;
b e g i n
m:= g d z i e m a x o k ( k ) ;
p u t ( ” m i e j s c e maxa : ” ) ;
p u t (m, 5 ) ;
n e w l i n e ;
p u t ( ”max t o ” ) ;
p u t ( k (m ) ) ;
e x c e p t i o n
when t a b p u s t a => p u t ( ” maxa n i e ma ; −) ” ) ;
end ;
n e w l i n e ( 3 ) ;
p u t l i n e ( ” u z y c i e
n i e p o p r a w n e j
f u n k c j i
z w r a c a j a c e j
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (konsekwencje błędnych założeń - cd)
b e g i n
m:= g d z i e m a x z l e ( k ) ;
p u t ( ” m i e j s c e maxa : ” ) ;
p u t (m, 5 ) ;
n e w l i n e ;
p u t ( ”max t o ” ) ;
p u t ( k (m ) ) ;
e x c e p t i o n
when t a b p u s t a => p u t ( ” maxa n i e ma ; −) ” ) ;
end ;
−− aby z o b a c z y c n i e p o p r a w n o s c
d z i a l a n i a
n a l e z y
p o d a c
t a b l i c e
−− t a k a z e maksymalna w a r t o s c
j e s t w j e j
p i e r w s z e j
c z e s c i
end w 1 4 z a k r e s y ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (konsekwencje błędnych założeń dot. indeksowania - inny
przykład)
w i t h ada . t e x t i o ,
ada . i n t e g e r t e x t i o ;
u s e ada . t e x t i o ,
ada . i n t e g e r t e x t i o ;
p r o c e d u r e
w 1 4 z a k r e s y 2
i s
t y p e Tab i s
a r r a y
( i n t e g e r
r a n g e <>) o f
i n t e g e r ;
p r o c e d u r e Get ( t :
o u t t a b )
i s
b e g i n
f o r
i
i n t ’ r a n g e l o o p
g e t ( t ( i ) ) ;
end l o o p ;
end g e t ;
p r o c e d u r e Put ( x :
i n
t a b )
i s
b e g i n
f o r
i
i n x ’ r a n g e l o o p p u t ( x ( i ) , 2 ) ;
p u t ( ” , ” ) ;
end l o o p ;
end p u t ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (konsekwencje błędnych założeń dot. indeksowania - inny
przykład - cd)
f u n c t i o n
T a b l i c a N P o c z a t k o w y c h z l a ( a : Tab ; n :
n a t u r a l )
r e t u r n Tab i s
b e g i n
r e t u r n a ( 1 . . n ) ;
end T a b l i c a N P o c z a t k o w y c h z l a ;
f u n c t i o n
T a b l i c a N P o c z a t k o w y c h o k ( a : Tab ; n :
n a t u r a l )
r e t u r n Tab i s
b e g i n
r e t u r n a ( a ’ f i r s t . . a ’ f i r s t +n −1);
end T a b l i c a N P o c z a t k o w y c h o k ;
k :
t a b ( − 5 . . 5 ) ;
b e g i n
g e t ( k ) ;
p u t ( k ) ;
n e w l i n e ;
p u t l i n e ( ” T a b l i c a 3 p o c z a t k o w y c h e l e m e n t o w : ” ) ;
p u t ( T a b l i c a N P o c z a t k o w y c h o k ( k , 3 ) ) ;
n e w l i n e ;
p u t l i n e ( ” T a b l i c a 3 p o c z a t k o w y c h ( ? ? ; −) ) e l e m e n t o w − z l a
w e r s j a : ” ) ;
p u t ( T a b l i c a N P o c z a t k o w y c h z l a ( k , 3 ) ) ;
end w 1 4 z a k r e s y 2 ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Specyfikacja podprogramu
Specyfikacja podprogramu
opisuje rodzaj podprogramu, jego
nazwę, parametry i w przypadku funkcji - typ wyniku.
Aby otrzymać specyfikację, z funkcji / procedury “wycinamy” słówko is i wszystko co
za nim, a w miejsce tego wstawiamy średnik
Przykłady
function PoleTrojkata(a,b,c: float) return float;
function CzyTrojkat(x,y,x: integer) return boolean;
procedure Wizytowka;
procedure WypiszTablice(t: in Tab);
Specyfikacje potrzebne są w pakietach, a także w pojedynczych
programach z podprogramami korzystającymi z siebie nawzajem
(wzajemnie rekurencyjnymi)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (Wzajemna rekurencja procedur)
w i t h ada . t e x t i o , ada . i n t e g e r t e x t i o ;
u s e ada . t e x t i o , ada . i n t e g e r t e x t i o ;
p r o c e d u r e
w 1 4 d o u b l e r e c
i s
p r o c e d u r e P1 ( a :
i n t e g e r ; b :
c h a r a c t e r ) ;
p r o c e d u r e P2 ( b :
i n
o u t
c h a r a c t e r ) ;
p r o c e d u r e P1 ( a :
i n t e g e r ; b :
c h a r a c t e r )
i s
c : c h a r a c t e r := b ;
b e g i n
i f
c<’ Z ’ t h e n
f o r
i
i n
1 . . a l o o p
n e w l i n e ; P2 ( c ) ;
end l o o p ;
e l s e
p u t ( ” k o n i e c ” ) ;
end
i f ;
end P1 ;
p r o c e d u r e P2 ( b :
i n
o u t
c h a r a c t e r )
i s
b e g i n
p u t ( ”−−>” ) ;
i f
b<’ Z ’ t h e n p u t ( b ) ; b := c h a r a c t e r ’ s u c c ( b ) ; P1 ( 1 , b ) ;
end
i f ;
end P2 ;
k :
i n t e g e r ;
b e g i n
p u t ( ” p o d a j
l i c z b e : ” ) ;
g e t ( k ) ;
P1 ( k , ’A ’ ) ;
end w 1 4 d o u b l e r e c ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Pakiety
Rola pakietów
Ada umożliwia grupowanie definicji typów, deklaracji zmiennych i
stałych oraz procedur i funkcji tak, aby mozna z nich było
korzystać w wielu programach
Konstrukcję służącą do tego celu nazywamy
pakietem
Agata Półrola Wydział Matematyki i Informatyki UŁ
Pakiety
Rola pakietów
Ada umożliwia grupowanie definicji typów, deklaracji zmiennych i
stałych oraz procedur i funkcji tak, aby mozna z nich było
korzystać w wielu programach
Konstrukcję służącą do tego celu nazywamy
pakietem
Agata Półrola Wydział Matematyki i Informatyki UŁ
Struktura pakietu
Pakiet składa się z dwóch części:
specyfikacji
i
ciała
specyfikacja zawiera definicje i deklaracje elementów
widocznych dla użytkowników pakietu
ciało zawiera:
ciała procedur i funkcji “zapowiedzianych” w specyfikacji
wszelkie elementy lokalne (nie udostępnione użytkownikom
pakietu), w tym funkcje i procedury
specyfikacja może zawierać również tzw.
część prywatną
.
Elementy w niej umieszczone traktowane są tak jakby były
umieszczone w ciele pakietu.
Agata Półrola Wydział Matematyki i Informatyki UŁ
Specyfikacja pakietu
specyfikacja pakietu (plik nazwa pakietu.ads)
bez części prywatnej:
-- opcjonalnie: klauzula with i klauzula use (rzadko potrzebne)
package nazwa_pakietu is
-- definicje typów
-- deklaracje zmiennych i stałych
-- konkretyzacje pakietów
-- specyfikacje procedur i funkcji
end nazwa_pakietu;
z częścią prywatną:
-- opcjonalnie: klauzula with i klauzula use (rzadko potrzebne)
package nazwa_pakietu is
-- definicje typów
-- deklaracje zmiennych i stałych
-- konkretyzacje pakietów
-- specyfikacje procedur i funkcji
private
-- część prywatna
end nazwa_pakietu;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (specyfikacja pakietu Tablice
[Tablice.ads]
)
p a c k a g e
t a b l i c e
i s
t y p e Tab i s
a r r a y
( i n t e g e r
r a n g e <>) o f
i n t e g e r ;
t a b l i c a p u s t a :
e x c e p t i o n ;
p r o c e d u r e
P o b i e r z ( x :
o u t Tab ) ;
p r o c e d u r e W y p i s z ( x :
i n Tab ) ;
f u n c t i o n ZnajdzMax ( x : Tab )
r e t u r n
i n t e g e r ;
end
t a b l i c e ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (specyfikacja pakietu DniPak
[DniPak.ads]
)
w i t h ada . t e x t i o ;
p a c k a g e d n i P a k
i s
t y p e
d n i
i s
( pon , wt ,
s r , czw ,
pt ,
so ,
n i e ) ;
s u b t y p e weekend
i s
d n i
r a n g e s o . . n i e ;
t y p e d a t a
i s
p r i v a t e ;
p a c k a g e
d n i i o
i s new ada . t e x t i o . e n u m e r a t i o n i o ( d n i ) ;
p o c z a t e k :
c o n s t a n t
d a t a ;
z l a d a t a :
e x c e p t i o n ;
f u n c t i o n
J u t r o ( d :
d n i )
r e t u r n
d n i ;
f u n c t i o n D z i e n T y g ( d :
d a t a )
r e t u r n
d n i ;
f u n c t i o n TworzDate ( d , m, r :
i n t e g e r )
r e t u r n
d a t a ;
p r o c e d u r e W y p i s z D a t e ( d :
d a t a ) ;
p r i v a t e
t y p e d a t a
i s
a r r a y ( 1 . . 3 )
o f
i n t e g e r ;
p o c z a t e k :
c o n s t a n t
d a t a
: = ( 1 , 1 , 2 0 1 0 ) ;
end d n i P a k ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Ciało pakietu
ciało pakietu (plik nazwa pakietu.adb)
bez części wykonywalnej
-- opcjonalnie: klauzula with i klauzula use (zazwyczaj potrzebne)
package body nazwa_pakietu is
-- ciała procedur i funkcji pomocniczych (prywatnych)
-- inne elementy pomocnicze (prywatne)
-- ciała procedur i funkcji ze specyfikacji
end nazwa_pakietu;
z częścią wykonywalną:
-- opcjonalnie: klauzula with i klauzula use (zazwyczaj potrzebne)
package body nazwa_pakietu is
-- ciała procedur i funkcji pomocniczych (prywatnych)
-- inne elementy pomocnicze (prywatne)
-- ciała procedur i funkcji ze specyfikacji
begin
-- instrukcje
end nazwa_pakietu;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (ciało pakietu Tablice
[Tablice.adb]
)
w i t h ada . t e x t i o ,
ada . I n t e g e r t e x t i o ;
u s e ada . t e x t i o ,
ada . I n t e g e r t e x t i o ;
p a c k a g e body
t a b l i c e
i s
p r o c e d u r e
P o b i e r z ( x :
o u t Tab )
i s
b e g i n
f o r
i
i n x ’ r a n g e l o o p
p u t ( ” e l e m e n t ” ) ;
p u t ( i , 0 ) ;
p u t ( ”> ” ) ;
g e t ( x ( i ) ) ;
end l o o p ;
end P o b i e r z ;
p r o c e d u r e W y p i s z ( x :
i n Tab )
i s
b e g i n
f o r
i
i n x ’ r a n g e l o o p
p u t ( x ( i ) , 2 ) ; p u t ( ” , ” ) ;
end l o o p ;
end W y p i s z ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (ciało pakietu Tablice- cd. )
f u n c t i o n ZnajdzMax ( x : Tab )
r e t u r n
i n t e g e r
i s
m:
i n t e g e r ;
b e g i n
i f
x ’ l e n g t h =0 t h e n
r a i s e
t a b l i c a p u s t a ; end
i f ;
m:= x ( x ’ f i r s t ) ;
f o r
i
i n x ’ r a n g e l o o p
i f
x ( i )>m t h e n m:= x ( i ) ;
end
i f ;
end l o o p ;
r e t u r n m;
end ZnajdzMax ;
b e g i n
p u t l i n e ( ”−−−−−−− PAKIET ’ TABLICE ’ −−−−−−−−−−−−−−−−−−−−−−” ) ;
end
t a b l i c e ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Kompilacja pakietu
pakiet tylko kompilujemy (nie wykonujemy linkowania)
porządek kompilacji: specyfikacja pakietu (plik .ads), ciało
pakietu (plik .adb)
zmiany w specyfikacji pakietu powodują konieczność
ponownego skompilowania jego specyfikacji i ciała, zmiany w
ciele pakietu wymagają ponownego przekompilowania tego
ciała
Agata Półrola Wydział Matematyki i Informatyki UŁ
Korzystanie z pakietu
wszystkie pakiety (zarówno standardowe jak i własne) dołączamy do
programu w taki sam sposób (klauzula with, ewentualnie klauzula
use)
w programie można korzystać ze wszystkich “upublicznionych”
zasobów danego pakietu (tj. typów, zmiennych, stałych, wyjątków,
procedur, funcji etc. wymienionych w publicznej części specyfikacji
pakietu)
jeśli zasoby pakietu nie są dostępne bezpośrednio (nazwa pakietu
nie wystąpiła w klauzuli use) lub jeśli nazwa danego zasobu nie jest
jednoznaczna (tzn. w kilku pakietach dołączonych do programu
występuje zasób o takiej samej nazwie, a rozróżnienie ich np. na
podstawie typu parametrów jest niemożliwe), to musimy używać
“pełnej” nazwy zasobu (nazwa pakietu.nazwa zasobu, np.
tablice.tablica pusta, tablica.Pobierz)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (program używający pakietu Tablice (wersja 1) )
w i t h ada . t e x t i o ,
t a b l i c e ;
u s e ada . t e x t i o ;
p r o c e d u r e
w 0 1 4 t a b l i c e T e s t
i s
t :
t a b l i c e . t a b ( 1 . . 1 0 ) ;
x :
i n t e g e r ;
b e g i n
p u t l i n e ( ” p o d a j
z a w a r t o s c
t a b l i c y : ” ) ;
t a b l i c e . p o b i e r z ( t ) ;
p u t l i n e ( ” Oto t a b l i c a : ” ) ;
t a b l i c e . w y p i s z ( t ) ;
x := t a b l i c e . z n a j d z m a x ( t ) ;
e x c e p t i o n
when t a b l i c e . t a b l i c a p u s t a =>
p u t ( ” t a b l i c a
b y l a
p u s t a − maxa b r a k ” ) ;
end w 0 1 4 t a b l i c e t e s t ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (program używający pakietu Tablice (wersja 2) )
w i t h ada . t e x t i o ,
ada . i n t e g e r t e x t i o ,
t a b l i c e ;
u s e ada . t e x t i o ,
ada . i n t e g e r t e x t i o , t a b l i c e ;
p r o c e d u r e
w 0 1 4 t a b l i c e T e s t 1
i s
d l :
n a t u r a l ;
b e g i n
p u t ( ” p o d a j
d l u g o s c
t a b l i c y : ” ) ;
g e t ( d l ) ;
d e c l a r e
t : Tab ( 1 . . d l ) ;
b e g i n
p u t l i n e ( ” p o d a j
z a w a r t o s c
t a b l i c y : ” ) ;
p o b i e r z ( t ) ;
p u t l i n e ( ” Oto t a b l i c a : ” ) ;
w y p i s z ( t ) ;
p u t ( ” n a j w i e k s z y
e l e m e n t w t a b l i c y : ” ) ;
p u t ( ZnajdzMax ( t ) ) ;
e x c e p t i o n
when t a b l i c a p u s t a =>
p u t ( ” t a b l i c a
b y l a
p u s t a − maxa b r a k ” ) ;
end ;
end w 0 1 4 t a b l i c e t e s t 1 ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Kolejny przykład - kompletny pakiet Dnipak i program
korzystający z tego pakietu
(na kolejnych slajdach)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (specyfikacja pakietu DniPak
[DniPak.ads]
)
w i t h ada . t e x t i o ;
p a c k a g e d n i P a k
i s
t y p e
d n i
i s
( pon , wt ,
s r , czw ,
pt ,
so ,
n i e ) ;
s u b t y p e weekend
i s
d n i
r a n g e s o . . n i e ;
t y p e d a t a
i s
p r i v a t e ;
p a c k a g e
d n i i o
i s new ada . t e x t i o . e n u m e r a t i o n i o ( d n i ) ;
p o c z a t e k :
c o n s t a n t
d a t a ;
z l a d a t a :
e x c e p t i o n ;
f u n c t i o n
J u t r o ( d :
d n i )
r e t u r n
d n i ;
f u n c t i o n D z i e n T y g ( d :
d a t a )
r e t u r n
d n i ;
f u n c t i o n TworzDate ( d , m, r :
i n t e g e r )
r e t u r n
d a t a ;
p r o c e d u r e W y p i s z D a t e ( d :
d a t a ) ;
p r i v a t e
t y p e d a t a
i s
a r r a y ( 1 . . 3 )
o f
i n t e g e r ;
p o c z a t e k :
c o n s t a n t
d a t a
: = ( 1 , 1 , 2 0 1 0 ) ;
end d n i P a k ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (ciało pakietu DniPak
[DniPak.adb]
)
w i t h ada . t e x t i o ,
ada . i n t e g e r t e x t i o ;
u s e ada . t e x t i o ;
p a c k a g e body DniPak
i s
f u n c t i o n
J u t r o ( d :
i n
d n i )
r e t u r n
d n i
i s
b e g i n
i f
d/= n i e
t h e n
r e t u r n
d n i ’ s u c c ( d ) ;
e l s e
r e t u r n pon ; end
i f ;
end J u t r o ;
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− s t a l a p o m o c n i c z a
d z i e n p o c z :
c o n s t a n t
d n i := p t ;
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (ciało pakietu DniPak
[DniPak.adb] - cd
)
−− f u n k c j a p o m o c n i c z a ( p r y w a t n a )
−− r o z n i c a
d n i m i e d z y dwiema d a t a m i
−− ( w y l i c z e n i a b a r d z o u p r o s z c z o n e − n i e d o k l a d n e )
f u n c t i o n ”−” ( d1 , d2 :
d a t a )
r e t u r n
i n t e g e r
i s
r o z n i c a :
i n t e g e r ;
b e g i n
i f
d1 (3)= d2 ( 3 ) and d1 (2)/= d2 ( 2 ) t h e n
r o z n i c a :=(30 − d2 ( 1 ) ) + 3 0 ∗ ( d1 (2) − d2 (2) −1)+ d1 ( 1 ) ;
e l s i f
d1 (3)= d2 ( 3 ) and d1 (2)= d2 ( 2 ) t h e n
r o z n i c a := d1 (1) − d2 ( 1 ) ;
e l s i f
d1 (3)/= d2 ( 3 ) t h e n
r o z n i c a :=(30 − d2 (1))+(12 − d1 ( 2 ) ) ∗ 3 0 +
3 6 5 ∗ ( d1 (3) − d2 (3) −1)+ d1 (1)+ d1 ( 2 ) ∗ 3 0 ;
end
i f ;
r e t u r n
r o z n i c a ;
end ”−” ;
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (ciało pakietu DniPak
[DniPak.adb] - cd
)
f u n c t i o n D z i e n T y g ( d :
d a t a )
r e t u r n
d n i
i s
x , dz :
i n t e g e r ;
b e g i n
x := p o c z a t e k − d ;
dz := ( d n i ’ p o s ( d z i e n p o c z ) + x ) mod 7 ;
r e t u r n
d n i ’ v a l ( d z ) ;
end D z i e n T y g ;
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
f u n c t i o n TworzDate ( d , m, r :
i n t e g e r )
r e t u r n
d a t a
i s
d t : d a t a ;
b e g i n
i f
d>31 o r m>12 o r r <2010 t h e n
r a i s e
z l a d a t a ; end
i f ;
d t : = ( d , m, r ) ;
r e t u r n
d t ;
end TworzDate ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (ciało pakietu DniPak
[DniPak.adb] - cd
)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− p r o c e d u r a wymaga t e x t i o
i
i n t e g e r t e x t i o
p r o c e d u r e W y p i s z D a t e ( d :
d a t a )
i s
b e g i n
ada . i n t e g e r t e x t i o . p u t ( d ( 1 ) , 0 ) ;
p u t ( ’− ’ ) ;
ada . i n t e g e r t e x t i o . p u t ( d ( 2 ) , 0 ) ;
p u t ( ’− ’ ) ;
ada . i n t e g e r t e x t i o . p u t ( d ( 3 ) , 0 ) ;
end W y p i s z D a t e ;
end DniPak ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (program korzystający z pakietu DniPak)
w i t h
ada . t e x t i o ,
ada . i n t e g e r t e x t i o ,
d n i p a k ;
u s e
ada . t e x t i o ,
ada . i n t e g e r t e x t i o ,
d n i p a k ;
p r o c e d u r e
w 1 5 d n i p a k t e s t
i s
d :
d a t a ;
dz , m, r : i n t e g e r ;
u s e
d n i i o ;
b e g i n
p u t ( ” p o d a j
d z i e n ,
m i e s i a c
i
r o k
: ” ) ;
g e t ( dz ) ;
g e t (m) ;
g e t ( r ) ;
d := t w o r z d a t e ( dz , m, r ) ;
p u t ( ” d a t a : ” ) ;
w y p i s z D a t e ( d ) ;
n e w l i n e ;
p u t ( ” d z i e n
t y g o d n i a : ” ) ;
d n i i o . p u t ( D z i e n T y g ( d ) ) ;
end w 1 5 d n i p a k t e s t ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Pakiety - uwagi
klauzuli with w specyfikacji pakietu używa się zazwyczaj rzadko
(tylko gdy ta specyfikacja korzysta z pakietu, np. zawiera jego
konkretyzację)
umieszczenie pakietu A w klauzulach with i use specyfikacji pakietu
B nie powoduje automatycznego dołączenia pakietu A do programu
w którym jest użyty pakiet B (nie zastępuje with A; use A; w tym
programie)
oczywiście pakiet A należy dołączyć tylko wtedy gdy program korzysta
bezpośrednio z zasobów pakietu A
jeśli specyfikacja pakietu B “powołuje do życia” pakiet C (poprzez
konkretyzację pewnego pakietu rodzajowego), to programy
korzystające z B dołączają automatycznie ten pakiet (“with C;” nie
jest potrzebne), ale nie widzą bezpośrednio jego zasobów
(potrzebne jest “use C;” albo “use B.C;”, przy czym umieszcza
się je w części deklaracyjnej programu)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Pakiety - uwagi cd
zmiany w specyfikacji pakietu powodują konieczność
przekompilowania programu który z niego korzysta; zmiany w
ciele pakietu powodują konieczność ponownego zbudowania
wersji wykonywalnej
pakiet może mieć tylko specyfikację
np. jeśli specyfikacja pakietu będzie zawierać wyłącznie definicje typów i
konkretyzacje pakietów, to ciało będzie zbędne
Agata Półrola Wydział Matematyki i Informatyki UŁ
Pakiety - uwagi cd
zmiany w specyfikacji pakietu powodują konieczność
przekompilowania programu który z niego korzysta; zmiany w
ciele pakietu powodują konieczność ponownego zbudowania
wersji wykonywalnej
pakiet może mieć tylko specyfikację
np. jeśli specyfikacja pakietu będzie zawierać wyłącznie definicje typów i
konkretyzacje pakietów, to ciało będzie zbędne
Agata Półrola Wydział Matematyki i Informatyki UŁ
Typy prywatne
Pakiety umożliwiają definiowanie
typów prywatnych
(przykład: typ
data w pakiecie DniPak)
w publicznej części specyfikacji pakietu definiujemy taki typ
pisząc
type nazwa typu is private;
szczegóły typu (jego pełna definicja) umieszczone są w części
prywatnej specyfikacji pakietu (po słowie private)
w tej samej części umieszcza się inicjalizacje publicznych
stałych tego typu (zob. stałą poczatek w pakiecie DniPak)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Typy prywatne - cd
zdefiniowanie typu jako prywatnego oznacza, że programy
korzystające z zasobów pakietu mogą używać tego typu, ale
nie mają dostępu do szczegółów typu (czyli np. “nie
wiedzą” że typ data w pakiecie DniPak jest tablicą )
jedynymi dostępnymi w tych programach operacjami jakie
można wykonywać na wartościach typu prywatnego są
podstawienie (:=), porównywanie za pomocą = i /= oraz
operacje udostępniane przez dany pakiet
Agata Półrola Wydział Matematyki i Informatyki UŁ
Po co typy prywatne? - przykład
Przykład (Pakiet bez użycia typu prywatnego - specyfikacja)
p a c k a g e u l a m k i
i s
t y p e u l a m e k
i s
a r r a y ( i n t e g e r
r a n g e
1 . . 2 )
o f
i n t e g e r ;
z l y m i a n o w n i k :
e x c e p t i o n ;
p r o c e d u r e
w y p i s z ( u :
i n u l a m e k ) ;
p r o c e d u r e
p o b i e r z ( u :
o u t u l a m e k ) ;
end u l a m k i ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (Pakiet bez użycia typu prywatnego - ciało)
w i t h ada . t e x t i o ,
ada . i n t e g e r t e x t i o ;
u s e ada . t e x t i o ,
ada . i n t e g e r t e x t i o ;
p a c k a g e body u l a m k i
i s
p r o c e d u r e
w y p i s z ( u :
i n u l a m e k )
i s
b e g i n
p u t ( u ( 1 ) , 0 ) ; p u t ( ” / ” ) ; p u t ( u ( 2 ) , 0 ) ;
end w y p i s z ;
p r o c e d u r e
p o b i e r z ( u :
o u t u l a m e k )
i s
b e g i n
p u t ( ” p o d a j
l i c z n i k > ” ) ;
g e t ( u ( 1 ) ) ;
p u t ( ” p o d a j m i a n o w n i k > ” ) ;
g e t ( u ( 2 ) ) ;
i f
u (2)=0 t h e n
r a i s e
z l y m i a n o w n i k ; end
i f ;
i f
u (2) <0 t h e n u (2):= − u ( 2 ) ; u (1):= − u ( 1 ) ; end
i f ;
end p o b i e r z ;
end u l a m k i ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (Pakiet bez użycia typu prywatnego - przykład użycia)
w i t h ada . t e x t i o ,
ada . I n t e g e r T e x t I O ,
u l a m k i ;
u s e ada . t e x t i o ,
ada . I n t e g e r T e x t I O ,
u l a m k i ;
p r o c e d u r e
u l a m k i t e s t
i s
u1 , u2 :
u l a m e k ;
b e g i n
p o b i e r z ( u1 ) ;
p o b i e r z ( u2 ) ;
i f
u1=u2 t h e n
p u t ( ” p o d a l e s dwa r o w n e u l a m k i ” ) ;
e l s e
p u t ( ” p o d a l e s
u l a m k i
k t o r e
n i e
s a r o w n e : ” ) ;
w y p i s z ( u1 ) ;
p u t ( ” i ” ) ;
w y p i s z ( u2 ) ;
i f
u1>u2 t h e n p u t ( ”
− p i e r w s z y
j e s t
w i e k s z y ” ) ;
e l s e
p u t ( ” − d r u g i
j e s t
w i e k s z y ” ) ;
end
i f ;
end
i f ;
−− u ł a m k i 1/2 i 5/10 n i e będą równe ,
d r u g i
b ę d z i e
u z n a n y z a w i ę k s z y
n e w l i n e ;
f o r
i
i n u1 ’ r a n g e l o o p p u t ( u1 ( i ) ) ;
end l o o p ;
n e w l i n e ;
u1 ( 2 ) : = 0 ;
w y p i s z ( u1 ) ;
−− można w t e n s p o s ó b u t w o r z y ć ułamek z zerowym m i a n o w n i k i e m ,
−− c h o c i a ż p r o c e d u r a p o b i e r a j ą c a na t o n i e p o z w a l a
end u l a m k i t e s t ;
Problem równości i porównywania ułamków można “obejść” definiując odpowiednie operatory, ale problemu
zerowych mianowników obejść nie można
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (ten sam pakiet z typem prywatnym - specyfikacja)
p a c k a g e
u l a m k i p r i v
i s
t y p e u l a m e k
i s
p r i v a t e ;
z l y m i a n o w n i k :
e x c e p t i o n ;
p r o c e d u r e
w y p i s z ( u :
i n u l a m e k ) ;
p r o c e d u r e
p o b i e r z ( u :
o u t u l a m e k ) ;
−− e w e n t u a l n i e :
f u n c t i o n ”=”( a , b : u l a m e k )
r e t u r n
b o o l e a n ;
p r i v a t e
t y p e u l a m e k
i s
a r r a y ( i n t e g e r
r a n g e
1 . . 2 )
o f
i n t e g e r ;
end u l a m k i p r i v ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (ten sam pakiet z typem prywatnym - ciało)
w i t h ada . t e x t i o ,
ada . i n t e g e r t e x t i o ;
u s e ada . t e x t i o ,
ada . i n t e g e r t e x t i o ;
p a c k a g e body u l a m k i p r i v
i s
p r o c e d u r e
w y p i s z ( u :
i n u l a m e k )
i s
b e g i n
p u t ( u ( 1 ) , 0 ) ; p u t ( ” / ” ) ; p u t ( u ( 2 ) , 0 ) ;
end w y p i s z ;
p r o c e d u r e
p o b i e r z ( u :
o u t u l a m e k )
i s
b e g i n
p u t ( ” p o d a j
l i c z n i k > ” ) ;
g e t ( u ( 1 ) ) ;
p u t ( ” p o d a j m i a n o w n i k > ” ) ;
g e t ( u ( 2 ) ) ;
i f
u (2)=0 t h e n
r a i s e
z l y m i a n o w n i k ; end
i f ;
i f
u (2) <0 t h e n u (2):= − u ( 2 ) ; u (1):= − u ( 1 ) ; end
i f ;
end p o b i e r z ;
−− e w e n t u a l n i e :
f u n c t i o n ”=”( a , b : u l a m e k )
r e t u r n
b o o l e a n
i s
−−
b e g i n
−−
i f
a ( 1 ) ∗ b (2)= b ( 1 ) ∗ a ( 2 )
t h e n
r e t u r n
t r u e ;
e l s e
r e t u r n
f a l s e ;
end
i f ;
−−
end ”=”;
end u l a m k i p r i v ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (ten sam pakiet z typem prywatnym - przykład użycia)
w i t h ada . t e x t i o ,
ada . I n t e g e r T e x t I O ,
u l a m k i p r i v ;
u s e ada . t e x t i o ,
ada . I n t e g e r T e x t I O ,
u l a m k i p r i v ;
p r o c e d u r e
u l a m k i p r i v t e s t
i s
u1 , u2 :
u l a m e k ;
b e g i n
p o b i e r z ( u1 ) ;
p o b i e r z ( u2 ) ;
−− KOMPILOWALNE ZAWSZE :
i f
u1=u2 t h e n
p u t ( ” p o d a l e s dwa r o w n e u l a m k i ” ) ;
e l s e
p u t ( ” p o d a l e s
u l a m k i
k t o r e
n i e
s a r o w n e : ” ) ;
w y p i s z ( u1 ) ;
p u t ( ” i ” ) ;
w y p i s z ( u2 ) ;
−− PRZY CZYM PRZY STANDARDOWYM ”=” UŁAMKI 1/2 i 5/10 NIE BĘDĄ RÓWNE
−− PRAWIDŁOWE WYNIKI OTRZYMAMY TYLKO GDY NAPISZEMY WŁASNY OPEATOR ”=”
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−−
KOMPILOWALNE TYLKO J E Ś L I NAPISZEMY WŁASNY OPERATOR ”<” DLA UŁAMKÓW:
−−
i f
u1>u2 t h e n p u t ( ” − p i e r w s z y
j e s t
w i e k s z y ” ) ;
−−
e l s e
p u t ( ” − d r u g i
j e s t
w i e k s z y ” ) ;
−−
end
i f ;
end
i f ;
n e w l i n e ;
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−−
NIEKOMPILOWALNE :
−−
f o r
i
i n u1 ’ r a n g e
l o o p p u t ( u1 ( i ) ) ;
end l o o p ;
n e w l i n e ;
−−
u1 ( 2 ) : = 0 ;
−−
p u t ( ” nowy u l a m e k :
” ) ;
w y p i s z ( u1 ) ;
end
u l a m k i p r i v t e s t ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Ograniczone typy prywatne
oprócz typów prywatnych możemy definiować
ograniczone typy
prywatne
pisząc w publicznej części specyfikacji pakietu
type nazwa typu is limited private;
szczegóły typu (jego pełna definicja) umieszczone są w części
prywatnej specyfikacji pakietu (analogicznie jak w przypadku typów
prywatnych)
zdefiniowany w ten sposób typ zachowuje się tak jak typ prywatny,
przy czym operacje :=, = i /= nie są dla niego dostępne
dostępnymi w programach operacjami dla ograniczonych typów
prywatnych są zatem tylko operacje zdefiniowane w pakiecie.
oczywiście w pakiecie można zdefiniować także własny operator "=" dla danego
ograniczonego typu prywatnego. Operator "/=" jest implementowany
automatycznie. Operatora ":=" samodzielnie zdefiniować nie można (co
najwyżej można napisać funkcję/procedurę o innej nazwie pełniącą podobną
rolę)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Po co ograniczone typy prywatne? - przykład
Przykład (Pakiet bez ograniczonego typu prywatnego -
specyfikacja)
p a c k a g e
k o l e j k i P a k
i s
t y p e
k o l e j k a
i s
p r i v a t e ;
k o l e j k a p u s t a :
e x c e p t i o n ;
p r o c e d u r e wstaw ( k :
i n
o u t
k o l e j k a ;
w s t a w i a n a l i c z b a :
i n
i n t e g e r ) ;
p r o c e d u r e u s u n ( k :
i n
o u t
k o l e j k a ;
u s u n i e t a l i c z b a :
o u t
i n t e g e r ) ;
p r o c e d u r e
w y p i s z ( k :
i n
k o l e j k a ) ;
p r i v a t e
t y p e box ;
t y p e w s k b o x
i s
a c c e s s box ;
t y p e box
i s
r e c o r d
d a n e :
i n t e g e r ;
n a s t e p n y :
w s k b o x ;
end r e c o r d ;
t y p e
k o l e j k a
i s
r e c o r d
p o c z a t e k ,
k o n i e c :
w s k b o x := n u l l ;
end r e c o r d ;
end k o l e j k i P a k ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (Pakiet bez ogr. typu pryw. - ciało)
w i t h ada . t e x t i o ,
ada . i n t e g e r t e x t i o ,
ada . u n c h e c k e d d e a l l o c a t i o n ;
u s e ada . t e x t i o ,
ada . i n t e g e r t e x t i o ;
p a c k a g e body k o l e j k i P a k
i s
p r o c e d u r e
z w o l n i j P a m i e c
i s new ada . u n c h e c k e d d e a l l o c a t i o n ( box , w s k b o x ) ;
p r o c e d u r e wstaw ( k :
i n
o u t
k o l e j k a ;
w s t a w i a n a l i c z b a :
i n
i n t e g e r )
i s
nowy :
w s k b o x ;
b e g i n
nowy := new box ’ ( d a n e=>w s t a w i a n a l i c z b a , n a s t e p n y=>n u l l ) ;
i f
k . p o c z a t e k=n u l l
t h e n
k . p o c z a t e k := nowy ; k . k o n i e c := nowy ;
e l s e
k . k o n i e c . n a s t e p n y := nowy ; k . k o n i e c := k . k o n i e c . n a s t e p n y ;
end
i f ;
end wstaw ;
p r o c e d u r e u s u n ( k :
i n
o u t
k o l e j k a ;
u s u n i e t a l i c z b a :
o u t
i n t e g e r )
i s
pom :
w s k b o x ;
b e g i n
i f
k . p o c z a t e k=n u l l
t h e n
r a i s e
k o l e j k a p u s t a ;
e l s e
pom:= k . p o c z a t e k ;
k . p o c z a t e k := k . p o c z a t e k . n a s t e p n y ;
u s u n i e t a l i c z b a :=pom . d a n e ;
z w o l n i j P a m i e c ( pom ) ;
end
i f ;
end u s u n ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (Pakiet bez ogr. typu pryw. - ciało cd.)
p r o c e d u r e
w y p i s z ( k :
i n
k o l e j k a )
i s
pom :
w s k b o x := k . p o c z a t e k ;
b e g i n
p u t ( ” p o c z a t e k −> ” ) ;
w h i l e pom/= n u l l
l o o p
p u t ( pom . dane , 0 ) ;
p u t ( ”−>” ) ;
pom:=pom . n a s t e p n y ;
end l o o p ;
p u t ( ” n u l l ” ) ;
end w y p i s z ;
end k o l e j k i P a k ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (Pakiet bez ogr. typu pryw. - przykład użycia)
w i t h ada . t e x t i o ,
k o l e j k i P a k ;
u s e ada . t e x t i o ,
k o l e j k i P a k ;
p r o c e d u r e
k o l e j k i P a k t e s t
i s
k1 , k2 , k3 :
k o l e j k a ;
b e g i n
wstaw ( k=>k1 , w s t a w i a n a l i c z b a =>1); wstaw ( k1 , 2 ) ;
wstaw ( k=>k2 , w s t a w i a n a l i c z b a =>1); wstaw ( k2 , 2 ) ;
p u t l i n e ( ” Twoje
k o l e j k i : ” ) ;
w y p i s z ( k1 ) ;
n e w l i n e ;
w y p i s z ( k2 ) ;
n e w l i n e ;
i f
k1=k2 t h e n
p u t l i n e ( ” t e
k o l e j k i
s a j e d n a k o w e ” ) ;
e l s e
p u t l i n e ( ” t e
k o l e j k i
s i e
r o z n i a ” ) ;
end
i f ;
n e w l i n e ( 2 ) ;
k3 := k2 ;
p u t l i n e ( ” Twoje n a s t e p n e
k o l e j k i : ” ) ;
w y p i s z ( k2 ) ;
n e w l i n e ;
w y p i s z ( k3 ) ;
n e w l i n e ;
i f
k2=k3 t h e n
p u t l i n e ( ” t e
k o l e j k i
s a j e d n a k o w e ” ) ;
e l s e
p u t l i n e ( ” t e
k o l e j k i
s i e
r o z n i a ” ) ;
end
i f ;
wstaw ( k2 , 1 0 ) ;
p u t l i n e ( ”Te same
k o l e j k i
po w s t a w i e n i u
e l e m e n t u : ” ) ;
w y p i s z ( k2 ) ;
n e w l i n e ;
w y p i s z ( k3 ) ;
n e w l i n e ;
i f
k2=k3 t h e n
p u t l i n e ( ” t e
k o l e j k i
s a j e d n a k o w e ” ) ;
e l s e
p u t l i n e ( ” t e
k o l e j k i
s i e
r o z n i a ” ) ;
end
i f ;
end
k o l e j k i P a k t e s t ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Problem z porównywaniem kolejek można “obejść” implementując własny operator
"=" , ale problemu podstawiania nie można “obejść” bez zamiany typu prywatnego na
ograniczony prywatny
Nowa specyfikacja:
p a c k a g e
k o l e j k i P a k
i s
t y p e
k o l e j k a
i s LIMITED p r i v a t e ;
k o l e j k a p u s t a :
e x c e p t i o n ;
p r o c e d u r e wstaw ( k :
i n
o u t
k o l e j k a ;
w s t a w i a n a l i c z b a :
i n
i n t e g e r ) ;
p r o c e d u r e u s u n ( k :
i n
o u t
k o l e j k a ;
u s u n i e t a l i c z b a :
o u t
i n t e g e r ) ;
p r o c e d u r e
w y p i s z ( k :
i n
k o l e j k a ) ;
p r i v a t e
t y p e box ;
t y p e w s k b o x
i s
a c c e s s box ;
t y p e box
i s
r e c o r d
d a n e :
i n t e g e r ;
n a s t e p n y :
w s k b o x ;
end r e c o r d ;
t y p e
k o l e j k a
i s
r e c o r d
p o c z a t e k ,
k o n i e c :
w s k b o x := n u l l ;
end r e c o r d ;
end k o l e j k i P a k ;
Agata Półrola Wydział Matematyki i Informatyki UŁ