Opowieść o programowaniu w Adzie



Pobieranie 0.69 Mb.
Strona12/16
Data28.04.2016
Rozmiar0.69 Mb.
1   ...   8   9   10   11   12   13   14   15   16

Tablice wielowymiarowe


Oprócz poznanych dotąd tablic jednowymiarowych istnieją również tablice wielowymiarowe. Analogicznie jak tablice jednowymiarowe przechowują one dane należące do jednego typu, bardzo podobna jest również ich deklaracja:
zmienna_tablicowa :

array (określenie_indeksu_1, ... , określenie_indeksu_n)

of typ_elementów;
(jest to anonimowy typ tablicowy), lub
type typ_tablicowy is

array (określenie_indeksu_1, ... , określenie_indeksu_n)

of typ_elementów;
Określenia_indeksów mają taką samą postać, jak w przypadku tablic jednowymiarowych, może ich być dowolnie dużo. Poszczególne indeksy nie muszą być tego samego typu. Oto przykłady deklaracji tablic wielowymiarowych:
dwa_na_trzy : array (1..2, 1..3) of integer;

type macierz_kwadratowa is array (integer range 1..2 ,

integer range 1..2 ) of float;

m1: macierz_kwadratowa;


type miesiace is (styczen, luty, marzec, kwiecien, maj czerwiec, lipiec, sierpien, wrzesien, pazdziernik, listopad, grudzien);

subtype miesiace_wakacyjne is miesiace range lipiec .. wrzesien;

type miejsca is (morze, gory, jeziora, wlasny_dom);

type wakacje is array (1996..1998, miesiace_wakacyjne) of miejsca;

wakacje_Ani, wakacje_Piotra: wakacje;
type miasta is (Warszawa, Moskwa, Praga, Londyn, Paryz);

type opady_w_miastach is array (miasta, miesiace_wakacyjne,

1987 .. 1997) of float;

pomiar : opady_w_miastach;


x: integer:=3;

type xx is array (x..x+2, 2*x..3*x, 4..x+2) of miesiace;

xxx: xx;
Do składowych tablic wielowymiarowych odwołujemy się poprzez nazwę tablicy i wartości indeksu umieszczone w nawiasach okrągłych:
m1(1,1):=12;

wakacje_Ani(1998,lipiec):=morze;


Nadawanie wartości poszczególnym składowym tablicy wielowymiarowej może odbyć się w pętli (a raczej kilku pętlach):
for i in 1..2 loop

for j in 1..2 loop

m1 (i,j) := 2;

end loop;

end loop;
for i in miasta loop

for m in miesiace_wakacyjne loop

for r in 1987 .. 1997 loop

pomiar (i, m, r) := 12.0;

end loop;

end loop;

end loop;
lub przy użyciu agregatu tablicy:
wakacje_Piotra := (1996 .. 1998 => (lipiec..wrzesien => wlasny_dom));

wakacje_Piotra := (1996..1998 => (miesiace_wakcyjne =. wlasny_dom));

wakacje_Piotra := (others => (others => wlasny_dom));
Dozwolone jest używanie zarówno notacji pozycyjnej, jak i nazywanej dla każdego z wymiarów. Można je również dowolnie ze sobą łączyć, choć notacja nazywana jest bardziej czytelna. Ograniczenia dotyczące łączenia notacji pozycyjnej i nazywanej przedstawione przy okazji tablic jednowymiarowych obowiązują nadal w obrębie pojedynczego podagregatu ujętego w nawiasy. Oto przykłady:
wakacje_Ani := ((morze, jeziora, morze), (gory, jeziora, wlasny_dom), (wlasny_dom, morze, wlasny_dom));

wakacje_Ani := ( 1996 => (morze, jeziora, morze),

1997 => (gory, jeziora, wlasny_dom),

1998 => (wlasny_dom, morze, wlasny_dom) );

