Pascal/Gestione avanzata dei dati
In questo capitolo tratteremo tipi di dati più complessi e che utilizzeremo meno frequentemente
Tipi di dati definiti dall'utente
modificaAbbiamo già visto prima che per dichiarare una variabile si deve specificare un tipo (ad esempio, integer o real) per indicare quali valori può assumere.
In alcuni casi può essere utile ricorrere a tipi di dati non predefiniti, ma creati dall'utente: si può ricorrere quindi ad una dichiarazione di tipo con la parola riservata type.
La sintassi è
type
nome: valori_possibili;
che definisce il tipo di dato nome.
Per indicare quindi che una variabile è del tipo nome si usa la sintassi:
var
variabile:nome;
Tipi enumerativi
modificaIl più semplice tipo di dichiarazione type è quella dei tipi enumerativi, che consentono cioè un numero ristretto di valori, definiti singolarmente dall'utente:
type nome:(elemento_1, elemento_2,...,elemento_n);
dove elemento_1,elemento_2,...,elemento_n sono i possibile valori che possono assumere le variabili del tipo di dato nome elencati in ordine.
Per fare un esempio, possiamo definire un tipo:
type mesi: (gen, feb, mar, apr, mag, giu, lug, ago, sett, ott, nov, dic);
e dichiarare due variabili
var mese_di_nascita_luigi, mese_di_nascita_gianni:mesi;
Se nel corso del programma poniamo
mese_di_nascita_luigi:= feb;
mese_di_nascita_gianni:= ago;
avremo che: l'istruzione writeln(mese_di_nascita_luigi);
stampa sullo schermo feb; l'espressione mese_di_nascita_luigi < mese_di_nascita_gianni
restituisce TRUE, in quanto feb precede ago nella lista dei mesi indicata nella dichiarazione. Allo stesso modo giu > set
restituisce invece FALSE.
Subrange
modificaI subrange sono tipi di dati che sono definiti come sottoinsiemi di altri tipi. Ad esempio:
type
cifra: 0..9
mese_primaverile: mar..giu;
lettera: 'a'..'z';
Abbiamo definito tre dati subrange: il primo tipo permette tutti i numeri dallo 0 al 9, il secondo tutti i mesi primaverili (da marzo a giugno) e il terzo tutti i caratteri da "a" a "z". Come si può intuire:
- una definizione di un subrange è costituita da un limite inferiore e uno superiore
- un subrange non è valido se il limite inferiore è maggiore o uguale a quello superiore (ad esempio non è valido il subrange
9..5
) - i due limiti devono essere dello stesso tipo di dato (interi, char, o anche definiti dall'utente, come nel caso di
mese_primaverile
che è un subrange del tipo mesi definito in precedenza)
Una volta definito, lo possiamo utilizzare:
var mese: mese_primaverile;
In questo caso ad esempio si possono effettuare dichiarazioni come mese := mar;
ma non mese := ott;
.
Insiemi
modificaVediamo ora un altro tipo di dato non molto utilizzato, ma che può risultare comodo in alcune occasioni: gli insiemi, che in Pascal sono molto simili al concetto di insieme in matematica; dato un insieme A di oggetti di un insieme di dati B, ogni oggetto di B appartiene o non appartiene ad A.
Vediamo come dichiarare gli insiemi con un esempio:
var giorni_liberi: SET OF integer;
Possiamo altrimenti scrivere:
type giorni_del_mese: SET OF integer;
var giorni_liberi : giorni_del_mese;
Ma il risultato è lo stesso. Per inizializzare un insieme usiamo la sintassi:
giorni_liberi := [1,3..7, 10..25, 29];
giorni_liberi := []; {insieme vuoto}
Si noti l'uso di un range nell'assegnazione. La sintassi generale è quindi per un insieme [el1, el2, el3..el7, ...]
.
Operazioni con gli insiemi
modificaLe operazioni fattibili con gli insiemi sono le stesse in matematica: ad esempio, "+" corrisponde all'unione, "-" alla differenza e "*" all'intersezione.
[1, 3, 4] + [3, 9..11] = [1, 3, 4, 9..11]
[5, 7, 19, 22] - [22] = [5, 7, 19]
[5, 7, 19, 22] - [23] = [5, 7, 19, 22]
[11..22] * [15..56] = [15..22]
[11..22] + [15..56] = [11..56]
[5, 7, 19, 22] * [22] = [22]
[5, 7, 19, 22] * [23] = []
Per verificare se un elemento è in un insieme, usiamo l'operatore IN:
if 1 in giorni_liberi then
...
È possibile anche confrontare gli insiemi:
- =: restituisce true se i due insiemi sono uguali;
- <>: restituisce true se i due insiemi sono diversi;
- <=: restituisce true se il primo insieme è sottoinsieme del secondo (il secondo contiene il primo);
- >=: contrario di <=