edutecnica

Record

            

Il record è una struttura dati in grado di contenente valori non omogenei, ossia di tipi differenti fra loro. Ad esempio è possibile far coesistere dati numerici e dati testuali all'interno del medesimo record.
La struttura è costituita semplicemente un elenco di campi, ognuno dei quali sarà accessibile singolarmente. I campi possono a loro volta essere dei record.

Dichiarazione

struct "nome_struttura" {
"tipo" "nome_del_campo 1" ;
"tipo" "nome_del_campo 2" ;
...
"tipo" "nome_del_campo n" ;
} "eventuale elenco di variabili strutturate secondo l'elenco appena chiuso";


Esempio 1 - si dichiara un elenco di variabili, direttamente nella dichiarazione di struttura:

struct Rec {
char Nome[15];
char Cognome[20];
int AnnoDiNascita;
} Persona1, Persona2, Vettore[100];


Nell'esempio qui sopra si dichiarano 2 record singoli ed un vettore di 100 record strutturati allo stesso modo.

Esempio 2 - l'elenco di variabili si specifica in un secondo momento:

struct Rec {
char Nome[15];
char Cognome[20];
int AnnoDiNascita;
};

struct Rec Persona1, Persona2, Vettore[100];


Esempio 3 - inizializzazione contestuale di un record:

struct Rec Persona = { "Giovanni", "Colombo", 1953 } ;

Esempio 4 - inizializzazione contestuale dei primi tre record di un vettore di 50 elementi:

struct Rec Archivio [50] = { { "Giovanni", "Colombo", 1953 }, { "Mario", "Rossi", 1944 }, { "Marco", "Bianchi", 1961 } } ;


Accesso ai campi del record

       

Ogni campo di ogni record può essere sia consultato (accesso in lettura) che modificato (accesso in scrittura). La sintassi per riferirsi al singolo campo di un record è:

"Nome del record"."Nome del campo"

Esempio 10 - Vari esempi di accesso ai campi di un record:

gets (Vettore[n].Nome);
//Acquisisce il campo "Nome" per il record n-esimo di "Vettore"

strcpy(Vettore[k].Cognome, "Verdi" );
// Inizializza il campo "Cognome" del record i-esimo di "Vettore"

if (Persona2.AnnoDiNascita == 1960)
//Consulta il campo "AnnoDiNascita" del record "Persona2"

scanf ("%d",&Persona2.AnnoDiNascita);
// Acquisisce il campo "AnnoDiNascita" del record "Persona2"

Persona2.AnnoDiNascita = 1940;
//Modifica il campo "AnnoDiNascita" del record "Persona2"


Caricamento e stampa di una struttura

   

La gestione di una struttura a record segue in linea di masima le stesse regole della gestione dei vettori, con la sola eccezione delle modalità dell'accesso ai vari campi del record.
Qui sotto è riportato un esempio di un vettore di 3 elementi record nelle due operazioni principali di caricamento e stampa a video. Viene definio un record (ele) costituito da due campi:il campo s che è una stringa di 20 caratteri (vettore di char di lunghezza 20) ed un intero h.
Di seguito con la definizione di T[n], viene predisposto un vettore di n elementi del record dichiarato.
Notiamo che quando si esegue l'acquisizione di una stringa da tastiera è consigliabile usare l'istruzione gets() preceduta dall'istruzione fflush(stdin) (svuotamento del buffer di tastiera) per consentire l'acquisizione di stringhe con spazi.

#include<iostream>
#include<string>
using namespace std;
const int n=3;
main(){
//dichiarazione della struttura
struct ele{
   string s;
   int h;
}T[n];
int i;

//caricamento
for(i=0;i < n;i++){
   cout << "nome:";
   if(i!=0)cin.ignore();

   getline(cin,T[i].s);
   cout << "numero:";
   cin >> T[i].h;
}

//stampa
for(i=0;i < n;i++)cout << T[i].s << "\t" << T[i].h << endl;
}//fine main