Wstęp do programowania
wykład 4
Agata Półrola
Wydział Matematyki i Informatyki UŁ
sem. zimowy 2012/2013
Agata Półrola Wydział Matematyki i Informatyki UŁ
Jak skonstruować warunek - cd
Test przynależności
Słowo kluczowe
in
pozwala sprawdzić, czy dana wartość należy do
pewnego określonego zakresu. Zakres określamy albo
poczatek..koniec, albo używając nazwy (pod)typu.
Przykłady
if liczba>=2 and liczba<=8 then ...
można zapisać jako
if liczba in 2..8 then ...
if liczba<2 or liczba>8 then ...
można zapisać jako
if liczba not in 2..8 then ...
przykład z użyciem podtypu:
if liczba in positive then ...
Agata Półrola Wydział Matematyki i Informatyki UŁ
Priorytet operatorów logicznych
operatory and, or i xor mają jednakowy priorytet
priorytet w/w operatorów jest on niższy niż jakiegokolwiek
innego operatora, w szczególności operatorów >, <, <=, >=, =
z tego powodu w warunkach postaci a<2 and b>3 nie musimy używać nawiasów
mimo jednakowego priorytetu and, or i xor różne operatory
nie mogą być łączone w wyrażeniu bez użycia nawiasów
A or B and C jest niepoprawne, powinno mieć postać A or (B and C).
Wyrażenie A and B and C jest poprawne.
priorytet operatora not jest wyższy niż w/w pozostałych
operatorów logicznych
not A or B oznacza (not A) or B a nie not (A or B)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Typ logiczny
Jednym z predefiniowanych typów jest
typ logiczny
, czyli
boolean
,
obejmujący dwie wartości:
false
i
true
Wartości w typie logicznym są uporządkowane (false < true)
Na wartościach i zmiennych typu logicznego można wykonywać
operacje logiczne (koniunkcja, alternatywa, dyzjunkcja, negacja).
Dostępne operatory to
and
,
or
,
xor
,
not
oraz
and then
i
or
else
.
Operacje wejścia/wyjścia dla typu logicznego uzyskujemy poprzez
konkretyzację pakietu
ada.text io.enumeration io
.
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład
with ada . t e x t i o ;
use ada . t e x t i o ;
p r o c e d u r e w 0 4 l o g i k a
i s
package b o o l 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 ( b o o l e a n ) ;
p , q : b o o l e a n ;
b e g i n
p := t r u e ;
p u t ( ” w p i s z t r u e a l b o
f a l s e :
” ) ;
b o o l i o . g e t ( q ) ;
b o o l i o . p u t ( q and p ) ;
end w 0 4 l o g i k a ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Typy znakowe
Typy znakowe to:
typ
character
zawierający znaki ze zbioru znaków ISO
8859-1, czyli latin1
256 znaków (drukowalnych i niedrukowalnych)
typ
wide character
(16-bitowy) zawierający znaki ze zbioru
BMP (Basic MultiLingual Plane)
256 początkowych znaków jest takie samo jak w typie character
typ
wide wide character
(32-bitowy) zawierający znaki ze
zbioru ISO 10646
65526 początkowych znaków jest takie samo jak w typie wide character
Agata Półrola Wydział Matematyki i Informatyki UŁ
Znaki drukowalne ujmujemy w apostrofy (’a’, ’2’, ’ ’)
Łatwy dostęp do znaków z typu character umożliwia pakiet
ada.characters.latin 1
zawartość: c:/GNAT/GPL_2006/lib/gcc/pentium-mingw32msv/3.4.6/adainclude/a-chlat1.ads (lub podobna
ścieżka)
Wprowadzanie i wyprowadzanie znaków typu character,
wide character i wide wide character zapewniają pakiety
ada.text io
,
ada.wide text io
i
ada.wide wide text io
. Do
wprowadzania i wypisywania znaków służą procedury get i put.
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład
with ada . t e x t i o , ada . W i d e T e x t I O ,
ada . w i d e w i d e t e x t i o ;
use ada . t e x t i o ;
p r o c e d u r e w 0 4 z n a k i
i s
zn :
c h a r a c t e r ;
wzn :
w i d e c h a r a c t e r ;
wwzn :
w i d e w i d e c h a r a c t e r ;
b e g i n
zn := ’ a ’ ; wzn := ’ a ’ ; wwzn:= ’ a ’ ;
p u t ( zn ) ;
ada . W i d e T e x t I O . p u t ( wzn ) ;
ada . w i d e w i d e t e x t i o . p u t ( wwzn ) ;
end w 0 4 z n a k i ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład
with ada . t e x t i o , ada . c h a r a c t e r s . l a t i n 1 ;
use ada . t e x t i o ;
p r o c e d u r e w 0 4 z n a k i 2
i s
b e g i n
p u t ( ada . c h a r a c t e r s . l a t i n 1 . S e c t i o n s i g n ) ;
end w 0 4 z n a k i 2 ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład
with ada . t e x t i o ;
use ada . t e x t i o ;
p r o c e d u r e w 0 4 p o l a i s
odp :
c h a r a c t e r ;
b e g i n
p u t ( ”P−p o l e , o−o b j e t o s c ” ) ;
g e t ( odp ) ;
i f odp= ’ p ’ o r odp= ’P ’ then
p u t ( ” l i c z y m y p o l e ” ) ;
e l s i f odp= ’ o ’ o r odp= ’O ’ then
p u t ( ” l i c z y m y
o b j e t o s c ” ) ;
e l s e
p u t ( ” z l y
k l a w i s z ” ) ;
end i f ;
end w 0 4 p o l a ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Typy wyliczeniowe
Typ wyliczeniowy
to taki typ, którego elementy można wyliczyć
(wymienić)
elementy typu są uporządkowane (ustawione w określonej
kolejności)
można znaleźć element pierwszy (najmniejszy), ostatni
(największy), a dla danego elementu - poprzedzający go i
następny po nim, o ile takie istnieją
zdefiniowana jest relacja mniejszości - element mniejszy to
taki, który stoi wcześniej w deklaracji typu
każdy element ma swoją pozycję (numeracja pozycji zaczyna
się od 0)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykłady typów wyliczeniowych:
typ boolean
typy znakowe
można również definiować własne typy
Agata Półrola Wydział Matematyki i Informatyki UŁ
Definicja typu wyliczeniowego
Typ wyliczeniowy definiujemy następująco:
type nazwa typu is (element 1, element 2, ..., element n);
Elementami typu wyliczeniowego mogą być znaki (ujęte w
apostrofy) lub identyfikatory.
Przykłady
type dni is (pon, wt, sr, czw, pt, so, nie);
type cyfry rzymskie is (’I’, ’V’, ’X’, ’L’, ’C’,
’D’, ’M’);
type xxx is (r2, ’a’, cc12);
Agata Półrola Wydział Matematyki i Informatyki UŁ
Procedury umożliwiające wprowadzanie i wyprowadzanie wartości
tdanego typu wyliczeniowego uzyskujemy konkretyzując dla tego
typu pakiet
ada.text io.enumeration io
Procedura put dla typu wyliczeniowego ma parametr Set mogący
przyjmować wartość Upper Case lub Lower Case, co skutkuje
wypisywaniem wartości odpowiednio wielkimi lub małymi literami
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład
with ada . t e x t i o ;
use ada . t e x t i o ;
p r o c e d u r e w 0 4 r z y m s k i e
i s
type CRZ i s ( ’ I ’ ,
’V ’ ,
’X ’ ) ;
package R z 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 (CRZ ) ;
use R z i o ;
c : CRZ ;
b e g i n
p u t ( ” P o d a j c y f r e r z y m s k a (w a p o s t r o f a c h ) : ” ) ;
g e t ( c ) ;
p u t ( c ) ;
end w 0 4 r z y m s k i e ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład
with ada . t e x t i o ;
use ada . t e x t i o ;
p r o c e d u r e w 0 4 k o l o r y
i s
type k o l o r y
i s ( r e d , g r e e n ,
b l u e ) ;
package k 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 ( k o l o r y ) ;
use k i o ;
k :
k o l o r y ;
b e g i n
p u t ( ” P o d a j k o l o r : ” ) ; g e t ( k ) ;
p u t ( k ,
s e t=>l o w e r c a s e ) ;
end w 0 4 k o l o r y ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Klasyfikacja typów
Typy w Adzie dzielą się na proste i złożone. Wśród typów prostych
wyróżniamy typy dostępu i typy skalarne.
Typy skalarne w Adzie
typy dyskretne
typy całkowite (ze znakiem, modularne)
typy wyliczeniowe
typy rzeczywiste
typy stałoprzecinkowe (zwykłe i dziesiętne)
typy zmiennoprzecinkowe
http://en.wikibooks.org/wiki/File:Ada_types.png
Agata Półrola Wydział Matematyki i Informatyki UŁ
Atrybuty typów
Atrybuty określone dla typów rzeczywistych i dyskretnych
T - typ
T’first
i
T’last
atrybuty podające najmniejszą i największą wartość w typie T
przykłady: integer’first, natural’last, float’first, kolory’last
T’pred(·)
i
T’succ(·)
atrybuty podające poprzednią / następną wartość (w typie T)
względem elementu podanego jako argument
przykłady: integer’pred(12), natural’pred(12), float’succ(12.0),
kolory’succ(red)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Atrybuty określone dla typów rzeczywistych i dyskretnych - cd
T - typ
T’image(·)
i
T’value(·)
zwracają odpowiednio: łańcuch tekstu (napis) odpowiadający
wartości typu T podanej jako argument, oraz wartość typu T
odpowiadającą napisowi podanemu jako argument
przykłady: integer’value("12"), float’value("12.13"),
kolory’image(red)
T’base
odwołuje się do typu będącego typem bazowym dla T
przykłady: natural’base’first, positive’base’pred(0)
T’min(·, ·)
i
T’max(·, ·)
zwracają mniejszą / większą z dwóch wartości typu T
podanych jako argumenty
przykłady: integer’max(3, 12), float’min(12.1, -2.3)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Atrybuty określone tylko dla typów dyskretnych
T - typ dyskretny
T’pos(·)
i
T’val(·)
zwracają odpowiednio: pozycję na której stoi w typie T
element będący argumentem (wartość typu
universal integer), oraz wartość stojącą w typie T na
pozycji podanej jako argument
przykłady: integer’pos(12), kolory’val(1), kolory’pos(red)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład
w i t h ada . t e x t i o ;
u s e ada . t e x t i o ;
p r o c e d u r e w 0 4 c h e m i a
i s
t y p e
p i e r w
i s
(O, S , Ag ) ;
t y p e nazwy
i s
( t l e n ,
s i a r k a ,
s r e b r o ) ;
p a c k a g e k 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 ( p i e r w ) ;
u s e
k i o ;
p a c k a g e k i o 1
i s new ada . t e x t i o . E n u m e r a t i o n I O ( nazwy ) ;
u s e k i o 1 ;
k , k2 :
p i e r w ;
b e g i n
p u t ( ” P o d a j
p i e r w i a s t e k : ” ) ; g e t ( k ) ;
p u t ( nazwy ’ v a l ( p i e r w ’ p o s ( k ) ) ,
s e t=>l o w e r c a s e ) ;
n e w l i n e ;
p u t ( ” P o d a j
d r u g i
p i e r w i a s t e k : ” ) ; g e t ( k2 ) ;
p u t ( nazwy ’ v a l ( p i e r w ’ p o s ( k2 ) ) ,
s e t=>l o w e r c a s e ) ;
n e w l i n e ;
p u t ( ” w c z e s n i e j w t a b l i c y
M e n d e l e j e w a : ” ) ;
i f
k2<k t h e n p u t ( k2 ) ;
e l s e
p u t ( k ) ;
end
i f ;
end w 0 4 c h e m i a ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Instrukcja wyboru
Instrukcja wyboru
służy w Adzie do wybrania wykonania jednego z
ciągów instrukcji, przy czym wybór dokonywany jest na podstawie
wyrażenia o wartości typu dyskretnego (tzw. selektora)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Instrukcja wyboru w Adzie
case selektor is
when lista_możliwości_1 => instrukcje_1
when lista_możliwości_2 => instrukcje_2
...
when lista_możliwości_n => instrukcje_n
end case;
---------------------------------------
case selektor is
when lista_możliwości_1 => instrukcje_1
when lista_możliwości_2 => instrukcje_2
...
when lista_możliwości_n => instrukcje_n
when others
=> instrukcje
end case;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Przykład
with ada . t e x t i o ; use ada . t e x t i o ;
p r o c e d u r e w 0 4 c a s e i s
type d n i
i s ( pon , wt , s r , czw , pt , so ,
n i e ) ;
package d 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 ) ; use d i o ;
d :
d n i ;
b e g i n
p u t ( ” p o d a j d z i e n : ” ) ;
g e t ( d ) ;
c a s e d i s
when p t => p u t ( ” z a c h w i l e w o l n e ” ) ;
when s o |
n i e => p u t ( ” weekend ” ) ;
when wt . . czw => p u t ( ” s r o d e k t y g o d n i a ” ) ;
when o t h e r s => n u l l ;
end c a s e ;
end w 0 4 c a s e ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Lista możliwości może mieć postać:
pojedynczego elementu (when pon => ...)
alternatywy (when pon | wt | ndz => ...)
zakresu (when pon..pt => )
kombinacji powyższych (when pon..sr | pt => ...)
Suma list możliwości instrukcji case musi pokrywać cały zakres
wartości jakie może przyjąć selektor.
z tego względu często stosowaną konstrukcją jest
when others => null;
(we wszystkich przypadkach nie wymienionych wcześniej nie
podejmujemy żadnych działań)
when others musi być ostatnim możliwym “wyborem”
null jest instrukcją “nie rób nic” (może być użyta w dowolnym miejscu
programu)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Lista możliwości może mieć postać:
pojedynczego elementu (when pon => ...)
alternatywy (when pon | wt | ndz => ...)
zakresu (when pon..pt => )
kombinacji powyższych (when pon..sr | pt => ...)
Suma list możliwości instrukcji case musi pokrywać cały zakres
wartości jakie może przyjąć selektor.
z tego względu często stosowaną konstrukcją jest
when others => null;
(we wszystkich przypadkach nie wymienionych wcześniej nie
podejmujemy żadnych działań)
when others musi być ostatnim możliwym “wyborem”
null jest instrukcją “nie rób nic” (może być użyta w dowolnym miejscu
programu)
Agata Półrola Wydział Matematyki i Informatyki UŁ