Äîêóìåíò âçÿò èç êýøà ïîèñêîâîé ìàøèíû. Àäðåñ
îðèãèíàëüíîãî äîêóìåíòà
: http://www.arcetri.astro.it/irlab/doc/library/linux/AppLinux/al173.htm
Äàòà èçìåíåíèÿ: Tue Sep 21 18:08:49 1999 Äàòà èíäåêñèðîâàíèÿ: Sat Dec 22 13:24:14 2007 Êîäèðîâêà: Ïîèñêîâûå ñëîâà: http astrokuban.info astrokuban |
Nel capitolo introduttivo Õ stato visto l'uso di variabili identificabili semplicemente con il loro nome. La programmazione elementare richiede anche l'utilizzo di strutture di dati piÛ complesse; le stesse stringhe sono degli array di caratteri, e come tali vanno trattate.
Gli array in Pascal sono una sequenza ordinata, in una quantitÞ prestabilita, di elementi dello stesso tipo. Gli elementi possono essere composti da qualunque tipo di dati, nativo o derivato.
Una caratteristica importante del linguaggio Pascal sta nel fatto che nel momento della dichiarazione di un array, viene definito anche il valore iniziale dell'indice da utilizzare per la scansione dei vari elementi.
var <nome> : array[<inizio>..<fine>] of <tipo> |
La sintassi indicata, dove le parentesi quadre fanno parte dell'istruzione, mostra in breve in che modo si possa dichiarare un array, a una sola dimensione, di elementi di un certo tipo di dati.
õ importante osservare che vengono stabiliti in modo esplicito sia l'indice iniziale del primo elemento che quello finale dell'ultimo, stabilendo implicitamente la quantitÞ di questi.
L'esempio seguente mostra la dichiarazione di tre array simili, composti tutti da 7 interi, dove, rispettivamente, il primo elemento si raggiunge con l'indice iniziale 1, 0 e 2.
var elenco : array[1..7] of integer; elenco2 : array[0..6] of integer; elenco3 : array[2..8] of integer; |
Per accedere agli elementi di un array si usa la sintassi seguente, e anche qui le parentesi quadre fanno parte dell'istruzione.
<nome>[<indice>] |
Quello che conta Õ che l'indice indicato sia valido, in funzione della dichiarazione fatta in origine. L'esempio seguente assegna al primo elemento il valore 10.
elenco[1] := 10; |
Gli array multidimensionali non sono altro che array di array. Il modo piÛ semplice per dichiarare un array multidimensionale Õ quello di indicare due o piÛ intervalli di valori per gli indici, secondo la sintassi seguente:
var <nome> : array[<inizio>..<fine>,<inizio>..<fine>...] of <tipo> |
Per esempio, l'istruzione seguente dichiara un array a due dimensioni di 3 elementi per 8, di tipo intero. Si osservi in particolare il secondo intervallo di indici, dove il primo elemento verrÞ raggiunto con l'indice zero.
var elenco : array[1..3,0..7] of integer; |
In modo analogo, si raggiunge un elemento di un array multidimensionale utilizzando due o piÛ indici, secondo la sintassi seguente:
<nome>[<indice>,<indice>...] |
L'esempio seguente assegna un valore all'elemento «1,0».
elenco[1,0] := 10; |
La scansione di un array avviene generalmente con un ciclo enumerativo, for
, come nell'esempio seguente:
... var indice : integer; var elenco : array[1..7] of integer; ... begin ... for indice := 1 to 7 do begin ... elenco[indice] := ... ... end; ... end. |
La scansione di array multidimensionali avviene generalmente attraverso una serie di cicli enumerativi, uno per ogni dimensione, annidati opportunamente. L'esempio seguente mostra la scansione di un array a tre dimensioni.
... var i,j,k : integer; var elenco : array[1..7,0..8,2..10] of integer; ... begin ... for i := 1 to 7 do begin ... for j := 0 to 8 do begin ... for k := 2 to 10 do begin ... elenco[i,j,k] := ... ... end; ... end; ... end; ... end. |
Nel linguaggio Pascal, cosË come in molti altri, le stringhe sono semplicemente degli array di caratteri, con qualche piccola differenza per facilitarne l'utilizzo.
La dichiarazione di una variabile stringa Õ quindi la dichiarazione di un array composto da una quantitÞ predefinita di caratteri. Nell'esempio seguente, viene creato una variabile stringa di 20 caratteri.
var cognome : array[1..20] of char; |
La variabile dichiarata in questo modo puÐ essere usata come un array, cioÕ accedendo alle informazioni carattere per carattere, oppure nel suo insieme. Nell'esempio seguente si assegna un nome alla variabile stringa mostrata sopra.
cognome := 'Rossi'; |
Se si utilizza un assegnamento di questo tipo, vengono ricoperti anche gli elementi successivi alla lunghezza della stringa letterale assegnata. Quindi, seguendo l'esempio, l'array riceverÞ il nome «Rossi» nei suoi primi cinque elementi, mentre negli altri verrÞ comunque inserito uno spazio.
Il linguaggio Pascal permette di definire dei tipi di dati derivati, a partire da quelli elementari, o a partire da altri tipi composti dichiarati precedentemente.
type <tipo-nuovo> = <definizione-del-tipo> |
La definizione di un nuovo tipo va posta nella zona dichiarativa del programma, della procedura o della funzione. L'esempio seguente serve a dichiarare il tipo «Numero» come equivalente al tipo intero standard.
type Numero = integer; |
Naturalmente, la definizione di un nuovo tipo Õ sensata quando serve a individuare qualcosa di piÛ complesso dei dati elementari, come nel caso di un array. L'esempio seguente dichiara il tipo «Stringa» come un array di 80 caratteri, e quindi dichiara il tipo «Nominativo» come array composto da due elementi «Stringa» (probabilmente uno per il nome e l'altro per il cognome).
type Stringa = array[1..80] of char; type Nominativo = array[1..2] of Stringa; |
A questo punto, per seguire l'esempio, se si generasse una variabile di tipo «Nominativo», si otterrebbe un array di due elementi, che in realtÞ sono array di 80 caratteri.
... var Nome : Nominativo; ... begin ... Nome[1] := 'Pinco'; Nome[2] := 'Pallino'; ... end. |
L'esempio mostra in che modo si potrebbe usare una variabile del genere. Tuttavia, si poteva accedere anche al singolo elemento carattere, utilizzando due indici.
... Nome[1,1] := 'P'; Nome[1,2] := 'i'; Nome[1,3] := 'n'; Nome[1,4] := 'c'; Nome[1,5] := 'o'; ... end. |
Convenzionalmente, quando si dichiara un nuovo tipo di dati, si usa l'iniziale maiuscola, per distinguerlo facilmente dagli altri tipi nativi. |
Il linguaggio Pascal offre qualcosa di simile alle costanti macro di altri linguaggi come il C. Non si tratta di un linguaggio di precompilazione, ma proprio del Pascal, anche se si tratta comunque di costanti letterali, senza la definizione di un tipo a priori.
const <nome-della-costante> = <valore-letterale> |
La dichiarazione di queste costanti va fatta, come prevedibile, nella zona dichiarativa del programma, della procedura o della funzione. L'esempio seguente dichiara la costante «DIMENSIONE», che poi viene usata per definire la dimensione di una serie di array.
... const DIMENSIONE = 11; ... var elenco : array[1..DIMENSIONE] of integer; elenco2 : array[1..DIMENSIONE] of integer; elenco3 : array[1..DIMENSIONE] of integer; |
Il vantaggio di utilizzare le costanti sta nel facilitare la lettura del sorgente, nel riconoscere il significato di determinate costanti, e nel facilitare la modifica di tali valori, senza dover rileggere tutto il sorgente alla loro ricerca.
Il linguaggio Pascal offre dei tipi di dati particolari, che non sono ancora stati descritti, il cui scopo Õ solo quello di facilitare il compito del programmatore.
Il tipo enumerativo, o scalare, secondo la terminologia del Pascal, Õ una forma di rappresentazione di un intero attraverso costanti mnemoniche. In pratica, si definisce una variabile che puÐ assumere un elenco di valori simbolici possibili, valori che in realtÞ sono solo delle costanti e non hanno alcun valore verbale.
(<costante>, <costante>[,...]) |
La sintassi indicata mostra il modo in cui si definisce un tipo del genere: all'interno di parentesi tonde si elencano i nomi delle costanti che possono essere assegnate a una variabile di questo tipo.
L'esempio seguente mostra la dichiarazione di una variabile scalare che puÐ assumere i valori «VERDE», «BLU» e «ROSSO».
var colore : (VERDE, BLU, ROSSO); |
L'esempio stesso dovrebbe chiarire l'utilitÞ di questo tipo di dati: si lascia al compilatore il compito di stabilire i valori piÛ appropriati per i simboli che possono essere associati a una variabile. Tuttavia, Õ importante chiarire che non Õ possibile visualizzare il contenuto di una variabile del genere, in quanto questo non Õ prevedibile.
if colore = VERDE then begin ... Writeln( "Il colore Õ verde" ); end; else ... ; |
Naturalmente, questo tipo di dati si presta particolarmente per la definizione di tipi derivati, come nell'esempio seguente, dove prima si dichiara un tipo e piÛ avanti si utilizza nella dichiarazione di una nuova variabile.
type Sapore = (INSIPIDO, DOLCE, SALATO, ACIDO, PICCANTE, AMARO); ... var pietanza : Sapore; ... |
Il sottointervallo Õ la definizione di un tipo derivato che puÐ utilizzare solo un intervallo stabilito di valori. Questo intervallo si definisce solo con l'indicazione di due costanti dello stesso tipo, separate da due punti in sequenza.
Per esempio, per indicare la serie di numeri interi che va da 1 a 7, si puÐ utilizzare la notazione 1..7
, e per indicare la serie delle lettere alfabetiche minuscole, si puÐ utilizzare la notazione 'a'..'z'
.
Naturalmente, si possono indicare anche degli intervalli di un tipo enumerativo dichiarato in precedenza. Seguono alcuni esempi.
type Settimana = (LUNEDë, MARTEDë, MERCOLEDë, GIOVEDë, VENERDë, SABATO, DOMENICA); type Feriale = LUNEDë..VENERDë; ... var lavoro : Feriale; minuscola : 'a'..'z'; ... |
Le variabili dichiarate in questo modo, ottengono dal compilatore il tipo piÛ adatto a contenere l'informazione indicata, senza la necessitÞ di doverlo indicare in modo esplicito.
Una variabile puÐ contenere un'informazione riferita a un insieme di elementi enumerativi. In pratica, si tratta di un tipo simile a quello enumerativo, dove ogni elemento puÐ essere presente o meno. Si dichiara questo tipo di dati con le parole chiave set of
. Si osservi l'esempio seguente:
type Settimana = (LUNEDë, MARTEDë, MERCOLEDë, GIOVEDë, VENERDë, SABATO, DOMENICA); ... type Lavoro = set of Settimana; ... var tutti : Lavoro; presenze : Lavoro; assenze : Lavoro; altri : Lavoro; ... |
Le variabili tutti
, presenze
e assenze
, definite del tipo Lavoro
, il quale a sua volta Õ definito come insieme di tutti i simboli del tipo Settimana
, possono contenere un sottoinsieme di tali simboli.
... begin ... presenze := (LUNEDë, MERCOLEDë, VENERDë, DOMENICA); ... tutti := (LUNEDë..DOMENICA); ... assenze := tutti - presenze; ... altri := assenze; ... tutti := assenze + presenze; ... end. |
L'esempio mostra alcuni modi in cui possono essere utilizzate le variabili contenenti insiemi, e quali espressioni si possono realizzare. In pratica:
due variabili dello stesso tipo di insieme possono essere assegnate l'una nell'altra;
due variabili dello stesso tipo di insieme possono essere sommate, generando un insieme risultato dell'unione dei due;
tra due variabili dello stesso tipo di insieme puÐ essere indicata una sottrazione, con la quale si genera un insieme risultato dall'eliminazione degli elementi presenti nella seconda variabile.
A parte gli assegnamenti che possono essere fatti alle variabili contenenti un insieme, Õ poi necessario poter verificare il contenuto di tali variabili, con istruzioni apposite. Per questo si usa la parola chiave in
. L'esempio seguente dovrebbe essere autoesplicativo.
if LUNEDë in presenze then begin ... ... end; if MARTEDë in presenze then begin ... ... end; |
Un insieme puÐ essere definito anche come gruppo di valori di un intervallo, come nell'esempio seguente in cui si definisce un tipo nuovo che rappresenta l'insieme delle lettere minuscole.
type Lettere = set of 'a'..'z'; |
Nello stesso modo, si puÐ utilizzare la parola chiave in
per verificare che un valore appartenga a un insieme definito in forma di intervallo.
if iniziale in 'a'..'z' then begin ... end; |
Il record Õ un tipo di dati composto dall'insieme di altri tipi, ognuno con una sua denominazione. L'esempio seguente mostra in che modo possano essere creati tipi nuovi definiti come record.
type Datario = record anno : integer; mese : integer; giorno : integer; end; type Anagrafico = record cognome : array[1..40] of char; nome : array[1..40] of char; luogo : array[1..40] of char; data : Datario; end; |
L'esempio vuole mostrare la creazione di un record anagrafico con tutti i dati (riferiti alla nascita) che permettono di identificare una persona. Si puÐ osservare che la data (di nascita) Õ stata definita come tipo Datario
, che a sua volta Õ un altro record.
Quando si dichiara una variabile come tipo record, si pone il problema di accedere ai vari elementi di questo. Per farlo si usa l'operatore punto (.
). Si osservi l'esempio seguente, in cui si dichiara un array di dati anagrafici, e quindi si assegnano i valori per il primo elemento di questo array.
... var anagrafe : array[1..10] of Anagrafico; ... begin ... anagrafe[1].cognome := 'Pallino'; anagrafe[1].nome := 'Pinco'; anagrafe[1].luogo := 'Sferopoli'; anagrafe[1].data.anno := 1990; anagrafe[1].data.mese := 1; anagrafe[1].data.giorno := 31; ... end; |
Come si puÐ osservare, per inserire le informazioni sulla data di nascita, Õ stato necessario usare due volte il punto per accedere agli elementi del sottorecord data
.
Una variabile definita come record puÐ ricevere l'assegnamento in blocco di un'altra variabile record, purchÈ dello stesso tipo.
Quando si utilizzano frequentemente i record, potrebbe essere conveniente specificare che in una porzione di codice sorgente si vuole fare riferimento a elementi di una variabile determinata. Si osservi l'esempio seguente, che Õ una variante di quanto giÞ visto in precedenza.
... var anagrafe : array[1..10] of Anagrafico; ... begin ... with anagrafe[1] do begin cognome := 'Pallino'; nome := 'Pinco'; luogo := 'Sferopoli'; data.anno := 1990; data.mese := 1; data.giorno := 31; end; ... end; |
Il significato dovrebbe essere evidente: nell'intervallo delimitato dalle parole chiave begin
end
, tutti i nomi si riferiscono a elementi di anagrafe[1]
.
Gordon Dodrill, Pascal Language Tutorial
---------------------------
Appunti Linux 1999.09.21 --- Copyright © 1997-1999 Daniele Giacomini -- daniele @ pluto.linux.it