Array Statici in Object Pascal
Un Array è, sostanzialmente, una struttura dati che contiene un numero di elementi dello stesso tipo, cioè contiene una sequenza di dati omogenei.
Un array può essere statico o dinamico. Nel primo caso il numero di elementi che compone l'array è fisso ed è noto al momento della sua dichiarazione, mentre nel secondo caso il numero di elementi è variabile e può essere modificato durante l'esecuzione del programma stesso.
Per poter accedere agli elementi di un array è necessario indicare l'indice dell'elemento che si vuole accedere.
In questa lezione ci concentreremo sugli array statici.
Array Statici
Un array statico è un array per il quale la dimensione, ossia il numero di elementi, è definita al momento della sua dichiarazione.
Prendiamo un esempio. Supponiamo di voler dichiarare un array che possa contenere 10 numeri interi. La sintassi da utilizzare è la seguente:
var
a: array [1..10] of integer;
In questo modo abbiamo dichiarato un array a
di 10 elementi di tipo integer
. Bisogna notare che, nel definire l'array, abbiamo specificato tra parentesi quadre due numeri, o indici, separati da due punti. Il primo numero indica l'indice del primo elemento dell'array, mentre il secondo indica l'indice dell'ultimo elemento dell'array. Pertanto, in tal caso, l'array va da 1 a 10.
In molti altri linguaggi di programmazione, tra cui C, C++ e Java, gli indici di un array di N elementi vanno sempre da 0 a N-1. In Object Pascal, invece, abbiamo la libertà di poter scegliere l'indice iniziale e quello finale.
Ad esempio, avremmo potuto definire a
in questo altro modo:
var
a: array [0..9] of integer;
In questo caso, l'array a
ha sempre 10 elementi, ma gli indici vanno da 0 a 9. Analogamente, avremmo potuto definire l'array usando indici completamente differenti come in questo caso:
var
a: array [11..20] of integer;
L'array a
continua ad avere 10 elementi, ma gli indici vanno da 11 a 20.
Accesso agli elementi di un array
Per poter accedere agli elementi di un array è necessario indicare l'indice dell'elemento che si vuole accedere. Per fare ciò, basta indicare l'indice tra parentesi quadre dopo il nome dell'array.
var
a: array [1..10] of integer;
begin
a[1] := 10;
a[2] := 20;
a[3] := 30;
a[4] := 40;
a[5] := 50;
a[6] := 60;
a[7] := 70;
a[8] := 80;
a[9] := 90;
a[10] := 100;
// ...
Nell'esempio di sopra abbiamo usato gli indici da 1 a 10 per assegnare valori agli elementi dell'array, dunque abbiamo acceduto agli elementi in scrittura.
Analogamente, per poter accedere in lettura agli elementi si usa la stessa sintassi:
for i := 1 to 10 do
writeln(a[i]);
Abbiamo usato un ciclo for
per scorrere tutti gli elementi e stamparli a schermo.
Dimensione e Limiti di un array
In generale, data la natura di un array, vengono spesso usati cicli for
per accedere agli elementi di un array. Quindi, nella pratica, si trovano spesso pezzi di codice di questo tipo:
for i := 1 to 10 do
begin
// Processa elemento a[i]
end
Il problema del codice di sopra è che abbiamo inserito l'elemento del primo e dell'ultimo elemento dell'array direttamente nel codice. Questa pratica, però, è sconsigliata perché potrebbe portare a degli errori causati dalla disattenzione oppure, se modifichiamo la dichiarazione dell'array, dobbiamo ricordarci di modificare anche il codice che accede agli elementi.
Per questo motivo, in object pascal esistono due funzioni che permettono di ricavare l'indice inferiore e quello superiore di un array: Low
e High
. Usando tali funzioni, possiamo riscrivere il codice di sopra in questo modo:
for i := Low(a) to High(a) do
begin
// Processa elemento a[i]
end
Funzioni Low
e High
Le funzioni Low
e High
permettono di ricavare i limiti rispettivamente inferiore e superiore di un array:
Low(a); // Restituisce l'indice inferiore di a
High(a); // Restituisce l'indice superiore di a
Analogamente, il linguaggio object-pascal mette a disposizione la funzione Length
che restituisce la dimensione di un array, ossia il numero di elementi.
Funzione Length
La funzione Length
restituisce il numero di elementi di un array:
Length(a); // Restituisce la dimensione di a
Esempi
Proviamo a consolidare i concetti appresi mostrando qualche esempio di utilizzo di array statici.
Somma degli elementi di un array
In questo esempio, creiamo un array di 10 elementi e calcoliamo la somma di tutti gli elementi.
program somma_array;
var
a: array [1..10] of integer;
i, somma: integer;
begin
for i := Low(a) to High(a) do
begin
write('Inserisci il valore ', i, ': ');
readln(a[i]);
end;
somma := 0;
for i := Low(a) to High(a) do
somma := somma + a[i];
writeln('La somma degli elementi dell''array è ', somma);
end.
In questo caso abbiamo usato due cicli for
combinati con le funzioni High
e Low
. Il primo ciclo serve per inserire i valori nell'array, mentre il secondo ciclo serve per calcolare la somma utilizzando la variabile somma
.
Calcolo della media degli elementi di un array
In questo esempio, creiamo un array di 10 elementi e, dopo aver chiesto all'utente di inserire i valori, calcoliamo la media degli elementi.
program media_array;
var
a: array [1..10] of double;
i: integer;
somma: double;
media: double;
begin
for i := Low(a) to High(a) do
begin
write('Inserisci il valore ', i, ': ');
readln(a[i]);
end;
somma := 0;
for i := Low(a) to High(a) do
somma := somma + a[i];
media := somma / Length(a);
writeln('La media degli elementi dell''array è ', media);
end.
Anche in questo caso abbiamo usato due cicli for
combinati con le funzioni High
e Low
. Inoltre, abbiamo usato la funzione Length
nel calcolo della media.
In Sintesi
In questa lezione abbiamo visto come creare un array statico in object pascal. Abbiamo visto come dichiarare un array e come accedere agli elementi di un array. Inoltre, abbiamo visto come utilizzare le funzioni Low
, High
e Length
per ricavare i limiti e la dimensione di un array.
Nella prossima lezione studieremo gli array statici multidimensionali.