Wstęp do programowania
wykład 10
Agata Półrola
Wydział Matematyki i Informatyki UŁ
sem. zimowy 2012/2013
Agata Półrola Wydział Matematyki i Informatyki UŁ
Podprogramy
Podprogramy w Adzie
Podprogramy
to sparametryzowane, wydzielone fragmenty
programów
podprogramy w Adzie to
funkcje
i
procedury
funkcje wywoływane są jako elementy wyrażeń i zwracają
wartość stanowiącą element wyrażenia
przykład:
x:=
sqrt(10.0)
+ 2.12;
procedury wywoływane są jako samodzielne instrukcje
przykład:
put(12.4);
Agata Półrola Wydział Matematyki i Informatyki UŁ
Po co podprogramy
bardziej czytelny kod
jednokrotne pisanie powtarzających się fragmentów programu
podprogram umieszczony w pakiecie może być użyty w wielu
programach
Agata Półrola Wydział Matematyki i Informatyki UŁ
Funkcje
Struktura funkcji
Ciało funkcji
ma postać:
function nazwa_funkcji (lista_parametrów) return typ_wyniku is
-- część deklaracyjna
begin
-- część wykonywalna z obowiązkowym return
end nazwa_funcji;
Przykład
f u n c t i o n s u m a T r z e c h ( x , y , z :
i n t e g e r )
r e t u r n
i n t e g e r
i s
w :
i n t e g e r ;
b e g i n
w:= x+y+z ;
r e t u r n w ;
end s u m a T r z e c h ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Uwagi
ciała funkcji umieszczamy w części deklaracyjnej programu (lub w
osobnym pakiecie)
funkcje wywoływane są jako elementy wyrażeń
przykład:
a:=sumaTrzech(1,2,3);
parametry funkcji wymienione w nawiasie na początku jej
ciała nazywamy
parametrami (argumentami) formalnymi
wartości dla parametrów formalnych podane w wywołaniu
funkcji nazywamy
parametrami aktualnymi (argumentami
wywołania)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (Funkcja)
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 0 f u n 1
i s
f u n c t i o n s u m a T r z e c h ( x , y , z : i n t e g e r )
r e t u r n
i n t e g e r
i s
w :
i n t e g e r ;
b e g i n
w:= x+y+z ;
r e t u r n w ; −− a l t e r n a t y w n i e :
r e t u r n x+y+z ;
end s u m a T r z e c h ;
a : i n t e g e r ;
b e g i n
a := s u m a T r z e c h ( 1 , 2 , 3 ) ;
p u t ( a ) ;
p u t ( s u m a T r z e c h ( a , 4 , 5 ) ) ;
end w 1 0 f u n 1 ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Jak to działa
parametry formalne przyjmują wartości parametrów aktualnych
funkcja wykonuje obliczenia wykorzystując te wartości i zwraca wynik
zwrócony wynik jest wykorzystany w programie głównym w miejscu wywołania
funkcji (tu - przypisany zmiennej x zadeklarowanej w programie).
Agata Półrola Wydział Matematyki i Informatyki UŁ
Jak to działa
parametry formalne przyjmują wartości parametrów aktualnych
funkcja wykonuje obliczenia wykorzystując te wartości i zwraca wynik
zwrócony wynik jest wykorzystany w programie głównym w miejscu wywołania
funkcji (tu - przypisany zmiennej x zadeklarowanej w programie).
Agata Półrola Wydział Matematyki i Informatyki UŁ
Jak to działa
parametry formalne przyjmują wartości parametrów aktualnych
funkcja wykonuje obliczenia wykorzystując te wartości i zwraca wynik
zwrócony wynik jest wykorzystany w programie głównym w miejscu wywołania
funkcji (tu - przypisany zmiennej x zadeklarowanej w programie).
Agata Półrola Wydział Matematyki i Informatyki UŁ
Uwagi - cd
instrukcja return
Funkcja może zawierać kilka instrukcji return
każdy możliwy przebieg funkcji musi kończyć się instrukcją
return (inaczej zostanie zgłoszony program error)
wykonanie instrukcji return powoduje zwrócenie wyniku i
zakończenie wykonywania funkcji (ewentualne instrukcje
znajdujące się w dalszej części ciała funkcji nie zostaną
wykonane)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (Funkcja z kilkoma return)
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 0 f u n 2
i s
s u b t y p e t y p w y n i k o w y
i s
i n t e g e r
r a n g e
− 1 . . 1 ;
f u n c t i o n
z n a k ( a :
i n t e g e r )
r e t u r n
t y p w y n i k o w y
i s
b e g i n
i f
a>0 t h e n
r e t u r n
1 ;
e l s i f
a=0 t h e n
r e t u r n
0 ;
−− p u t ( ” z e r o ” ) ;
−− n i e o s i a g a l n y kod
e l s e
r e t u r n
−1;
end
i f ;
end z n a k ;
w : 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 (w ) ;
p u t ( ” z w r o c o n y z n a k ” ) ;
p u t ( z n a k (w ) ) ;
end w 1 0 f u n 2 ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Uwagi - cd
zmienne
funkcja może mieć swoje własne zmienne (
zmienne lokalne
),
deklarowane w jej części deklaracyjnej
zmienna lokalna jest widziana tylko wewnątrz funkcji
z tego powodu zmienne lokalne różnych funkcji mogą mieć
takie same nazwy
zmienne lokalne fukcji to nie to samo co jej parametry i
nie można dowolnie zastępować jednego drugim!!!
funkcja nie powinna korzystać ze zmiennych globalnych
→ wszystkie dane dla funkcji powinny być przekazane przez parametry, efektem
działania powinno być tylko zwrócenie wartości do programu (a nie np.
modyfikacja zmiennych globalnych). Oznacza to również, że treść funkcji nie
powinna zawierać pobierania żadnych danych z klawiatury ani wypisywania
wyników na ekran!
jeśli zmienna lokalna funkcji ma taką nazwę jak zmienna
globalna, to zmienna lokalna przesłania globalną
Agata Półrola Wydział Matematyki i Informatyki UŁ
Uwagi - cd
parametry, zwracana wartość
funkcja może mieć wiele parametrów, które mogą być różnych
typów
elementy listy parametrów jednego typu oddzielamy przecinkami, deklaracje
parametrów różnych typów - średnikami
przykład:
function JakasFkcja (a,b,c:integer; x,y:float) return float is ...
funkcja nie może modyfikować wartości swoich parametrów -
są one traktowane jako parametry w trybie “in”
(“wejściowym”), czyli jak stałe
→ niedozwolone jest np. przypisanie parametrowi jakiejś wartości
funkcja może zwracać tylko jedną wartość
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (Funkcja z wieloma parametrami)
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 . f l o a t 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 ,
ada . f l o a t t e x t i o ;
p r o c e d u r e
w 1 0 f u w i e l o p a r
i s
f u n c t i o n
K a w a l e k P o l a P r o s t o k a t a
( b1 , b2 : i n t e g e r ; kaw : f l o a t )
r e t u r n
f l o a t
i s
b e g i n
r e t u r n
f l o a t ( b1 ∗ b2 ) ∗ kaw ;
end K a w a l e k P o l a P r o s t o k a t a ;
a , b :
i n t e g e r ;
p ,
p a r t : f l o a t ;
b e g i n
p u t ( ” P o d a j b o k i
p r o s t o k a t a ” ) ;
g e t ( a ) ;
g e t ( b ) ;
p u t ( ” J a k i u l a m e k p o l a
w e z m i e s z ? ” ) ;
g e t ( p a r t ) ;
p := K a w a l e k P o l a P r o s t o k a t a ( a , b , p a r t ) ;
p u t ( ” P o l e w/w f r a g m e n t u w y n o s i ” ) ;
p u t ( p , e x p =>0);
end w 1 0 f u w i e l o p a r ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Uwagi - cd
typy anonimowe i (nie)zawężone
parametry funkcji mogą być różnych typów, ale
nie może to
być typ anonimowy
wartość zwracana przez funkcję
nie może być typu
anonimowego
parametr funkcji
może być typu niezawężonego
. W takim
przypadku ograniczenia (wartości atrybutów ’range, ’length
itd) odpowiadają ograniczeniom dla parametru aktualnego.
Użycie zawężenia w liście parametrów jest niedozwolone
zamiast zawężenia można w liście parametrów uzyć nazwy podtypu typu
niezawężonego
wartość zwracana przez funkcję
może być typu
niezawężonego
. Funkcja w praktyce zwraca jednak zawsze
wartość “zawężoną”.
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (Funkcja z parametrem typu niezawężonego)
Funkcja obliczająca średnią elementów tablicy typu Tab (gdzie Tab
jest zdefiniowane jako
type Tab is array (integer range <>) of integer;
f u n c t i o n
S r e d n i a ( t : Tab )
r e t u r n
f l o a t
i s
suma :
i n t e g e r : = 0 ;
b e g i n
f o r
i
i n t ’ r a n g e l o o p
suma := suma+t ( i ) ;
end l o o p ;
r e t u r n
f l o a t ( suma ) / f l o a t ( t ’ l e n g t h ) ;
end S r e d n i a ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (cd - wykorzystanie funkcji z poprzedniego slajdu)
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 . f l o a t 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 ,
ada . f l o a t t e x t i o ;
p r o c e d u r e w 1 0 f u n t y p a r a m
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 ;
f u n c t i o n
S r e d n i a ( t : Tab )
r e t u r n
f l o a t
i s
suma :
i n t e g e r : = 0 ;
b e g i n
f o r
i
i n t ’ r a n g e l o o p
suma := suma+t ( i ) ;
end l o o p ;
r e t u r n
f l o a t ( suma ) / f l o a t ( t ’ l e n g t h ) ;
end S r e d n i a ;
n :
n a t u r a l ;
p :
f l o a t ;
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 ( n ) ;
d e c l a r e
x :
t a b ( 1 . . n ) ;
b e g i n
p u t l i n e ( ” p o d a j
e l e m e n t y
t a b l i c y
: ” ) ;
f o r
i
i n x ’ r a n g e l o o p
g e t ( x ( i ) ) ;
end l o o p ;
p := S r e d n i a ( x ) ;
p u t ( ” S r e d n i a
e l e m e n t o w w y n o s i w y n o s i ” ) ;
p u t ( p , e x p =>0);
end ;
end w 1 0 f u n t y p a r a m ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (Funkcja z parametrem i wynikiem typu niezawężonego)
Funkcja zwracająca tablicę wartości przeciwnych do wartości
elementów tablicy wejściowej typu Tab (gdzie Tab jest
zdefiniowane jak poprzednio)
f u n c t i o n
T a b l i c a P r z e c i w n y c h ( t : Tab )
r e t u r n Tab i s
t a b w y n i k o w a : Tab:= t ;
b e g i n
f o r
i
i n t ’ r a n g e l o o p
t a b w y n i k o w a ( i ) : = −t a b w y n i k o w a ( i ) ;
end l o o p ;
r e t u r n
t a b w y n i k o w a ;
end T a b l i c a P r z e c i w n y c h ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (cd - wykorzystanie funkcji z poprzedniego slajdu)
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 0 f u n i e z
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 ;
f u n c t i o n
T a b l i c a P r z e c i w n y c h ( t : Tab )
r e t u r n Tab i s
t a b w y n i k o w a : Tab:= t ;
b e g i n
f o r
i
i n t ’ r a n g e l o o p
t a b w y n i k o w a ( i ) : = −t a b w y n i k o w a ( i ) ;
end l o o p ;
r e t u r n
t a b w y n i k o w a ;
end T a b l i c a P r z e c i w n y c h ;
x , y : Tab ( 1 . . 1 0 ) ;
b e g i n
p u t l i n e ( ” p o d a j
e l e m e n t y
t a b l i c y
: ” ) ;
f o r
i
i n x ’ r a n g e l o o p
g e t ( x ( i ) ) ;
end l o o p ;
p u t l i n e ( ” T a b l i c a : ” ) ;
f o r
i
i n x ’ r a n g e l o o p
p u t ( x ( i ) , 2 ) ; end l o o p ;
n e w l i n e ;
y := T a b l i c a P r z e c i w n y c h ( x ) ;
p u t l i n e ( ” T a b l i c a z p r z e c i w n y m i
w a r t o s c i a m i : ” ) ;
f o r
i
i n y ’ r a n g e l o o p
p u t ( y ( i ) , 2 ) ; end l o o p ;
end w 1 0 f u n i e z ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (Funkcja z parametrem i wynikiem typu niezawężonego)
Funkcja zwraca tablicę typu Tab zawierającą wszystkie elementy
ujemne z tablicy wejściowej typu Tab (typ zdefiniowany jak
poprzednio)
f u n c t i o n
T a b l i c a U j e m n y c h ( t : Tab )
r e t u r n Tab i s
i l e d o d : i n t e g e r : = 0 ;
b e g i n
f o r
i
i n t ’ r a n g e l o o p
i f
t ( i )<0 t h e n
i l e d o d := i l e d o d +1; end
i f ; end l o o p ;
d e c l a r e
t a b w y n i k o w a : Tab ( 1 . . i l e d o d ) ;
k : i n t e g e r ;
b e g i n
k : = 1 ;
f o r
i
i n t ’ r a n g e l o o p
i f
t ( i )<0 t h e n
t a b w y n i k o w a ( k ) : = t ( i ) ; k := k +1;
end
i f ;
end l o o p ;
r e t u r n
t a b w y n i k o w a ;
end ;
end T a b l i c a U j e m n y c h ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (cd - wykorzystanie funkcji z poprzedniego slajdu)
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 0 f u n i e z r o z
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 ;
f u n c t i o n
T a b l i c a U j e m n y c h ( t : Tab )
r e t u r n Tab i s
i l e d o d : i n t e g e r : = 0 ;
b e g i n
f o r
i
i n t ’ r a n g e l o o p
i f
t ( i )<0 t h e n
i l e d o d := i l e d o d +1; end
i f ; end l o o p ;
d e c l a r e
t a b w y n i k o w a : Tab ( 1 . . i l e d o d ) ; k : i n t e g e r : = 1 ;
b e g i n
f o r
i
i n t ’ r a n g e l o o p
i f
t ( i )<0 t h e n t a b w y n i k o w a ( k ) : = t ( i ) ; k := k +1; end
i f ;
end l o o p ;
r e t u r n
t a b w y n i k o w a ; end ;
end T a b l i c a U j e m n y c h ;
x : Tab ( 1 . . 1 0 ) ;
b e g i n
p u t l i n e ( ” p o d a j
e l e m e n t y
t a b l i c y
: ” ) ;
f o r
i
i n x ’ r a n g e l o o p
g e t ( x ( i ) ) ;
end l o o p ;
p u t l i n e ( ” T a b l i c a : ” ) ;
f o r
i
i n x ’ r a n g e l o o p
p u t ( x ( i ) , 2 ) ; end l o o p ;
n e w l i n e ;
d e c l a r e
y : Tab:= T a b l i c a U j e m n y c h ( x ) ;
b e g i n
p u t l i n e ( ” T a b l i c a
w a r t o s c i
u j e m n y c h : ” ) ;
f o r
i
i n y ’ r a n g e l o o p
p u t ( y ( i ) , 2 ) ; end l o o p ;
end ;
end w 1 0 f u n i e z r o z ;
Agata Półrola Wydział Matematyki i Informatyki UŁ