1213z wdprog ww09

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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;

– wypisze ’t2 mniejsza’

Agata Półrola Wydział Matematyki i Informatyki UŁ

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

Łą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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania

background image

Tablice niezawężone jednowymiarowe

Tablice niezawężone wielowymiarowe

Typ łańcuchowy

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Ł

Wstęp do programowania


Document Outline


Wyszukiwarka

Podobne podstrony:
1213z wdprog ww04
1213z wdprog ww02
1213z wdprog ww07
1213z wdprog ww11
1213z wdprog ww08
1213z wdprog ww12
1213z wdprog ww10
1213z wdprog ww13
1213z wdprog ww06
1213z wdprog ww14
1213z wdprog ww05
1213z wdprog ww03
1213z wdprog ww01
1011z wdprog ww09
1213z wdprog ww02

więcej podobnych podstron