JĘzyki programowania obiektowego wiesław Porębski Ada95 Program Wykładu



Pobieranie 187.36 Kb.
Strona5/8
Data28.04.2016
Rozmiar187.36 Kb.
1   2   3   4   5   6   7   8

2.4.Typ tablicowy


Tablica jest złożonym obiektem, zawierającym składowe tego samego typu. Definicja typu tablicowego ma następującą składnię:

type nazwa_tablicy is array(rozmiar) of typ_elementów_tablicy

gdzie rozmiar jest zakresem indeksów określającym rozmiar tablicy. Zakres tablicy może być podany bezpośrednio w jej definicji, lub przy deklarowaniu zmiennej. Jeżeli przy definiowaniu typu tablicowego nie chcemy podawać zakresu, wtedy fraza (rozmiar) ma postać (typ_indeksowy range <>). Przykłady:

type Wektor100 is array(1..100) of Float;

type Wektor is array(Integer range <>) of Float;

Dla tak zdefiniowanych typów można deklarować zmienne tablicowe (lub po prostu tablice):

V1: Wektor100; V2: Wektor(1..100);

Ponieważ w definicji typu Wektor nie podano rozmiaru tablicy, zapis V2: Wektor; byłby błędny. Odwołania do elementów tablicy mają postać zmiennych indeksowanych:

V1(1) := 10;

V2(7) := V1(1);

Zmienne tablicowe można także deklarować bez uprzedniego definiowania typu, np.

Example: array(1..10) of Integer;

Dla typu tablicowego przewidziano operacje testowania na przynależność elementu do tablicy, kwalifikacji, i jawnej konwersji. Jeżeli typ tablicowy zdefiniowano bez podawania zakresów, można także używać predefiniowanych operatorów przyrównania; do tablicy jednowymiarowej stosuje się predefiniowane operatory konkatenacji. Jeżeli elementy tablicy są dyskretne (np. typu wyliczeniowego lub całkowitego), można używać operatorów relacyjnych; jeżeli typ elementów jest Boolean, także operatorów logicznych.



Tablice wielowymiarowe deklaruje się podobnie. Możemy np. zdefiniować typ tablicowy:

type Tab1 is array(Integer range <>) of Float;

type Tab2 is array(Integer range <>) of Tab1;

lub jedną definicją:

type Tab2 is array(Integer range<>,Integer range<>) of Float;

T: Tab2(1..2,1..2);

W implementacjach tablice wielowymiarowe są reprezentowane jako kolejne wiersze.


2.4.1.Atrybuty rozmiaru tablic


Dla typu tablicowego i zmiennych tablicowych można stosować atrybuty zakresu (A oznacza typ tablicowy):

A'First oznacza dolną granicę pierwszego zakresu indeksów; typem wyniku jest odpowiedni typ indeksowy.

A'Last oznacza górną granicę pierwszego zakresu indeksów; typem wyniku jest odpowiedni typ indeksowy.

A'Last(N) oznacza górną granicę N-tego zakresu indeksów; typem wyniku jest odpowiedni typ indeksowy.

A'Range jest równoważne zakresowi A'First .. A'Last, jednak prefix A jest wartościowany tylko jeden raz.

A'Range(N) jest równoważne zakresowi A'First(N) .. A'Last(N), jednak prefix A jest wartościowany tylko jeden raz.

A'Length oznacza liczbę wartości pierwszego zakresu indeksów; typem wyniku jest liczba całkowita.

A'Length(N) oznacza liczbę wartości N-tego zakresu indeksów; typem wyniku jest liczba całkowita.

Przykłady.

Dla zmiennej tablicowej Example: array(1..10) of Integer; możemy tworzyć pętle:

for i in Example'First .. Example'Last loop

