|
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
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; |
|