SINTASSI E SEMANTICA DEGLI
ARRAY BIDIMENSIONALI
Array Multidimensionale: un array per il quale sono necessarie più
espressioni per accedere ad uno dei suoi elementi
Dimensione di un Array: numero di espressioni di sub-range
richieste per accedere ad un elemento dell’array.
Dichiarazione di ARRAY
ARRAY
[
Type del
sub-range
]
OF
Type
,
TYPE
Sub-range1=1..Max1
Sub-range2=1..Max2
NomeArray = ARRAY[Sub-range1,Sub-range2] OF real
Accesso all’array
identificatore
[
espressioni
dei sub-range
,
TYPE
Sub-range1=1..Max1
Sub-range2=1..Max2
NomeArray = ARRAY[Sub-range1,Sub-range2] OF real
VAR
VotoStudente, Studente,Test : integer;
Risultati: ArrayRisultati;
BEGIN
VotoStudente:=Risultati[Studente,Test]
]
TEST 
1

STUDENTI 1
TotaleStudenti=66
TotaleTest=5
2
2
3
21 25
22
27 28
.
26
30
3
4
30
5
6
7
8
9
10
21
18
26
27
.
.
21
66
.
9
75
Le righe rappresentano gli studenti.
Le colonne rappresentano i test.
Nelle caselle ci sono i risultati che ogni studente ha conseguito nei
singoli test.
CONST
MassimoStudenti=75;
MasimoTest=10;
TYPE
TipoNumStud = 1.. MassimoStudenti;
TipoNumTest = 1.. MasimoTest;
ArrayRisultati = ARRAY[TipoNumStud , TipoNumTest ] OF integer;
VAR
TotaleStudenti, TotaleTest : integer;
Risultati: ArrayRisultati;
Esempio:
Risultati[3,2]=28
lo studente 3 ha conseguito nel test 2 il risultato di 28.
Notare che non tutti gli elementi dell’array possono essere
necessariamente riempiti, per cui ad alcune caselle non è assegnato
nessun valore.
Ogni riga e ogni colonna dell’array possono essere visti come array
mono-dimensionali. Ad essi può quindi essere attribuito un significato
preciso.
Esempio:
Nel caso dell’array precedente considerando la sola riga i-esima essa
rappresenta i voti conseguiti dallo studente i-esimo nei test effettuati.
Quindi ad esempio potremmo calcolare la media relativa allo studente
i-esimo.
Analogamente la colonna k-esima rappresenta i voti conseguiti da
tutti gli studenti nel test k. Anche in questo caso potremmo fare la
media ottenuta dagli studenti per quel test.
REGOLA 1
Accedere ad un array bidimensionale con una espressione coerente
con l’ordine in cui l’array è stato definito.
Esempio: per sapere il voto che nel test 5 ha preso lo studente 3
bisogna consultare Risultati[3,5] e non Risultati[5,3]
REGOLA 2
Assegnare sempre un valore alle variabili adoperate per accedere
agli elementi di un array.
Esempio: se vogliamo scrivere i risultati in Risultati[X,Y] le
variabili X e Y devono essere state preventivamente istanziate.
FUNCTION MediaCorso(VAR Risultati: ArrayRisultati; NumTest,
TotaleStudenti: integer): real;
{calcola la media dei voti degli studenti del corso dato il test}
VAR
StudenteNo, SommaVoti: integer;
BEGIN
SommaVoti:=0;
FOR StudenteNo=1 TO TotaleStudenti DO
SommaVoti=SommaVoti+Risultati[StudenteNo,NumTest];
MediaCorso:=SommaVoti/ TotaleStudenti
END;
Così come avviene per gli array monodimensionali possiamo
utilizzare subrange dei tipi più diversi purché ordinali.
Esempio
Si vuole costruire un array in cui ogni colonna rappresenta un piccolo
paese, massimo mille abitanti, e per ogni paese vogliamo registrare il
nome degli abitanti.
L’array quindi è di tipo stringa per cui nelle caselle vuote ci sarà la
stringa nulla ‘’.
CONST
MassimoAbitanti=1000;
TYPE
TipoStringa=STRING[50];
SubrangeAbitanti=1.. MassimoAbitanti;
NomePaesi=(Nessuno, Acerra, Afragola, Capri, Casoria,
Ischia, Procida);
NomeArray: ARRAY[SubrangeAbitanti,NomePaesi] OF TipoStringa;
VAR Abitanti: NomeArray;
Acerra
1
2
Afragola
Capri
Russo T.
Annibale T.
Ischia
Esposito A.
Bianchi G.
Rossi A.
Cesare G.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Procida
Tirchio F. Esca T.
Ricco S. Orofino T.
.
.
515
Orazio P.
Diamante A. Argento T.
.
.
841
1000
.
.
Romeo A.
Rendina A.
Si noti che i dati presenti nell’array potrebbero essere organizzati
nelle maniere più diverse:
• per età del cittadino
• alfabetico
• per importanza sociale
• etc.
Noto il criterio con cui i dati sono inseriti si possono progettare
opportuni algoritmi di ricerca e ordinamento.
Altri esempi di array bidimensionali sono le scacchiere per il
gioco degli scacchi o della dama.
1 2 3 4 5 6 7 8
H T C A Q R A C T
G
P P P P P P P
P
F
X X X X X X X
X
E
D
X X X X X X X
X X X X X X X
X
X
C
X X X X X X X
X
B
A
p p p p p p p
t c a q r a c
p
t
TYPE
TipoScacchiera: ARRAY[‘A’,..’H’,’1’..’8’] OF char;
VAR
Scacchiera:TipoScacchiera;
ALGORITMI PER L’ELABORAZIONE DI ARRAY
BIDIMENSIONALI
Prodotto 