wakacje_Ani :=( (lipiec => morze, sierpien => jeziora,

wrzesien => morze),

(lipiec =>gory, sierpien => jeziora,

wrzesien => wlasny_dom),

(lipiec =>wlasny_dom, sierpien => morze,

wrzesien => wlasny_dom) );

wakacje_Ani := (

1996 => (lipiec => morze, sierpien => jeziora, wrzesien =>morze), 1997 => (lipiec =>gory, sierpien => jeziora, wrzesien => wlasny_dom), 1998 =>(lipiec =>wlasny_dom, sierpien => morze,

wrzesien => wlasny_dom) );

m1 := ((0,1), (7,8));

m1 := ( 1=> (0,1), 2=> (7,8));

m1 := ( (1=>0, 2=>1), (1=>7, 2=>8));

m1 := (1=> (1=>0, 2=>1), 2=> (1=>7, 2=>8));
Z tablic wielowymiarowych nie możemy "wycinać kawałków", tak jak z tablic jednowymiarowych. Możemy jednak sprawdzać, czy tablice te są równe, czy nie (używając =, /=), o ile należą one do tego samego typu.

Dla tablic wielowymiarowych, analogicznie jak dla jednowymiarowych, określone są atrybuty 'First, 'Last, 'Length i 'Range, dotyczą jednak nie całej tablicy, lecz określonego indeksu ("wymiaru"):


subtype miesiace_wakacyjne is miesiace range lipiec..wrzesien;

type miejsca is (morze, gory, jeziora, wlasny_dom);

type wakacje is array (1996..1998, miesiace_wakacyjne) of miejsca;

wakacje_Ani: wakacje;


wakacje_Ani'first(1) -- zwróci 1996

wakacje_Ani'last(2) -- zwróci wrzesien

wakacje_Ani'range(1) -- 1996..1998

wakacje_Ani'range(2) -- lipiec..wrzesien

wakacje_Ani'length(1) -- 3

wakacje_Ani'length(2) -- 4


Jeżeli używając atrybutu pominiemy określenie wymiaru, domyślnie przyjmowane będzie jeden. Zatem wakacje_Ani'first i wakacje_Ani'first(1) zwrócą tę samą wartość.

-- program oblicza srednia ilosc dni slonecznych

-- w miesiacach letnich w poszczegolnych miastach
with ada.text_io,ada.integer_text_io;

use ada.text_io,ada.integer_text_io;


procedure pr39 is
type miasta is (Berlin,Londyn, Paryz, Warszawa, Rzym);

type miesiace is (styczen, luty, marzec, kwiecien, maj,

czerwiec, lipiec, sierpien, wrzesien,

pazdziernik, listopad, grudzien);

package mies_io is new ada.text_io.enumeration_io(miesiace);

package miasta_io is new ada.text_io.enumeration_io(miasta);

use mies_io,miasta_io;

type ilosc_dni is array

(miasta, miesiace range czerwiec..sierpien) of integer;

sloneczne : ilosc_dni;

s:integer;
begin

put("Podaj ilosc dni slonecznych w poszczegolnych miastach" &

" i miesiacach: ");

new_line(2);

for i in sloneczne'range(1) loop

for j in sloneczne'range(2) loop

put(i);put(" / ");put(j);put(" : ");

get(sloneczne(i,j));

end loop;

end loop;

new_line(3);

put("W okresie ");put(sloneczne'first(2));

put(" - ");put(sloneczne'last(2));

put_line(": ");

for i in miasta loop

s:=0;


for j in sloneczne'range(2) loop

s:=s+sloneczne(i,j);

end loop;

s:=s/sloneczne'length(2);

put("srednia ilosc dni slonecznych w miesiacu w miescie ");

put(i);


put(" wyniosla ");put(s,0);

new_line;

end loop;
new_line;

put("Wyniki zostaly zaokraglone do wartosci calkowitych.");

new_line;

end pr39;



1   ...   8   9   10   11   12   13   14   15   16


©absta.pl 2016
wyślij wiadomość

    Strona główna