--instrukcje, np. Put(Example'Length);

end loop;

albo też

for i in Example'Range loop

--instrukcje

end loop;


2.4.2.Inicjowanie tablic


Zmiennej tablicowej można nadać wartości początkowe bezpośrednio, np:

V3: Wektor(1..3) := (1.5, 2.6, 3.7);

Jeżeli wszystkie wartości początkowe mają być jednakowe, tablicę można zainicjować instrukcją:

V3 := (others => 1.9);

Słowo kluczowe others obejmuje wszystkie pozostałe przypadki; dla tego przykładu oznacza przypisanie jednakowych wartości każdej zmiennej indeksowanej tablicy V2. Przypisanie realizuje symbol asocjacji =>. Przy inicjowaniu tablic różnymi wartościami można się także posłużyć symbolem alternatywy '|' i/lub symbolem zakresu '..', np:

V4: Wektor(0..9):=(0|9=>42.0,3..4=>451.0,others=>-473.0);

V5:Wektor(38..87):=(38..48|68..78 => 0.0,others=>0.00012);

Inicjowanie tablicy wielowymiarowej można także prowadzić na wiele sposobów, np.



T1: array(1..2,1..2) of Float :=

(1 => (1 => 1.3, 2 => 1.4), 2 => (1.5,1.6));

Tablica T1 jest inicjowana wierszami: w wyrażeniu inicjującym pierwsza jedynka z lewej (przed symbolem asocjacji) odnosi się do pierwszego wiersza; jedynka w nawiasie okrągłym oznacza T(1,1)=1.3, dwójka T(1,2)=1.4 (skojarzenia za pomoca asocjacji nazwanych). Po zamykającym nawiasie okrągłym i przecinku jest inicjowany drugi wiersz za pomocą asocjacji nienazwanych: T(2,1)=1.5, T(2,2)=1.6.

2.4.3.Typ łańcuchowy


Typem łańcuchowym nazywa się typ tablicy jednowymiarowej, w której typem elementów jest typ znakowy. W języku Ada95 mamy dwa predefiniowane typy łańcuchowe: String i Wide_String. Każdy z nich jest indeksowany wartościami predefiniowanego podtypu Positive (o wartościach z przedziału 1 ..Integer'Last). Typy te, zdefiniowane w pakiecie Standard, mają następujące definicje:

type String is array(Positive range <>) of Character;

type Wide_String is array(Positive range <>) of Wide_Character;

Dla typów łańcuchowych przewidziano operatory: konkatenacji (&) oraz operatory porządkujące (<, <=, >, >=). Przykłady deklaracji obiektów typu łańcuchowego:

Line: String(1..80);

ASK: constant String := "What is your name?";

Asterisks: String(1 .. 120) := (1 .. 120 => '*' );

Ask_Twice : String := ASK & ASK;

Podobnie jak dla tablic możemy wyznaczać wartości atrybutów, np. ASK'First = 1, ASK'Last = 18.

2.5.Typ rekordowy


Rekord jest złożonym obiektem, służącym do grupowania nazwanych elementów, które mogą być różnych typów. Elementy te nazywa się polami. Pola mogą być inicjowane w deklaracji typu, podczas deklaracji zmiennych, bądź po zadeklarowaniu zmiennych typu rekordowego. Przy inicjowaniu rekordu można używać tzw. agregatu, tj. konstrukcji, która grupuje wszystkie elementy. Dostęp do poszczególnych pól można uzyskać, rozdzielając kropką nazwę rekordu od nazwy elementu. Składnia deklaracji typu rekordowego ma postać:

type nazwa_typu is

record

--lista składowych (pól)



end record;

Dla typu rekordowego predefiniowano trzy operacje: :=, =, i /=. Przykładowy program z deklaracją recordów może mieć postać:

With Ada.Text_IO; Use Ada.Text_IO;

With Ada.Integer_Text_IO; Use Ada.Integer_Text_IO;

procedure Record1 is

type Date is

record

Day: Integer range 1..31 := 13;



Month: Integer range 1..12;

Name: String(1..10) := "Old_Date ";

end record;

Ob1, Ob2, Ob3: Date := (25,9,"Date0 ");

begin

Put(Ob1.Day); New_Line;



Put(Ob2.Day,2);New_Line;

Ob1 := (21,10,"Date1 ");

Ob2.Day := 28;

Put(Ob1.Day,3);New_Line;

Put(Ob2.Day,4);

New_Line;

Ob3 := (Month => 11,Day =>9, Name => "Some_Date ");

end Record1;



Dyskusja. Program zawiera niezbędne deklaracje importu, sygnalizowane słowami kluczowymi with i use. Pola Day i Month są typów okrojonych z typu Integer. Polom Day i Name nadano wartości domyślne. Zadeklarowane zmienne (obiekty) Ob1, Ob2, i Ob3 zostały zainicjowane wartościami (tymi samymi dla wszystkich pól) agregatu (25,9,"Date0 "). W części instrukcyjnej, oprócz znanych instrukcji Put, mamy przypisanie wartości z agregatu (21,10,"Date1 ") do zmiennej Ob1 (asocjacja pozycyjna) oraz przypisanie wartości poszczególnym polom obiektu Ob3 za pomocą asocjacji nazwanej.

Odpowiednikiem klasy w innych językach obiektowych jest umieszczony w pewnym pakiecie znakowany typ rekordowy; nazwa pochodzi stąd, że w deklaracji i definicji takiego typu występuje słowo kluczowe tagged (znacznik). Zmienne (obiekty) takiego typu nazywa się rekordami znakowanymi. Przykładowa definicja rekordowego typu znakowanego może mieć postać:



type Point is tagged

record


X,Y: Float;

end record;

Dla tak zdefiniowanego typu rekordowego można definiować typy od niego pochodne, przy czym każdy typ pochodny można rozszerzać o nowe pola. Znacznik (tag) jest dostępny poprzez atrybut 'Tag. Atrybut ten można jednak wykorzystywać tylko dla porównań, np. w relacji przyrównania pomiędzy dwoma obiektami:

P1, P2 : Point;

if P1'Tag = P2'Tag then ...

Innym ważnym atrybutem jest 'Class, używany w deklaracjach typów dla oznaczenia tzw. typu klasowego.


1   2   3   4   5   6   7   8


©absta.pl 2016
wyślij wiadomość

    Strona główna