TIPO DI DATO RECORD

Il tipo di dato record è stato introddotto inizialmente per rappresentare registrazioni/schede (record in inglese) in un archivio, per esempio le registrazioni/schede dell'anagrafe. È un tipo molto comune, ed è presente praticamente in tutti i linguaggi di programmazione, anche se a volte è chiamato in modi diversi.
valori
I valori di un tipo di dato record sono gli elementi di un prodotto cartesiano A1 x ... x An, dove n è maggiore o uguale ad uno e per i=1, ..., n Ai è un insieme.
Usualmente ogni componente di un tipo record, detta campo (field in inglese), è identificata da un nome. Assumiamo che ID1, ..., IDn siano i nomi delle varie componenti.
costanti
Le costanti del tipo di dato, cioè i modi di descrivere le ennuple seguono o uno stile posizionale, cioè si danno i valori dei vari campi in ordine, oppure sono elenchi di coppie: nome del campo valore. Comunque molti linguaggi non offrono modi di rappresentare questi valori, per esempio il Pascal.
operazioni
In un tipo record esistono sola n operazioni: le n proiezioni del prodotto cartesiano, dette selezione delle componenti. Di solito sono indicate con il postfisso .IDi.
Per esempio (a1, ...,an).IDi ritorna ai.

Il tipo record in C

Nel linguaggio C i record sono detti strutture e si introducono attraverso una dichiarazione di tipo della forma
struct IDENTIFIER { TYPE1 IDENTIFIER1 ;
                    ...
                    TYPEn IDENTIFIERn ;
                  } ;
IDENTIFIER
è il nome della struttura;
IDENTIFIER1, ..., IDENTIFIERn
sono i nomi dei campi della struttura, e TYPE1, ..., TYPEn sono rispettivamente i loro tipi.
Dopo questa dichiarazione IDENTIFIER è il nome di un tipo che può essere usato per dichiarare variabili, parametri di funzioni o come componente di altri tipi strutturati.

Diverse componenti con lo stesso tipo possono essere dichiarate in modo compatto da

TYPE IDENTIFIER1, ..., IDENTIFIERk;
invece che da
TYPE IDENTIFIER1;
...
TYPE IDENTIFIERk;
Le operazione di selezione delle componenti si indicano nel modo usuale.

È possibile inizializzare le variabili di tipo struct elencando i valori delle componente in ordine, separati da virgole e racchiusi da parentesi graffe.


ESEMPIO
I numeri complessi
/*******************************************/
/*     IL TIPO DI DATO NUMERI COMPLESSI    */
/*******************************************/

struct COMPLEX { float Reale, Imm ; };
/*il tipo dei numeri complessi */

const COMPLEX i = { 0, 1 };
/*la costante i */

COMPLEX Somma_C(COMPLEX c1, COMPLEX c2)
/*somma di due numeri complessi */
{    
     COMPLEX sum;
     
     sum.Reale = c1.Reale + c2.Reale;
     sum.Imm = c1.Imm + c2.Imm;
     return sum;
} 

COMPLEX Prodotto_C(COMPLEX c1, COMPLEX c2)
/*prodotto di due numeri complessi */
{    
     COMPLEX prod;
     
     prod.Reale = (c1.Reale * c2.Reale) - (c1.Imm * c2.Imm);
     prod.Imm = (c2.Imm * c1.Reale) + (c2.Reale * c1.Imm);
     return prod;
} 

...

ESERCIZI
  1. Completare il tipo di dato dei numeri complessi con funzioni per eseguire le altre operazioni rilevanti e per leggere e stampare tali valori.
    Scrivere poi un piccolo main per controllare se tale realizzazione funziona.
  2. Dare una nuova realizzazione del tipo di dato numeri complessi, dove il tipo, le costanti e le operazioni hanno esattamente gli stessi nomi di prima, ma dove i numeri complessi sono realizzati usando le coordinate polari.
    Controllare questa nuova realizzazione usando lo stesso main definito nell'esercizio 1.
  3. Dare una terza realizzazione del tipo di dato complessi non utilizzando le strutture del C, ma gli altri tipi di dato del linguaggio, dove il tipo, le costanti e le operazioni hanno esattamente gli stessi nomi che nei casi precedenti.
    Controllare questa nuova realizzazione usando lo stesso main definito nell'esercizio 1.
  4. Definire un tipo di dato per rappresentare le date, nella forma giorno, mese ed anno, usando le strutture del C. Le operazioni dovranno comprendere Domani, Ieri, Precede, Segue, lettura e stampa in vari formati.
    Discutere se avete il problema dell'anno 2000. In caso affermativo, date un'atra implementazione senza il problema, altrimenti datene un'altra con il problema.
  5. Definire un tipo di dato usando le strutture del C per rappresentare delle schede anagrafiche, che contengono nome, cognome, data di nascita, sesso titolo di studio, ed indirizzo.