struct studente{
char nome [20];
long matricola;
int numeroEsami;
};
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 //.
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;
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 codicecomplesso v[10];
v[i].Re
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 !=
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:
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 codiceIn 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.
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 codice1. Strutture e typedef. Record in C/C++: Concetti Base
4. Puntatori a tipi di dato strutturati. Allocazione Dinamica
5. Puntatori: aspetti avanzati
7. Asserzioni
8. Gestione delle eccezioni. Concetti base
9. Programmazione modulare: concetti base
10. Programmazione Modulare: Meccanismi e Strumenti a supporto in C/C++
12. Esercitazione: Strutture Dati Pila e Coda
13. Esercitazione. Strutture Dati: Lista Concatenata
14. Meccanismi di Incapsulamento in C++ Namespaces
15. Programmazione orientata agli oggetti. Introduzione
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