Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D Le Miniguide all'orientamento Gli eBook di Federica La Corte in Rete
 
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Valeria Vittorini » 1.Strutture e typedef. Record in C/C++: Concetti Base


Tipi di Dato


Record e Struct

  • A differenza degli array, possono contenere informazioni eterogenee
  • Esempi: i dati di uno studente, i campi di una data, …
  • Definizione di un tipo record in C/C++

struct studente{

char nome [20];
long matricola;
int numeroEsami;

};

  • Dichiarazione di variabili: studente s1, s2;

Funzione di Accesso

  • Uso delle struct:  per l’accesso ai singoli campi si usa la “notazione punto”.

s1.matricola = 43522; // accede al campo matricola del record s1

// e ne assegna il valore

 cout << s1.nome; // accede al campo nome del record s1

// e ne visualizza il valore

s1.numeroEsami=3; // accede al campo numeroEsami del

// record s1 e ne assegna il valore

*Nota: in C++ un commento è preceduto da //. Il compilatore ignora la stringa di caratteri che segue il //.

Esempio

Si vuole sviluppare un programma che acquisisce da tastiera due numeri complessi e ne effettua la somma ed il prodotto
Il C/C++ non fornisce un tipo predefinito per rappresentare numeri complessi, ma è possibile definirlo utilizzando i record, come di seguito indicato.

typedef struct complesso {
double Re;
double Imm;
};

Il record “complesso” contiene due campi: “double Re” rappresenta la parte reale e “double Imm” rappresenta il coefficiente dell’immaginario.

Si noti che la definizione del tipo “complesso” è puramente dichiarativa. I due campi costituiscono la struttura del tipo di dato aggregato e ad essi non viene associata memoria sebbene apparentemente sembrino definizioni di variabili. La memoria necessaria alla definizione di una variabile di tipo complesso verrà riservata solo all’atto di una definizione di variabile da parte dell’utente del tipo. Ad esempio nel programma principale a seguito di un’istruzione del tipo:

complesso C;

Esempio

L’esempio seguente mostra l’utilizzo del tipo complesso da parte di un utente. Il codice riportato si riferisce esclusivamente alla funzione main, si tenga presente che per compilare correttamente tale codice la definizione del tipo complesso deve ovviamente essere riportata in testa al file, prima del programma principale o essere disponibile in un file header incluso attraverso una direttiva d’inclusione prima del main.

Mostra codice

Composizione delle funzioni di accesso

  • I meccanismi di accesso agli elementi di una variabile strutturata possono essere composti
  • Un vettore di numeri complessi:

complesso v[10];

  • Accesso al campo reale dell’elemento di posizione i:

v[i].Re

Assegnazione

A differenza degli array, per le struct è definito l’operatore di assegnazione:

complesso a1, a2; a2 = a1;

Il contenuto di a1 viene ricopiato in a2. Si tenga presente che la copia che viene effettuata è una copia superficiale, cioè viene ricopiato esattamente ciò che è “visibile” a partire dalla definizione del tipo record. Nel caso in cui, ad esempio, il record contenesse dei campi di tipo puntatore, verrebbe copiato esclusivamente il contenuto della variabile puntatore. Come vedremo, questo è un aspetto delicato quando il puntatore punta eventualmente a un’area di memoria allocata dinamicamente.

Attenzione: non è possibile utilizzare gli operatori di confronto == e !=

Typedef

Lo specificatore typedef permette di effettuare dichiarazioni di tipo per associare un identificatore ad un tipo.

In altre parole mediante lo specificatore typedef è possibile assegnare un alias a un qualsiasi tipo, fondamentale o derivato.

typedef non definisce un nuovo tipo, ma introduce un nome che corrisponde a uno dei tipi definiti.
Il suo uso è molto comodo (delle volte fondamentale) in due diverse circostanze:

  • quando si vuole introdurre un certo grado di parametrizzazione in un programma rispetto ad uno o più tipi;
  • quando si vuole associare un nome semplice a tipi con dichiarazione complessa.

Esempio 1

Nell’esempio seguente viene assegnato un alias al tipo intero. In questo modo è possibile in futuro modificare facilmente il tipo di dato su cui opera il programma, sostituendo ad esempio al tipo “int” il tipo “char” e ricompilando. Si otterrà in questo modo un programma che lavora su un vettore di caratteri. Ciò è possibile, ovviamente, solo se tutte le operazioni previste nel programma possono essere effettuate non solo su dati di tipo intero ma anche su dati di tipo carattere.

Mostra codice

Esempio 1 (continua)

In figura sono mostrate due diverse esecuzioni del programma visto precedentemente. Nella prima, il programma è stato compilato per lavorare su numeri interi; nella seconda, il programma è stato modficato per lavorare sui caratteri come precedentemente descritto.

In figura sono mostrate due diverse esecuzioni del programma visto precedentemente. Nella prima, il programma è stato compilato per lavorare su numeri interi; nella seconda, il programma è stato modficato per lavorare sui caratteri come precedentemente descritto.


Esempio 2

Nell’esempio seguente il programma dell’esempio 1 è stato modificato per renderlo più generale. Il secondo typedef, infatti, definisce un sottoinsieme di vettori e assegna a tale sottoinsieme un nome. In questo modo si ha a disposizione un nome che può essere utilizzato dall’utente come il nome di un tipo. L’istruzione:

Vettore vet;

definisce una variabile di tipo Vettore. La variabile “vet” è un vettore di caratteri di dimensione massima 100.

Mostra codice

I materiali di supporto della lezione

C. Savy: Da C++ ad UML, McGraw-Hill; Cap. 4, par. 4.3

Da Fondamenti di Informatica I Parte II, Capitolo III, §5, §6, §7

  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion