Pascal/Gestione avanzata dei dati

Indice del libro

In questo capitolo tratteremo tipi di dati più complessi e che utilizzeremo meno frequentemente

Tipi di dati definiti dall'utente

modifica

Abbiamo 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

modifica

Il 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

modifica

I 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

modifica

Vediamo 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

modifica

Le 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 <=