La notazione funzionale si è rivelata molto flessibile per il riutilizzo del codice della funzione Max2(X, Y), infatti
Max3:= Max2(Max2(X1, X2), X3); Max4:= Max2(Max2(Max2(X1, X2), X3), X4); ... MaxN:=(Max2(...(Max2(Max2(X1, X2), X3), ...), XN);
ma non comoda se bisogna riscrivere l’espressione a seconda del numero di variabili.
L’algoritmo sottostante è invece
cioè iterativo…
Un altro esempio è
Media2:=(X1 + X2)/2; Media3:=(X1 + X2 + X3)/3; ... MediaN:=(X1 + X2 + ... + XN)/N;
Sarebbe utile poter realizzare del codice che lavorasse con un pacchetto, di dimensione a piacere ma ragionevole, di variabili:
function MaxV(P: "Pacchetto di Reali"): Real;
Il Pascal permette di dichiarare vettori di dimensione costante, cioè la memoria allocata rimane costante anche se si utilizza solo una parte della capacità del vettore.
Una dichiarazione di vettore è la seguente
Var V: Array[1..10] of Real;
dove
- V, il nome della variabile definita subito dopo i due punti
- Array, indica che si tratta di un vettore (sequenza, pacchetto, raggruppamento, blocco) di elementi più semplici
- [ ], le parentesi quadre indicano l’elenco dei soprannomi per ciascun elemento nel vettore, in modo da poterli distinguere univocamente
- 1..10, il primo e l’ultimo soprannome e tutti quelli compresi nell’intervallo da 1 a 10 (..)
- of, (seguito da un tipo: real, integer, boolean, …) indica il tipo comune degli elementi raggruppati nel vettore
Il primo indice (soprannome) è, quasi sempre, 1 mentre l’ultimo indice è un intero qualsiasi maggiore del primo (10), di conseguenza da quest’ultimo dipende la dimensione del vettore.
Conviene dichiarare la dimensione, una volta per tutte, all’inizio del programma con
Const DIM = 10;
rendendo più semplice la modificabilità del codice.
I singoli elementi del vettore sono raggiungibili per operazioni di lettura o scrittura con una scrittura del tipo V[E] dove E è una espressione che dà come risultato un valore compreso nell’intervallo di definizione del vettore.
Esempi
V[1]:=V[2]; V[5]:=3*V[10]; ReadLn(V[i]); Write(V[3*i]:10:5);
i e 3*i sono espressioni intere con valore nell’intervallo [1..DIM].
I vettori diventano a tutti gli effetti delle risorse (come variabili, costanti) e quindi compariranno anche come parametri per eventuali sottoprogrammi, allora la dichiarazione di funzione precedente potrebbe essere del tipo
Function MaxN(V: Array[1..DIM] of Real): Real;
ma il TurboPascal non accetta dichiarazioni di tipo complesso nell’elenco dei parametri quindi dobbiamo riassumere con una dichiarazione di tipo
Type Vettore: Array[1..DIM] of Real;
(il nome scelto è libero…) e la dichiarazione del vettore diventa
Var V: Vettore;
e la funzione diventa
Function MaxV(V: Vettore): Real;