IndiceVend
A
1
D
E
18 30
18 21
30 3
26 22 28
30 26 3
3 26 27
21
28
28
28
30
26
B
2
3
21 25
22 12
27 28
.
45.
3
21
26
C
.
CONST
MaxVend=100;
TYPE
100
TipoVend=1..MaxVend;
TipoProd=‘A’..’E’;
ArrayVendite=ARRAY[TipoVend,TipoProd] OF integer;
VAR
Venduto:ArrayVendite;
TotVenditori:TipoVend;
ELABORAZIONE RIGA PER COLONNA
FOR IndiceRiga  PrimaRiga TO UltimaRiga DO
FOR IndiceColonna  PrimaColonna TO UltimaColonna DO
elabora UnArray[IndiceRiga,IndiceColonna]
ELABORAZIONE COLONNA PER RIGA
FOR IndiceColonna  PrimaColonna TO UltimaColonna DO
FOR IndiceRiga  PrimaRiga TO UltimaRiga DO
elabora UnArray[IndiceRiga,IndiceColonna]
ELABORAZIONE PER SINGOLA RIGA
Assegna un IndiceRiga
FOR IndiceColonna  PrimaColonna TO UltimaColonna DO
elabora UnArray[IndiceRiga,IndiceColonna]
ELABORAZIONE PER SINGOLA COLONNA
Assegna un IndiceColonna
FOR IndiceRiga  PrimaRiga TO UltimaRiga DO
elabora UnArray[IndiceRiga,IndiceColonna]
PROCEDURA DI LETTURA DA UN FILE E SCRITTURA IN UN ARRAY
PROCEDURE LeggiFile(VAR TotVenditori: TipoVend;
VAR Venduto: ArrayVend; VAR VendFile: text);
VAR
IndiceVend: TipoVend;
Prodotto: TipoProd ;
BEGIN
reset(VendFile);
readln(VendFile,TotVenditori);
FOR IndiceVend:=1 TO TotVenditori DO
BEGIN
FOR Prodotto:=‘A’ TO ‘E’ DO
read(VendFile, Venduto[IndiceVend, Prodotto]);
readln(VendFile)
END
CONST
END;
MaxVend=100;
6
21
22
27
3
21
26
25 18 30 21
12 18 21 28
28 30 3 28
26 22 28 28
30 26 3 30
3 26 27 26
TYPE
TipoVend=1..MaxVend;
TipoProd=‘A’..’E’;
ArrayVendite=ARRAY[TipoVend,TipoProd] OF integer;
VAR
Venduto:ArrayVendite;
TotVenditori:TipoVend;
PROCEDURA DI ELABORAZIONE COLONNA PER RIGA DI UN ARRAY
PROCEDURE ElaboraPerRiga(VAR Venduto: ArrayVend;
Prodotto 
VAR TotVenditori: TipoVend;)
IndiceVend
VAR

