Home • ECDL • Algoritmi • Java • Basi di dati • Seconda prova • Eccetera • Cerca nel sito

I vettori

Precedente
SUPERIORE
Successiva

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

(X1, X2)? --> M
(M, X2)? --> M
(M, X3)? --> M
(M, X4)? --> M
...

cioè iterativo...

Un altro esempio è

Media2:=(X1 + X2)/2;
Media3:=(X1 + X2 + X3)/3;
...
MediaN:=(X1 + X2 + ... + XN)/N;

Sarebbe molto utile poter realizzare del codice che lavorasse con un "pacchetto", di dimensione a piacere ma "ragionevole", di variabili:

function MaxN(P: "Pacchetto di Reali"): Real;

Il TurboPascal permette di dichiarare vettori di dimensione costante, cioè la memoria allocata rimane costante anche se si utilizza solo una parte della capacità del vettore. Inoltre una volta fissata la dimensione con una dichiarazione non è possibile utilizzare più delle caselle effettivamente disponibili. Se X è un pacchetto di dieci Real allora ha una forma del tipo

X = 1.1 1.23 99.0 .... .... .... .... .... .... ....
    1   2    3    4    5    6    7    8    9    10

Ci sono 10 posti disponibili, al massimo, e finora sono stati assegnati dei valori effettivi solo ai primi tre. Questo significa che utilizzare in lettura i dati ai posti segnati con “...” sarebbe un’operazione senza senso.

Per evitare problemi di questo tipo ogni vettore sarà sempre accompagnato da un intero che indica il numero effettivo di variabili attualmente utilizzate. Una dichiarazione di vettore è la seguente

Var
  V: Array[1..10] of Real;
  L: Byte;

dove

bulletV, il nome della variabile definita subito dopo i due punti
bulletArray, indica che si tratta di un vettore (pacchetto, raggruppamento, blocco) di elementi più semplici
bullet[ ], le parentesi quadre indicano l’elenco dei soprannomi per ciascun elemento nel vettore, in modo da poterli distinguere univocamente
bullet1..10, il primo e l’ultimo soprannome e tutti quelli compresi nell’intervallo da 1 a 10 (..)
bulletof, (seguito da un tipo: real, integer, boolean, ...) indica il tipo comune degli elementi raggruppati nel vettore
bulletL, è un intero che accompagnerà il vettore in tutte le sue “peripezie”.

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
  NMAX = 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 d'uso:

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..NMAX].

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..NMax] of Real; L: Integer): 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..NMax] of Real;

(il nome scelto è libero...) e la dichiarazione del vettore diventa

Var
  V: Vettore;

e la funzione diventa

function MaxN(V: Vettore; L: Integer): Real;

I vettori - ApPuNtIdIuNiNfOrMaTiCo

Home • ECDL • Algoritmi • Java • Basi di dati • Seconda prova • Eccetera • Cerca nel sito

Precedente
SUPERIORE
Successiva