Wstęp do programowania
wykład 7
Agata Półrola
Wydział Matematyki i Informatyki UŁ
sem. zimowy 2010/2011
Agata Półrola Wydział Matematyki i Informatyki UŁ
Wyjątki
W sytuacjach “awaryjnych” (wczytanie litery zamiast liczby,
dzielenie przez zero, przekroczenie zakresu i itp) zgłaszany jest
tzw.
wyjątek
nazwy wyjątków określone są w odpowiednich pakietach;
można również deklarować własne wyjątki.
Agata Półrola Wydział Matematyki i Informatyki UŁ
Wyjątki predefiniowane
Wyjątki predefiniowane (tzn. zdefiniowane w pakiecie Standard)
to:
Constraint Error
Program Error
Storage Error
Tasking Error
Inne popularne wyjątki
Data Error zdefiniowany w pakiecie ada.text io
Agata Półrola Wydział Matematyki i Informatyki UŁ
Kiedy pojawiają się powyższe wyjątki
Constraint Error - przekroczenie jakiegoś zakresu.
(niektóre przypadki)
:
przekroczenie zakresu typu
przekroczenie zakresu indeksu tablicy lub zakresu wyróżnika
rekordu
próba użycia pól rekordu nie istniejących dla danej wartości
wyrożnika
próba odwołania do zawartości obiektu który miałby być
pokazywany przez wskaźnik, gdy wartość tego wskaźnika jest
null
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład
with ada . t e x t i o , ada . i n t e g e r T e x t I O ;
use 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 0 7 w y j a t k i C E
i s
a , b , c :
i n t e g e r ;
b e g i n
a := i n t e g e r ’ l a s t ;
b := i n t e g e r ’ l a s t / 2 ;
c := a+2∗b ;
−− s p o w o d u j e c o n s t r a i n t e r r o r
p u t ( c ) ;
end w 0 7 w y j a t k i C E ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Kiedy pojawiają się powyższe wyjątki - cd.
Storage Error - przekroczenie rozmiaru stosu (tzw.
przepełnienie stosu)
stos - obszar pamięci wydzielony dla danego programu i służący do
przechowywania jego zmiennych lokalnych. Wielkość stosu jest stała w czasie
wykonania programu.
Główne przypadki:
deklarowanie zmiennych (np. tablicowych) zbyt dużego
rozmiaru
“nieodpowiednie” wywoływanie niektórych funkcji
rekurencyjnych (np. dla zbyt dużych parametrów)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład
p r o c e d u r e w 0 7 w y j a t k i S E
i s
a :
i n t e g e r ;
b e g i n
a := i n t e g e r ’ l a s t / 2 ;
d e c l a r e
t : a r r a y ( i n t e g e r range 1 . . a ) o f i n t e g e r ;
−− prawdop . s p o w o d u j e S t o r a g e E r r o r
b e g i n
t ( 1 ) : = 1 0 ;
end ;
end w 0 7 w y j a t k i S E ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Kiedy pojawiają się powyższe wyjątki - cd.
Program Error - próby jakiegoś “naruszenia” struktury
programu (np. dla pewnych danych wykonanie funkcji nie
natrafi na return
Tasking Error - błąd związany z wielozadaniowością
Data Error - błąd danych (np. podanie litery zamiast liczby)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład
with ada . f l o a t T e x t I O ,
ada . n u m e r i c s . E l e m e n t a r y F u n c t i o n s ;
use ada . f l o a t T e x t I O ,
ada . n u m e r i c s . E l e m e n t a r y F u n c t i o n s ;
p r o c e d u r e w 0 7 w y j a t k i P E
i s
f u n c t i o n p i e r w i a s t e k ( a :
f l o a t ) r e t u r n
f l o a t
i s
b e g i n
i f a >=0.0 then r e t u r n s q r t ( a ) ; end i f ;
end p i e r w i a s t e k ;
a :
f l o a t ;
b e g i n
g e t ( a ) ;
−− p r z y z l y c h d an y c h D a t a E r r o r
p u t ( p i e r w i a s t e k ( a ) ) ;
−− d l a ujemnego A P r o g r a m E r r o r
end w 0 7 w y j a t k i P E ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Wyjątki zdefiniowane w pakietach
Każdy dostępny pakiet może (ale nie musi) zawierać definicje
wyjątków. Możemy się do nich odwoływać pisząc
nazwa pakietu.nazwa wyjątku lub po prostu nazwa wyjątku
jeśli zawartość pakietu jest dostępna bezpośrednio, a nazwa
wyjątku jest jednoznaczna.
Definiowanie własnych wyjątków
W programie (w jego części deklaracyjnej) można definiować
własne wyjątki pisząc
nazwa wyjątku:
exception;
Instrukcja powodująca zgłoszenie wyjątku ma postać
raise nazwa wyjątku;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Wyjątki zdefiniowane w pakietach
Każdy dostępny pakiet może (ale nie musi) zawierać definicje
wyjątków. Możemy się do nich odwoływać pisząc
nazwa pakietu.nazwa wyjątku lub po prostu nazwa wyjątku
jeśli zawartość pakietu jest dostępna bezpośrednio, a nazwa
wyjątku jest jednoznaczna.
Definiowanie własnych wyjątków
W programie (w jego części deklaracyjnej) można definiować
własne wyjątki pisząc
nazwa wyjątku:
exception;
Instrukcja powodująca zgłoszenie wyjątku ma postać
raise nazwa wyjątku;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład
with ada . t e x t i o , ada . i n t e g e r t e x t i o ;
use 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 0 7 w y j a t k i u d e f
i s
j e s t 1 3 : e x c e p t i o n ;
a :
i n t e g e r ;
b e g i n
g e t ( a ) ;
i f a=13 then r a i s e
j e s t 1 3 ; end i f ;
p u t ( ” p o d a l e s
l i c z b e ” ) ; p u t ( a , 0 ) ;
end w 0 7 w y j a t k i u d e f ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Obsługa wyjątków
Jak już było na poprzednim wykładzie - kod obsługujący wyjatki
umieszczamy na końcu bloku begin ...
end
Ma on postać podobną do instrukcji case:
begin
...
exception
when wyjątek_1 | wyjątek_2 | ... | wyjątek_n => instrukcje
when wyjątek_(n+1) | ... | wyjątek_k => instrukcje
...
when others => instrukcje
end;
przy czym when others (obsługujące wszystkie wyjątki nie wymienione we
wcześniejszych “when” jest opcjonalne - nie musi wystąpić nawet jeśli wyjątki
wymienione we wcześniejszych listach to nie wszystkie wyjątki jakie mogą wystąpić w
danym kodzie (w odróżnieniu od instrukcji case)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Jeśli nie ma obsługi wyjątku
wyjątek jest propagowany dynamicznie, tzn. jednostka
programu (procedura, funkcja, blok) w której wystąpił wyjątek
jest zakańczana i wyjątek jest zgłaszany w miejscu które tę
jednostkę wywołało
powyższa propagacja jest powtarzana albo “do samej góry”
(do momentu zakończenia programu głownego), albo do
miejsca, w którym dany wyjątek zostanie obsłużony.
Agata Półrola Wydział Matematyki i Informatyki UŁ
Działanie obsługi wyjątku
w przypadku zgłoszenia wyjątku instrukcje następujące po
odpowiadającym mu “=>” zastępują dalsze (po miejscu
powodującym wyjątek) instrukcje danego bloku
po wykonaniu tych instrukcji program przechodzi do miejsca
“za daną jednostką” (tj. albo do kolejnej instrukcji za
blokiem, albo do kolejnych instrukcji za podprogramem który
zgłosił i obsłuzył wyjątek)
Agata Półrola Wydział Matematyki i Informatyki UŁ
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 0 7 w y j a t k i p r o p
i s
j e s t 1 3 :
e x c e p t i o n ;
a :
i n t e g e r ;
b e g i n
b e g i n
b e g i n
g e t ( a ) ;
i f
a=13 t h e n
r a i s e
j e s t 1 3 ; end
i f ;
p u t ( ” p o d a l e s
l i c z b e ” ) ;
p u t ( a , 0 ) ;
e x c e p t i o n
when j e s t 1 3 => p u t l i n e ( ” f e r a l n e
d a n e ” ) ;
end ;
p u t l i n e ( ” w y s z e d l e m z b l o k u ” ) ;
e x c e p t i o n
when j e s t 1 3 => p u t ( ” z l a
l i c z b a ” ) ;
when d a t a e r r o r => p u t ( ” n i e
l i c z b a ” ) ;
end ;
end w 0 7 w y j a t k i p r o p ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład
w i t h ada . t e x t i o , ada . f l o a t T e x t I O ,
ada . n u m e r i c s . E l e m e n t a r y F u n c t i o n s ;
u s e ada . t e x t i o , ada . f l o a t T e x t I O ,
ada . n u m e r i c s . E l e m e n t a r y F u n c t i o n s ;
p r o c e d u r e
w 0 7 w y j a t k i p r o p o b s
i s
f u n c t i o n
p i e r w i a s t e k ( a :
f l o a t )
r e t u r n
f l o a t
i s
z a m a l e :
e x c e p t i o n ;
b e g i n
i f
a <=2.0 t h e n
r a i s e
z a m a l e ; end
i f ;
i f
a >=0.0 t h e n
r e t u r n
s q r t ( a ) ;
end
i f ;
e x c e p t i o n
when p r o g r a m e r r o r=> p u t ( ” l i c z b a
uj emn a ” ) ;
when z a m a l e => p u t ( ” . . . z a mala
l i c z b a . . . ” ) ;
r e t u r n
0 . 0 ;
end p i e r w i a s t e k ;
a :
f l o a t ;
b e g i n
p u t ( ” p o d a j
l i c z b e ” ) ;
g e t ( a ) ;
b e g i n
p u t ( ” p i e r w i a s t e k
w y n o s i : ” ) ;
p u t ( p i e r w i a s t e k ( a ) ) ;
n e w l i n e ;
e x c e p t i o n
when p r o g r a m e r r o r => p u t l i n e ( ” b l a d ” ) ;
when d a t a e r r o r
|
c o n s t r a i n t e r r o r => p u t l i n e ( ” z l e
d a n e ” ) ;
end ;
p u t ( ” k o n i e c p r o g r a m u ” ) ;
end w 0 7 w y j a t k i p r o p o b s ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Jedno z zastosowań obsługi wyjątku
Obsługa wyjątku może wymusić podanie poprawnych danych
Przydaje się do tego instrukcja skip line z pakietu ada.text io,
powodująca wyczyszczenie bufora klawiatury
czyszczenie bufora oznacza tutaj usunięcie z niego wszystkich znaków do
najbliższego znaku końca linii (entera), łącznie z tym enterem
można również używać skip line(n), gdzie n jest liczbą - odpowiada to użyciu
n kolejnych skip line
Agata Półrola Wydział Matematyki i Informatyki UŁ
Jedno z zastosowań obsługi wyjątku
Obsługa wyjątku może wymusić podanie poprawnych danych
Przydaje się do tego instrukcja skip line z pakietu ada.text io,
powodująca wyczyszczenie bufora klawiatury
czyszczenie bufora oznacza tutaj usunięcie z niego wszystkich znaków do
najbliższego znaku końca linii (entera), łącznie z tym enterem
można również używać skip line(n), gdzie n jest liczbą - odpowiada to użyciu
n kolejnych skip line
Agata Półrola Wydział Matematyki i Informatyki UŁ
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 0 7 w y j a t k i m u s
i s
a :
i n t e g e r ;
b e g i n
l o o p
b e g i n
p u t ( ” P o d a j
l i c z b e > ” ) ;
g e t ( a ) ;
e x i t ;
e x c e p t i o n
when d a t a e r r o r => p u t l i n e ( ” b l e d n e d a n e ” ) ;
s k i p l i n e ;
end ;
end l o o p ;
p u t ( ” p o d a l e s ” ) ;
p u t ( a , 0 ) ;
n e w l i n e ;
p u t ( ” k o n i e c p r o g r a m u ” ) ;
end w 0 7 w y j a t k i m u s ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice
Co to jest tablica
Tablica
jest zlożonym obiektem składającym się z
wielu elementów
(tzw.
składowych
) należących do
tego samego typu
tablica może być jedno-, dwu- lub więcejwymiarowa
do całej struktury odwołujemy się za pomocą pojedynczego
identyfikatora
możemy również odwoływać się do poszczególnych
(pojedynczych) elementów tablicy, a także do podtablic
do elementów tablicy i podtablic odwołujemy się używając
tzw.
indeksów
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice
Co to jest tablica
Tablica
jest zlożonym obiektem składającym się z
wielu elementów
(tzw.
składowych
) należących do
tego samego typu
tablica może być jedno-, dwu- lub więcejwymiarowa
do całej struktury odwołujemy się za pomocą pojedynczego
identyfikatora
możemy również odwoływać się do poszczególnych
(pojedynczych) elementów tablicy, a także do podtablic
do elementów tablicy i podtablic odwołujemy się używając
tzw.
indeksów
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice
Co to jest tablica
Tablica
jest zlożonym obiektem składającym się z
wielu elementów
(tzw.
składowych
) należących do
tego samego typu
tablica może być jedno-, dwu- lub więcejwymiarowa
do całej struktury odwołujemy się za pomocą pojedynczego
identyfikatora
możemy również odwoływać się do poszczególnych
(pojedynczych) elementów tablicy, a także do podtablic
do elementów tablicy i podtablic odwołujemy się używając
tzw.
indeksów
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykłady tablic jednowymiarowych
Agata Półrola Wydział Matematyki i Informatyki UŁ
Deklaracja tablic jednowymiarowych
zmienne tablicowe możemy deklarować jako będące tzw.
anonimowego typu tablicowego
:
zmienna :
array (określenie indeksu) of
typ składowych;
Przykłady
a : array (integer range 1..10) of integer;
type dni is (pon, wt, sr, czw, pt, so, nie);
b: array (dni) of float;
c: array(1..10) of dni;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Deklaracja tablic jednowymiarowych - cd
kolejna możliwość to zdefiniowanie
typu tablicowego
posiadającego własną nazwę, a potem zadeklarowanie
zmiennej tego typu
type nazwa typu is array (określenie indeksu) of
typ składowych ;
Przykłady
type ciag10liczb is array (integer range 1..10)
of integer;
a: ciag10liczb;
---------
type dni is (pon, wt, sr, czw, pt, so, nie);
type tabTemp is array (dni) of float;
b: tabTemp;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Indeks - uwagi
określenie indeksu może być postaci:
początek zakresu ...
koniec zakresu
typ indeksu
typ indeksu range początek zakresu ...
koniec zakresu
indeks
musi być typu dyskretnego
jeśli typ indeksu nie jest podany jawnie, to przyjmuje się, że
jest on odpowiedniego typu uniwersalnego (np.
universal integer)
krańce zakresu nie muszą być stałymi - mogą być zadane
dowolnym wyrażeniem
Agata Półrola Wydział Matematyki i Informatyki UŁ
Indeks - uwagi
określenie indeksu może być postaci:
początek zakresu ...
koniec zakresu
typ indeksu
typ indeksu range początek zakresu ...
koniec zakresu
indeks
musi być typu dyskretnego
jeśli typ indeksu nie jest podany jawnie, to przyjmuje się, że
jest on odpowiedniego typu uniwersalnego (np.
universal integer)
krańce zakresu nie muszą być stałymi - mogą być zadane
dowolnym wyrażeniem
Agata Półrola Wydział Matematyki i Informatyki UŁ
Indeks - uwagi
określenie indeksu może być postaci:
początek zakresu ...
koniec zakresu
typ indeksu
typ indeksu range początek zakresu ...
koniec zakresu
indeks
musi być typu dyskretnego
jeśli typ indeksu nie jest podany jawnie, to przyjmuje się, że
jest on odpowiedniego typu uniwersalnego (np.
universal integer)
krańce zakresu nie muszą być stałymi - mogą być zadane
dowolnym wyrażeniem
Agata Półrola Wydział Matematyki i Informatyki UŁ
Odwołania do elementów tablic
Do elementów tablic odwołujemy się przez nazwę zmiennej
tablicowej i wartość indeksu umieszczoną w okrągłych nawiasach
(przy czym wartość indeksu może być dana dowolnym wyrażeniem)
Przykłady
a(1):=12;
put(a(1));
b(pon):=12.5;
i:integer;
...
i:=2*2;
put(a(i));
Agata Półrola Wydział Matematyki i Informatyki UŁ
Wypełnianie tablic wartościami
nie wypełniona “jawnie” danymi zmienna tablicowa jest
wypełniona przypadkowymi wartościami
tablica może zostać wypełniona danymi przez kolejne
przypisywanie wartości wszystkim jej składowym...
często wykorzystuje się wówczas pętle
... albo przez przypisanie wartości wszystkim składowym
równocześnie, jedną instrukcją - co wymaga użycia tzw.
agregatu tablicy
Agata Półrola Wydział Matematyki i Informatyki UŁ
Wypełnianie tablic wartościami
nie wypełniona “jawnie” danymi zmienna tablicowa jest
wypełniona przypadkowymi wartościami
tablica może zostać wypełniona danymi przez kolejne
przypisywanie wartości wszystkim jej składowym...
często wykorzystuje się wówczas pętle
... albo przez przypisanie wartości wszystkim składowym
równocześnie, jedną instrukcją - co wymaga użycia tzw.
agregatu tablicy
Agata Półrola Wydział Matematyki i Informatyki UŁ
Wypełnianie tablic wartościami
nie wypełniona “jawnie” danymi zmienna tablicowa jest
wypełniona przypadkowymi wartościami
tablica może zostać wypełniona danymi przez kolejne
przypisywanie wartości wszystkim jej składowym...
często wykorzystuje się wówczas pętle
... albo przez przypisanie wartości wszystkim składowym
równocześnie, jedną instrukcją - co wymaga użycia tzw.
agregatu tablicy
Agata Półrola Wydział Matematyki i Informatyki UŁ
Agregaty tablic (jednowymiarowych)
Mamy tablicę:
temperatury:
array (miesiace range sty..mar) of
float;
notacja pozyzyjna:
temperatury := (-10.0, -15.5, 4.2);
notacja nazywana:
temperatury := (lut=>-15.5, sty=>-10.0, mar=>4.2);
temperatury := (lut => -12.0, others => -2.1);
temperatury := (others => -3.0);
notacja mieszana:
temperatury := (-10.0, others=>-3.2);
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (Pobranie i wypisanie tablicy, agregaty)
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 0 7 t a b
i s
t y p e t a b
i s
a r r a y
( i n t e g e r
r a n g e
0 . . 5 )
o f
i n t e g e r ;
t :
t a b ;
b e g i n
−− p r z y k l a d y
w y p e l n i e n i a
t a b l i c y
z a pomoca a g r e g a t o w :
−−t : =( o t h e r s =>0);
−−T : = ( 3 , 2 , 1 , 3 , 4 , 7 ) ;
t :=(2=>4, o t h e r s =>0);
p u t l i n e ( ” w y p i s a n i e
t a b l i c y : ” ) ;
f o r
i
i n
0 . . 5
l o o p
p u t ( t ( i ) ) ;
end l o o p ;
p u t l i n e ( ” T e r a z p o b i e r z e m y d a n e do
t a b l i c y ” ) ;
f o r
i
i n
0 . . 5
l o o p
p u t ( ” p o d a j
e l e m e n t na m i e j s u ” ) ;
p u t ( i , 0 ) ;
p u t ( ”> ” ) ;
g e t ( t ( i ) ) ;
end l o o p ;
p u t l i n e ( ” w y p i s a n i e
p o b r a n e j
t a b l i c y : ” ) ;
f o r
i
i n
0 . . 5
l o o p
p u t ( t ( i ) ) ;
end l o o p ;
end w 0 7 t a b ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Atrybuty tablic
zmienna tablicowa’first
pierwszy (najmniejszy) indeks danej tablicy
zmienna tablicowa’last
ostatni (największy) indeks danej tablicy
zmienna tablicowa’range
zakres indeksu danej tablicy (odpowiednik
zmienna tablicowa’first..zmienna tablicowa’last)
zmienna tablicowa’length
długość danej tablicy
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład (Poprzedni przykład - z użyciem atrybutów)
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 0 7 t a b
i s
t y p e t a b
i s
a r r a y
( i n t e g e r
r a n g e
0 . . 5 )
o f
i n t e g e r ;
t :
t a b ;
b e g i n
t :=(2=>4, o t h e r s =>0);
p u t l i n e ( ” w y p i s a n i e
t a b l i c y : ” ) ;
f o r
i
i n t ’ f i r s t . . t ’ l a s t
l o o p
p u t ( t ( i ) ) ;
end l o o p ;
p u t l i n e ( ” T e r a z p o b i e r z e m y d a n e do
t a b l i c y ” ) ;
f o r
i
i n t ’ r a n g e l o o p
p u t ( ” p o d a j
e l e m e n t na m i e j s u ” ) ;
p u t ( i , 0 ) ;
p u t ( ”> ” ) ;
g e t ( t ( i ) ) ;
end l o o p ;
p u t l i n e ( ” w y p i s a n i e
p o b r a n e j
t a b l i c y : ” ) ;
f o r
i
i n t ’ r a n g e l o o p
p u t ( t ( i ) ) ;
end l o o p ;
end w 0 7 t a b ;
Agata Półrola Wydział Matematyki i Informatyki UŁ