IndiceVend: TipoVend;
21 25
Prodotto: TipoProd ;
22 12
Somma: integer;
27 28
BEGIN
3 26
FOR Prodotto:=‘A’ TO ‘E’ DO
21 30
BEGIN
26 3
Somma:=0;
FOR IndiceVend:=1 TO TotVenditori DO
Somma:=Somma+ Venduto[IndiceVend, Prodotto];
writeln(‘Del prodotto ‘,Prodotto,’ si sono venduti ‘,Somma:1,’ pezzi.’)
END
CONST
END;
18
18
30
22
26
26
30
21
3
28
3
27
21
28
28
28
30
26
MaxVend=100;
TYPE
TipoVend=1..MaxVend;
TipoProd=‘A’..’E’;
ArrayVendite=ARRAY[TipoVend,TipoProd] OF integer;
VAR
Venduto:ArrayVendite;
TotVenditori:TipoVend;
PROGRAM ElaboraBidi(output,VendFile);
CONST
MaxVend=100;
TYPE
TipoVend=1..MaxVend;
TipoProd='A'..'E';
ArrayVendite=ARRAY[TipoVend,TipoProd] OF integer;
VAR
VendFile:text;
Venduto:ArrayVendite;
TotVenditori:TipoVend;
PROCEDURE LeggiFile(VAR TotVenditori: TipoVend; VAR Venduto:
ArrayVendite; VAR VendFile: text);
……………………………………….
PROCEDURE ElaboraPerRiga(VAR Venduto: ArrayVendite; VAR
TotVenditori: TipoVend);
……………………………………….
PROCEDURE Stampa(VAR Venduto: ArrayVendite; VAR TotVenditori:
TipoVend);
……………………………………….
BEGIN
LeggiFile(TotVenditori,Venduto,VendFile);
Stampa(Venduto,TotVenditori);
ElaboraPerRiga(Venduto,TotVenditori);
readln
END.
Turbo Pascal Version 7.0 Copyright (c) 1983,92 Borland International
A B C D E
1- 21 25 18 30 21
2- 22 12 18 21 28
3- 27 28 30 23 28
4- 23 26 22 28 28
5- 21 30 26 23 30
6- 26 30 26 27 26
Del prodotto A si sono venduti 140 pezzi.
Del prodotto B si sono venduti 151 pezzi.
Del prodotto C si sono venduti 140 pezzi.
Del prodotto D si sono venduti 152 pezzi.
Del prodotto E si sono venduti 161 pezzi.
Un caso di studio
Gestione stipendi impiegati
Supponiamo di avere N impiegati.
Ogni impiegato ha una sua paga oraria.
Gli stipendi vengono pagati ogni settimana sulla base delle ore lavorate. Nel caso
l’impiegato lavori il Sabato o la Domenica la paga raddoppia.
I dati sono così strutturati.
File con la paga oraria degli impiegati.
File settimanale contenente nel primo rigo la data in formato stringa e il numero totale
di impiegati.
Dal secondo rigo in poi contiene:
Cognome^ e le ore lavorate nei 7 giorni. Es.
Rossi^ 0.0
8.0
8.0
7.0
9.0
6.0
2.0<eoln>
Calcolare per ogni impiegato la paga della settimana, le ore totali lavorate, le ore totali
lavorate ogni giorno da tutti gli impiegati, il totale complessivo delle ore e delle paghe.
Input
Settimana: 18-24/12/2000
Output
Settimana del 18-24/12/2000
Rossi ha lavorato 24 ore. Totale busta paga : Lit. 320.000
Bianchi ha lavorato 30 ore. Totale busta paga : Lit. 530.000
……………………………
Totale ore lavorate dalle 7 unità di personale: 870
Totale costo personale: 5.334.000
File PagaOrar
120000
90000
……………...
File Or181200
18/12/2000^ 7
Rossi^ 0.0
8.0
8.0
7.0
9.0
6.0
2.0
Bianchi^ 1.0 7.0
0.0
5.0
9.0
8.0
0.0
……………...
Pseudo codice
AssegnaFileDati(FPaghe,FSett);
{leggi e apri i File dati Orxxyyzz e PagOrar}
LeggiPaghe(FPaghe,POraria);
{leggi PagOrar e metti dati nell'Array POraria}
LeggiPrimoRigo(FSett,Data,NImp); {leggi primo rigo di Orxxyyzz , Data, NImp}
LeggiSettimana(FSett,Settimana,Nomi,NImp);
{legge NImp righi di Orxxyyzz dopo il primo e mette i dati nell'Array Settimana}
CalcolaPagaSettimanale(POraria, Settimana, Nomi,NImp,Data);
{calcola le paghe e le stampa}
Rappresentazione Grafica
Fpaghe
FSett
Fpaghe
AssegnaFileDati
Data
NImp
POraria
LeggiPaghe
Settimana
Nomi
NImp
FSett
FSett
LeggiPrimoRigo
FSett
Data
LeggiRigo
POraria
Settimana
Nomi
Nome Nimp
Data
LeggiSettimana
FSett
LeggiRigo
CalcolaPagheSettimanali
PROGRAM Paghe(input,output,FPaghe,FSett);
{leggi dai File dati Orxxyyzz e PagOrar le ore lavorate e le paghe orarie
e calcola la paga per ogni impiegato}
CONST
MaxImp=25;
TYPE
TipoStringa=STRING[30];
TipoGiorni=(Nessuno, Dom,Lun,Mar,Mer,Gio,Ven,Sab);
TipoSett=ARRAY[1..MaxImp,Dom..Sab] OF real;
TipoOrar=ARRAY[1..MaxImp] OF real;
TipoNome=ARRAY[1..MaxImp] OF TipoStringa;
VAR
FPaghe, FSett:text;
Settimana:TipoSett;
POraria:TipoOrar;
NImp:integer;
Data:TipoStringa;
Nomi:TipoNome;
PROCEDURE AssegnaFileDati(VAR FPaghe1,FSett1:text);
BEGIN
END;
PROCEDURE LeggiStringa(VAR Fsett1:text;VAR Data1:TipoStringa);
BEGIN
END;
PROCEDURE LeggiPrimoRigo(VAR FSett1:text;VAR Data1:TipoStringa; VAR NImp1:integer);
BEGIN
END;
PROCEDURE LeggiPaghe(VAR FPaghe1:text;VAR POraria:TipoOrar);
BEGIN
END;
PROCEDURE LeggiSettimana(VAR FSett2:text; VAR Settimana1:TipoSett; VAR Nomi1:TipoNome;NImp1:integer);
{legge NImp righi di Orxxyyzz dopo il primo e mette i dati nell'Array Settimana}
BEGIN
END;
PROCEDURE CalcolaPagaSettimanale(VAR POraria1:TipoOrar;
VAR Settimana1:TipoSett;VAR Nomi1:TipoNome;NImp1:integer;Data1:TipoStringa);
{calcola le paghe e le stampa}
BEGIN
END;
{******************* BODY *******************************}
BEGIN
AssegnaFileDati(FPaghe,FSett);
{leggi e apri i File dati Orxxyyzz e PagOrar}
LeggiPaghe(FPaghe,POraria);
{legge PagOrar e metti dati nell'Array POraria}
LeggiPrimoRigo(FSett,Data,NImp); {legge primo rigo di Orxxyyzz , Data, NImp}
LeggiSettimana(FSett,Settimana,Nomi,NImp); {legge NImp righi di Orxxyyzz dopo il primo e mette i dati nell'Array Settimana}
CalcolaPagaSettimanale(POraria, Settimana, Nomi,NImp,Data); {calcola le paghe e le stampa}
readln
END.
ARRAY A TRE DIMENSIONI
Venezia
Napoli
31
99
Roma
Bari
91
1 2 ……………...…27…….………..52
90
Lotto:ARRAY[‘Bari’..’Venezia’,1..52,90..99] OF 1..90;
Scarica

VAR - Virgilio