Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Wstęp do programowania
wykład 9
Agata Półrola
Wydział Matematyki i Informatyki UŁ
sem. zimowy 2012/2013
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Niezawężone typy tablicowe
Istnienie
niezawężonych typów tablicowych
(ang. unconstrained
array types) umożliwia tworzenie tablic należących do jednego
typu, a równocześnie mających różne rozmiary i różne zakresy
indeksów.
Tablice niezawężone mogą byc jedno- lub wielowymiarowe.
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Definiowanie jednowymiarowego niezawężonego typu tablicowego
Niezawężony typ tablicowy dla tablic jednowymiarowych
definiujemy następująco:
type nazwa_typu is array (typ_indeksu range <>)
of typ_składowych;
Przykład
type ciag is array (integer range <>) of integer;
Rozmiar zmiennej tego typu jest określany dopiero w momencie jej
deklaracji - podajemy wtedy zakres indeksu tablicy
Przykłady
c1 :
ciag(1..100);
– ciag stu liczb
c2 :
ciag(1..3);
– ciag trzech liczb
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Definiowanie jednowymiarowego niezawężonego typu tablicowego
Niezawężony typ tablicowy dla tablic jednowymiarowych
definiujemy następująco:
type nazwa_typu is array (typ_indeksu range <>)
of typ_składowych;
Przykład
type ciag is array (integer range <>) of integer;
Rozmiar zmiennej tego typu jest określany dopiero w momencie jej
deklaracji - podajemy wtedy zakres indeksu tablicy
Przykłady
c1 :
ciag(1..100);
– ciag stu liczb
c2 :
ciag(1..3);
– ciag trzech liczb
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Przykład (Użycie tablic niezawężonych - przykład 1)
−− p r o g r a m p o b i e r a
c i ą g
l i c z b
o d ł u g o ś c i
p o d a n e j
p r z e z
u ż y t k o w n i k a
−− a n a s t ę p n i e
i n f o r m u j e
c z y t e n
c i ą g
j e s t
r o s n ą c y
c z y
n i e
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 9 t n p r o g 1
i s
t y p e
c i a g
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 ;
i l e :
n a t u r a l ;
c z y r o s n a c y : b o o l e a n :
t r u e ;
b e g i n
p u t ( ” j a k
d l u g i
c i a g
l i c z b
p o d a s z ? ” ) ;
g e t ( i l e ) ;
d e c l a r e
c :
c i a g ( 1 . . i l e ) ;
b e g i n
p u t L i n e ( ” p o d a j w y r a z y
c i a g u : ” ) ;
f o r
i
i n c ’ r a n g e l o o p
g e t ( c ( i ) ) ;
end l o o p ;
f o r
i
i n c ’ f i r s t . . c ’ l a s t −1 l o o p
i f
c ( i )>=c ( i +1) t h e n
c z y r o s n a c y := f a l s e ;
e x i t ;
end
i f ;
end l o o p ;
i f
c z y r o s n a c y=t r u e
t h e n p u t ( ” c i a g
j e s t
r o s n a c y ” ) ;
e l s e
p u t ( ” c i a g
n i e
j e s t
r o s n a c y ” ) ;
end
i f ;
end ;
end w 0 9 t n p r o g 1 ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Deklarowanie zmiennych
Zmienne o wartościach należących do niezawężonego typu
tablicowego możemy deklarować:
podając zakres indeksu, np. c1:
ciag(1..100);
tablica c1 jest indeksowana wartościami od 1 do 100 i zawiera wartości
przypadkowe
ograniczając zakres indeksu przez nadanie zmiennej tablicowej
wartości początkowej
Przykłady
type tab is array (integer range <>) of integer;
t0: tab(5..6) := (1,2);
t1: tab := (1=> 100, 2=> 200, 3=> 300);
-- indeks t1: 1..3
t2: tab := (1,2,3);
-- indeks t2: integer’first..integer’first+2
t4: tab:=t0;
-- indeks t4: taki jak indeks t0 czyli 5..6
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Przykład (Użycie tablic niezawężonych - przykład 2)
−− p r o g r a m t w o r z y
t a b l i c ę
z a w i e r a j ą c ą
w s z y s t k i e
l i c z b y
d o d a t n i e
−− z t a b l i c y
p o d a n e j
p r z e z
u ż y t k o w n i k a
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 9 t n p r o g 2
i s
t y p e
c i a g
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 ;
i l e , i l e D o d a t n i c h :
n a t u r a l ;
b e g i n
p u t ( ” j a k
d l u g i
c i a g
l i c z b
p o d a s z ? ” ) ;
g e t ( i l e ) ;
d e c l a r e
c :
c i a g ( 1 . . i l e ) ;
b e g i n
p u t L i n e ( ” p o d a j w y r a z y
c i a g u : ” ) ;
f o r
i
i n c ’ r a n g e l o o p
g e t ( c ( i ) ) ;
end l o o p ;
i l e D o d a t n i c h : = 0 ;
−− z l i c z e n i e
l i c z b
d o d a t n i c h w t a b l i c y
w e j s c i o w e j
f o r
i
i n c ’ r a n g e l o o p
i f
c ( i )>0 t h e n
i l e D o d a t n i c h := i l e D o d a t n i c h +1; end
i f ;
end l o o p ;
d e c l a r e
−− u t w o r z e n i e
t a b l i c y
w y n i k o w e j o d p o w i e d n i e g o
r o z m i a r u
tabDod :
c i a g ( 1 . . i l e D o d a t n i c h ) ;
k : i n t e g e r ;
b e g i n
k : = 1 ;
−− p r z e p i s a n i e
l i c z b
d o d a t n i c h z
t a b l i c y
w e j s c i o w e j do w y n i k o w e j
f o r
i
i n c ’ r a n g e l o o p
i f
c ( i )>0 t h e n
tabDod ( k ) : = c ( i ) ; k := k +1; end
i f ;
end l o o p ;
p u t l i n e ( ” t a b l i c a
l i c z b
d o d a t n i c h
u t w o r z o n a na p o d s t a w i e
t a b l i c y
w e j s c i o w e j : ” ) ;
f o r
j
i n tabDod ’ r a n g e l o o p p u t ( tabDod ( j ) ,
2 ) ;
p u t ( ” ” ) ;
end l o o p ;
i f
c=tabDod t h e n p u t ( ” p r z e p i s a n o
w s z y s t k o ” ) ;
end
i f ;
end ;
end ;
end w 0 9 t n p r o g 2 ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Podtypy typów niezawężonych
Możliwe jest definiowanie
podtypów
niezawężonego typu
tablicowego. Podtyp nie jest już niezawężony - obejmuje tablice
mające konkretny rozmiar.
Przykład
type ciag is array (integer range <>) of integer;
subtype ciag100 is ciag(1..100);
c1, c2: ciag100;
Każda zmienna zadeklarowana jako należąca do niezawężonego
typu tablicowego należy właściwie do pewnego jego podtypu
określonego poprzez dane ograniczenie zakresu indeksu
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Podtypy typów niezawężonych
Możliwe jest definiowanie
podtypów
niezawężonego typu
tablicowego. Podtyp nie jest już niezawężony - obejmuje tablice
mające konkretny rozmiar.
Przykład
type ciag is array (integer range <>) of integer;
subtype ciag100 is ciag(1..100);
c1, c2: ciag100;
Każda zmienna zadeklarowana jako należąca do niezawężonego
typu tablicowego należy właściwie do pewnego jego podtypu
określonego poprzez dane ograniczenie zakresu indeksu
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Przesuwanie agregatów (slicing)
Przypisanie zmiennej tablicowej agregatu (czyli nadanie jej wartości
przy użyciu agregatu) może spowodować niejawną konwersję tego
agregatu do odpowiedniego podtypu (czyli zmianę zakresu indeksu
w tym agregacie - jest to tzw.
przesuwanie agregatów
(slicing)).
Zjawisko to nie występuje np. w przypadku agregatów
zawierających słowo others
bardziej szczegółowe wyjaśnienie i przykłady - na następnym slajdzie
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Przesuwanie agregatów (slicing)
Przypisanie zmiennej tablicowej agregatu (czyli nadanie jej wartości
przy użyciu agregatu) może spowodować niejawną konwersję tego
agregatu do odpowiedniego podtypu (czyli zmianę zakresu indeksu
w tym agregacie - jest to tzw.
przesuwanie agregatów
(slicing)).
Zjawisko to nie występuje np. w przypadku agregatów
zawierających słowo others
bardziej szczegółowe wyjaśnienie i przykłady - na następnym slajdzie
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Przykłady (Przesuwanie agregatów)
type tab is array (positive range <>) of integer;
t: tab(1..5);
t:=(10..11=>1, 12..14=>4);
– agregat przesuwa sie tak, ze t(1) i t(2) maja wartosc 1
– pozostale - wartosc 4
t:=(5..6=>9, others=>0);
– nie ma przesuniecia
– przy wykonaniu nastapiloby przekroczenie zakresu
– (proba odwolania do t(6))
t:=(3..5=>9, others=>0);
– nie ma przesuniecia - t(3) do t(5) maja wartosc 9
– pozostale - wartosc 0
t:=(8,8,8,others=>0);
– nie ma przesuniecia - t(1) do t(3) maja wartosc 8,
– pozostale - wartosc 0
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Jednowymiarowe niezawężone typy tablicowe - atrybuty
atrybuty
’first
,
’last
,
’range
i
’length
działają w
standardowy sposób, tzn. zwracają odpowiednio najmniejszy
indeks, największy indeks, zakres indeksu i długość tablicy do
której się odnoszą
(dokładniej: zwracają odpowiednie wartości dla podtypu
typu niezawężonego do którego należy rozpatrywana tablica)
Przykład
type tab is array (integer range <>) of integer;
t0: tab(5..6) := (1,2);
put(t0’first);
– wypisze 5
put(t0’last);
–
wypisze 6
for K in t0’range loop ... end loop;
– K przebiega zakres 5..6
put(t0’length);
– wypisze 2
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Jednowymiarowe niezawężone typy tablicowe - operacje
operacje logiczne not, and, or, xor są zdefiniowane tylko dla
jednowymiarowych tablic o składowych typu boolean; tablice
muszą być tego samego typu (niezawężonego - mogą należeć
do jego różnych podtypów) i być tej samej długości
Przykład
type tabb is array (integer range <>) of boolean;
t1: tabb(1..3) :=(others => false);
t2: tabb(0..2) := (false, true, true);
t3: tabb := t1 and t2;
konkatenacja (&) jest zdefiniowana tylko dla tablic tego
samego typu (niezawężonego)
Przykład
t4:
tabb := t3 & t1 ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Jednowymiarowe niezawężone typy tablicowe - operacje
z tablic jednowymiarowych można “wycinać” fragmenty -
podtablice
Przykład
type ciag is array (integer range <>) of integer;
t1: ciag(1..10) := (others=> 0);
t2: ciag(1..5) := (others=>2);
t2(1..3) := t2(2..4);
operacja przypisania (:=) umożliwia przypisywanie dla tablic
tego samego typu i rozmiaru
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Jednowymiarowe niezawężone typy tablicowe - operacje
operatory = i /= umożliwiają porównywanie tablic tego
samego typu (niezawężonego); dwie tablice są równe jeśli
mają tę samą liczbę składowych, a ich odpowiednie składowe
są jednakowe (zakres indeksu nie ma znaczenia)
Przykład
type tabb is array (integer range <>) of boolean;
t1: tabb(1..3) :=(others => false);
t2: tabb(0..2) := (others => false);
if t1=t2 then put(" rowne"); else put(" rozne"); end if;
– wypisze ’rowne’
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Jednowymiarowe niezawężone typy tablicowe - operacje
relacje <, <=, >=, > określone są dla jednowymiarowych tablic
(niezawężonych) o składowych typu dyskretnego
wykonywane jest porównywanie kolejnych elementów, “od
lewej do prawej”, do momentu znalezienia składowych o
różnych wartościach lub do zakończenia którejś tablicy
tablica “mniejsza” to tablica krótsza lub taka, w której
pierwszy różniący się element jest mniejszy
Przykłady
type tab is array (integer range <>) of integer;
t1: tab(1..20):=(others=>0);
t2: tab(1..3) :=(others=>0);
t3: tab(1..3) := (1,2,3);
if t1<t2 then put("t1 mniejsza"); else put("t1 nie mniejsza");
end if;
– wypisze ’t1 nie mniejsza’
if t2<t3 then put("t2 mniejsza"); else put("t2 nie mniejsza");
end if;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Jednowymiarowe niezawężone typy tablicowe - operacje
test przynależności do podtypu (in): testowana tablica i
podtyp muszą należeć do tego samego typu bazowego
(niezawężonego)
Przykład
type tab is array (integer range <>) of integer;
t1: tab(1..20):=(others=>0);
t2: tab(1..3) :=(others=>0);
t3: tab(1..3) := (1,2,3);
t4: tab(0..19);
subtype ttt is tab(1..20);
put(t3 in ttt);
– wypisze FALSE
put(t1 in ttt);
– wypisze TRUE
put(t4 in ttt);
– wypisze FALSE
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Przykład (Tablice niezawężone - podtypy, operacje)
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
p r 4 4 c o n u n c o n
i s
t y p e t y p 1
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 ;
s u b t y p e t a b 1
i s
t y p 1 ( 1 . . 1 0 ) ;
s u b t y p e t a b 2
i s
t y p 1 ( 1 . . 5 ) ;
t 1 : t a b 1 : = ( o t h e r s =>0);
t 2 : t a b 2 : = ( o t h e r s =>2);
b e g i n
t 1 ( 1 ) : = t 2 ( 1 ) ;
t 1 ( 1 . . 3 ) : = t 2 ( 1 . . 3 ) ;
i f
t 1 ( 1 . . 5 ) = t 2 ( 1 . . 5 )
t h e n
p u t ( ” p o c z a t k o w e
k a w a l k i
t a b l i c
s a r o w n e ” ) ;
end
i f ;
i f
t 1=t 2 t h e n
p u t ( ” c a l e
t a b l i c e
s a r o w n e ” ) ;
end
i f ;
i f
t 1 ( 1 . . 5 ) > t 2 ( 1 . . 5 )
t h e n
p u t ( ” p o c z a t k o w y k a w a l e k 1− s z e j
t a b l i c y
j e s t
w i e k s z y ” ) ;
end
i f ;
i f
t 1>t 2 t h e n
p u t ( ” c a l e − p i e r w s z a
w i e k s z a ” ) ;
end
i f ;
end p r 4 4 c o n u n c o n ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Konwersja tablic
Tablicę można przekonwertować do innego typu tylko w przypadku,
gdy obie tablice mają ten sam rozmiar, typ elementów, typ indeksu
i długość.
Konwersja:
nazwa typu docelowego(konwertowana zmienna)
(jak w przykładzie poniżej)
Przykład
type tab is array (integer range <>) of integer;
t1: tab(1..20):=(others=>0);
type tab2 is array(integer range <>) of integer;
t21: tab2(100..119);
t21:=t1;
– niewykonalne - niezgodość typów
t21:=
tab2(t1)
;
– wykonalne dzięki konwersji tablicy t1 do typu tab2
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Wielowymiarowe tablice niezawężone
Niezawężone typy tablicowe mogą być rownież wielowymiarowe.
Brak zawężenia musi występować dla wszystkich wymiarów
(wszystkich indeksów)
Przykład
poprawne:
type macierz is array (positive range <>, positive range <>)
of integer;
m: macierz(1..2, 1..3);
niepoprawne:
type ZlyTyp is array (positive range <>, positive range 1..10)
of integer;
Atrybuty - jak w przypadku tablic niezawężonych
Operacje - dozwolone jest podstawianie, porównywanie = i /=,
konwersja i test przynależności
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Wielowymiarowe tablice niezawężone
Niezawężone typy tablicowe mogą być rownież wielowymiarowe.
Brak zawężenia musi występować dla wszystkich wymiarów
(wszystkich indeksów)
Przykład
poprawne:
type macierz is array (positive range <>, positive range <>)
of integer;
m: macierz(1..2, 1..3);
niepoprawne:
type ZlyTyp is array (positive range <>, positive range 1..10)
of integer;
Atrybuty - jak w przypadku tablic niezawężonych
Operacje - dozwolone jest podstawianie, porównywanie = i /=,
konwersja i test przynależności
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Przykład (Wielowymiarowe tablice niezawężone - cz.1 programu )
−− p r o g r a m o b l i c z a sumę m a c i e r z y
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 w09 tabnww
i s
t y p e
m a c i e r z
i s
a r r a y
( i n t e g e r
r a n g e <>, i n t e g e r
r a n g e <>) o f
i n t e g e r ;
w , k :
n a t u r a l ;
b e g i n
p u t ( ” p o d a j
l i c z b e
w i e r s z y
i
l i c z b e
kolumn m a c i e r z y ” ) ;
g e t (w ) ;
g e t ( k ) ;
d e c l a r e
m1 , m2 , suma :
m a c i e r z ( 1 . . w ,
1 . . k ) ;
b e g i n
p u t l i n e ( ” wprowadz p i e r w s z a
m a c i e r z : ” ) ;
f o r
i
i n m1 ’ r a n g e ( 1 )
l o o p
f o r
j
i n m1 ’ r a n g e ( 2 )
l o o p
p u t ( ”M ” ) ;
p u t ( i , 0 ) ;
p u t ( ” , ” ) ; p u t ( j , 0 ) ;
Put ( ” > ” ) ;
g e t (m1( i , j ) ) ;
end l o o p ;
end l o o p ;
p u t l i n e ( ” wprowadz d r u g a m a c i e r z : ” ) ;
f o r
i
i n m2 ’ r a n g e ( 1 )
l o o p
f o r
j
i n m2 ’ r a n g e ( 2 )
l o o p
p u t ( ”M ” ) ;
p u t ( i , 0 ) ;
p u t ( ” , ” ) ; p u t ( j , 0 ) ;
Put ( ” > ” ) ;
g e t (m2( i , j ) ) ;
end l o o p ;
end l o o p ;
f o r
i
i n suma ’ r a n g e ( 1 )
l o o p
f o r
j
i n suma ’ r a n g e ( 2 )
l o o p
suma ( i , j ) : =m1( i , j )+m2( i , j ) ;
end l o o p ;
end l o o p ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Przykład (Wielowymiarowe tablice niezawężone - cd programu)
f o r
i
i n suma ’ r a n g e ( 1 )
l o o p
f o r
j
i n m1 ’ r a n g e ( 2 )
l o o p
p u t (m1( i , j ) , 0 ) ;
p u t ( ” ” ) ;
end l o o p ;
i f
i /= k/2+1 t h e n p u t ( ”
” ) ;
e l s e
p u t ( ”
+
” ) ;
end
i f ;
f o r
j
i n m2 ’ r a n g e ( 2 )
l o o p
p u t (m2( i , j ) , 0 ) ;
p u t ( ” ” ) ;
end l o o p ;
i f
i /= k/2+1 t h e n p u t ( ”
” ) ;
e l s e
p u t ( ”
=
” ) ;
end
i f ;
f o r
j
i n suma ’ r a n g e ( 2 )
l o o p
p u t ( suma ( i , j ) , 0 ) ;
p u t ( ” ” ) ;
end l o o p ;
n e w l i n e ;
end l o o p ;
end ;
end w09 tabnww ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Typ łańcuchowy
Rodzaje typów łańcuchowych
Typ łańcuchowy
(napisowy) umożliwia przechowywanie ciągów
znaków.
Istnieje kilka typów łańcuchowych, różniących się zestawem
znaków które mogą wystąpić w napisie. Dostępne typy to:
typ string
napisy skłądające się ze znaków z typu Character
typ wide string
napisy składające się ze znaków z typu Wide Character
typ wide wide string
napisy składające się ze znaków z typu Wide Wide Character
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Typ łańcuchowy
Rodzaje typów łańcuchowych
Typ łańcuchowy
(napisowy) umożliwia przechowywanie ciągów
znaków.
Istnieje kilka typów łańcuchowych, różniących się zestawem
znaków które mogą wystąpić w napisie. Dostępne typy to:
typ string
napisy skłądające się ze znaków z typu Character
typ wide string
napisy składające się ze znaków z typu Wide Character
typ wide wide string
napisy składające się ze znaków z typu Wide Wide Character
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Jak zdefiniowano typy łańcuchowe
Definicje typów łańcuchowych są częścią języka; znajdują się w
pakiecie Standard
(czyli nie definiujemy ich w swoich programach)
Definicje poszczególnych typów:
type string is array (positive range <>) of Character;
type wide string is array (positive range <>) of Wide Character;
type wide wide string is
array (positive range <>) of Wide Wide Character;
Wszystkie te typy to
niezawężone typy tablicowe
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Wartości typu łańcuchowego
Wartość typu łańcuchowego to tablica znaków, ale stosuje się
też notację uproszczoną, biorąc cały napis w cudzysłowy.
Przykład (Równoważne przypisania)
napis: string(1..4):=(others => ’ ’);
napis: string(1..4):="
";
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Deklarowanie zmiennych
Zmienne należące do typow łańcuchowych deklarujemy tak samo
jak w przypadku innych niezawężonych typów tablicowych:
podając zakres indeksu
(np.
imie:
string(1..15);
)
ograniczając zakres indeksu przez nadanie zmiennej wartości
początkowej:
używając agregatu tablicy
(np. imie:
string :=(’P’, ’i’, ’o’, ’t’, ’r’);
używając ciągu znaków w cudzysłowach
(np. imie:
string := "Piotr";)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Odwołania do elementów łańcucha
Do poszczególnych elementów łańcucha odwołujemy się
analogicznie jak do elementów tablic:
odwołanie do pojedynczego elementu (znaku):
napis(2):=’a’;
odwołanie do podłańcucha:
napis(2..3) := "xx";
napis(1..1) := "a";
uwaga: napis(1) to wartość typu Character (lub innego odpowiedniego typu
znakowego jeśli typ łańcucha jest inny niż string). natomiast napis(1..1) to
łańcuch odpowiedniego typu, mający długość 1
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Atrybuty zdefiniowane dla typów łańcuchowych
Dla typów łańcuchowych zdefiniowane są:
grupa atrybutów analogicznych jak dla innych tablic:
zmienna łańcuchowa’first
(indeks pierwszego elementu
łańcucha)
zmienna łańcuchowa’last
(indeks ostatniego elementu
łańcucha)
zmienna łańcuchowa’range
(zakres indeksu zmiennej
łańcuchowej)
zmienna łańcuchowa’length
(długość łańcucha)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Atrybuty - cd
inne atrybuty związane z typami łańcuchowymi:
T’image(·)
, gdzie T jest pewnym typem, zamienia element
typu T podany w nawiasie (będący argumentem) na
odpowiadający mu łańcuch
Przykład
integer’image(12) to napis ”12”.
T’value(·)
zamienia łańcuch będący argumentem na
reprezentowaną przez ten łańcuch wartość typu T
Przykład
integer’value("12") to liczba 12
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Przykład (Użycie atrybutów dla typu napisowego - przykład 1)
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 2 t e s t y 2
i s
n a p i s :
s t r i n g := ” on ma 20
l a t ” ;
w i e k :
i n t e g e r ;
b e g i n
p u t l i n e ( n a p i s ) ;
w i e k := i n t e g e r ’ v a l u e ( n a p i s ( n a p i s ’ f i r s t + 6 . . n a p i s ’ f i r s t + 7 ) ) ;
p u t ( ” w i e k : ” ) ;
p u t ( w i e k ) ;
n e w l i n e ;
p u t ( ” r o k
u r o d z e n i a : ” ) ;
p u t (2012 − w i e k ) ;
end w 1 2 t e s t y 2 ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Przykład (Użycie atrybutów dla typu napisowego - przykład 2)
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 1 2 t e s t y 1
i s
t y p e
d n i
i s
( p o n i e d z i a l e k ,
w t o r e k ,
s r o d a ) ;
i m i e :
s t r i n g := ” K l e m e n t y n a ” ;
x :
i n t e g e r : = 2 ;
y : f l o a t : = − 3 . 0 2 3 ;
d :
d n i := w t o r e k ;
b e g i n
f o r
i
i n
i m i e ’ r a n g e l o o p
p u t ( ’ ∗ ’ ) ;
p u t ( i m i e ( i ) ) ;
end l o o p ;
n e w l i n e ( 2 ) ;
p u t ( ” l i c z b a : ” ) ;
p u t l i n e ( i n t e g e r ’ i m a g e ( x ) ) ;
p u t ( ” l i c z b a 2 : ” ) ;
p u t l i n e ( f l o a t ’ i m a g e ( y ) ) ;
p u t ( ” d z i e n : ” ) ;
p u t l i n e ( d n i ’ i m a g e ( d ) ) ;
end w 1 2 t e s t y 1 ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Porónywanie łańcuchów
Łańcuchy (tego samego typu) można porównywać za pomocą
operatorów <, <=, >, >=, =, /=.
operacja jest wykonywana dla łańcuchów o jednakowej i o
różnej długości.
porównywane są kolejne znaki łańcuchów (łańcuch jest
mniejszy jeśli pierwszy różniący go znak jest mniejszy lub jeśli
jest podłańcuchem drugiego)
prawdziwe są zależności:
string’("Jan")<= string’("Jaroslaw")
wide_string’("Ewa")>wide_string’("Anna")
string’("Jan") < string’("Janusz")
dla uniknięcia niejednoznaczności użyto mechanizmu określającego jakiego typu
jest dany łańcuch
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Łączenie łańcuchów (konkatenacja)
Łączenie łańcuchów umożliwia operator &
można łączyć ze sobą łańcuchy i pojedyncze znaki
wynik konkatenacji może być przypisany tylko zmiennej
łańcuchowej odpowiedniej długośći
Przykłady (Przykłady użycia konkatenacji)
a: string(1..3) := "Jan";
b: string(1..5) := "Nowak";
c: string(1..9) := a & ’ ’ & b;
d: string := b & ’_’ & a;
x: integer:=20;
put_line(c & " ma " & integer’image(x) & " lat");
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Przykład (Jedno z zastosowań konkatenacji)
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 2 t e s t y 3
i s
a :
i n t e g e r ;
b e g i n
p u t ( ” p o d a j bok k w a d r a t u ” ) ;
g e t ( a ) ;
p u t ( ” p o l e
k w a d r a t u o podanym boku w y n o s i ” &
i n t e g e r ’ i m a g e ( a ∗ a ) & ” j e d n o s t e k
k w a d r a t o w y c h ” ) ;
end w 1 2 t e s t y 3 ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Operacje wejścia/wyjścia
Operacje wejścia/wyjścia dla typow łańcuchowych są
zdefiniowane w pakietach ada.text io (dla typu string) i
jego odpowiednikach dla pozostałych zestawow znaków
(ada.wide text io itd).
do wypisywania łańcuchów służą procedury
put
i
put line
do pobierania łańcuchów służą procedury
get
i
get line
Przykład
s: string(1..100);
n: natural;
get(s);
get_line(s,n);
get
wymaga podania ciągu znaków o długości takiej jak długość wczytywanej zmiennej;
get line
pozwala na podanie łańcucha krótszego niż zadeklarowany; liczba wprowadzonych
znaków jest zapamiętywana w zmiennej będącej drugim parametrem.
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Operacje wejścia/wyjścia - długie teksty
jeśli tekstu do wypisania nie można zmieścić w jednej linii, można
użyć operatora konkatenacji
Przykład
put("To jest dluuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu" &
"uuuuuuuuuuuuuuuuuuuuuuuuuuugi " &
"naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" &
"aaaaaaaaaaaaaaaaaaaaaaaaaapis" &
" a moze jeszcze dluzszy albo jeszcze dluzszy albo jeszcze " &
"jeszcze dluzszy albo " &
"jeszcze jeszcze dluzszy albo jeszcze jeszcze jeszcze " &
"dluzszy napis");
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Ważne:
wypełnianie końcówek łańcucha spacjami przy pobieraniu go
używanie procedury skip line (z pakietu ada.text io)
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Przykład (Pobieranie i wypisywanie danych pięciu osób)
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 2 i m i e
i s
i m i e :
s t r i n g ( 1 . . 5 ) ;
n a z w i s k o :
s t r i n g ( 1 . . 3 0 ) ;
r o k :
i n t e g e r ;
n ,m:
n a t u r a l ;
b e g i n
f o r
i
i n
1 . . 5
l o o p
p u t ( ” p o d a j
r o k
u r o d z e n i a : ” ) ;
g e t ( r o k ) ;
s k i p l i n e ;
i m i e : = ( o t h e r s=> ’
’ ) ;
n a z w i s k o : = ( o t h e r s=> ’
’ ) ;
p u t ( ” p o d a j
i m i e : ” ) ;
g e t l i n e ( i m i e , n ) ;
−− a l t e r n a t y w a :
i m i e ( n + 1 . . i m i e ’ l a s t ) : = ( o t h e r s =>’
’ ) ;
i f
n=i m i e ’ l e n g t h
t h e n
s k i p l i n e ; end
i f ;
p u t ( ” p o d a j
n a z w i s k o : ” ) ;
g e t l i n e ( n a z w i s k o ,m) ;
i f m=n a z w i s k o ’ l e n g t h
t h e n
s k i p l i n e ; end
i f ;
n e w l i n e ( 2 ) ;
p u t l i n e ( ” Osoba : ” ) ;
p u t ( ” i m i e : ” ) ;
p u t l i n e ( i m i e ) ;
p u t ( ” n a z w i s k o : ” ) ; p u t ( n a z w i s k o ) ;
n e w l i n e ( 2 ) ;
end l o o p ;
end w 1 2 i m i e ;
Agata Półrola Wydział Matematyki i Informatyki UŁ
Tablice niezawężone jednowymiarowe
Tablice niezawężone wielowymiarowe
Uwagi do programu z poprzedniego slajdu
użycie skip line po wprowadzeniu liczby powoduje usunięcie z bufora
klawiatury “entera” (znaku końca linii), pozostałego w nim po podaniu liczby.
Bez tego nie można byłoby wprowadzić imienia wczytywanej osoby (program
zadziałałby tak, jakby po komunikacie “podaj imie” użytkownik wcisnął enter -
przy czym enter byłby tu od razu wzięty z bufora)
użycie imie:=(others=>’ ’) lub alternatywnie wypełnienie końcówki zmiennej
imie spacjami po podaniu “właściwej” wartości
(imie(n+1..imie’last):=(others=>’ ’)) zapobiega powstawaniu “imion” w
kórych końcówka pochodzi z imienia poprzedniej osoby (procedura get line
powoduje wypełnienie n poczatkowych znaków napisu, pozostałe nie są
modyfikowane)
polecenie if n=imie’length then skip line; end if; zapewnia
wyczyszczenie bufora klawiatury ze znaków które zostały podane po
komunikacie “podaj imie”, ale nie zmieściły się już w zmiennej imie (co
następuje tutaj gdy podane imię miało 5 znaków lub więcej). Bez tego
pozostały w buforze znak końca linii (przy imieniu 5-znakowym) lub tekst i znak
końca linii (przy imieniu dłuższym niż 5 znaków) byłyby wykorzystane przez
następną procedurę pobierającą dane (tu get line dla nazwiska osoby).
Agata Półrola Wydział Matematyki i Informatyki UŁ