Docente: Giuseppe Scollo
Università di Catania, sede di Comiso (RG)
Facoltà di Scienze Matematiche, Fisiche e Naturali
Corso di Studi in Informatica applicata, AA 2006-7
tipo di dati : un insieme di valori e una collezione di operazioni su di essi
tipi di dati elementari predefiniti in C++:
int
float
char
la rappresentazione degli interi dipende dall'architettura della macchina
short int
e
long int
rappresentano intervalli determinati dalla rappresentazione con,
rispettivamente, 2 byte e 8 byte
anche la rappresentazione in virgola mobile dipende dall'architettura
della macchina: il tipo
double
impiega il doppio dello spazio, rispetto al tipo
float
,
per la rappresentazione in doppia precisione
ai simboli delle operazioni aritmetiche sui tipi
int
,
float
e rispettive varianti si applica
l'overloading:
int →
float,
float →
double
, etc.)
((float) x) / N
(float)
converte l'argomento di tipo
int
nel tipo
float
,
dopodiché anche
N
viene convertito a
float
per casting implicito
il testo (Sedgewick, 2003) propone un programma per il calcolo della media e della varianza di N numeri (Programma 3.2, p. 75)
nel programma si assume che i numeri siano interi, e che l'input sia costituito solo dal valore di N, mentre gli N numeri interi vengono quindi generati pseudocasualmente dalla funzione di libreria rand()
per rendere il programma più facilmente adattabile al calcolo, con lo stesso algoritmo, su numeri di altro tipo, si usa il seguente costrutto per la definizione del tipo Number con la funzione di generazione pseudocasuale randNum() :
typedef int Number; Number randNum() { return rand(); }
questo esempio mostra un tipo di dato definito dall'utente come ridenominazione di un tipo esistente (dunque con lo stesso insieme di valori) ed estensione delle operazioni con una nuova funzione
la precedente definizione di tipo ne combina
è buona norma di metodo
al fine di svincolare l'uso delle funzioni dichiarate nell'interfaccia, da parte di programmi o moduli client, dalla loro implementazione: l'uso richiede solo l'interfaccia!
in tal modo si può sostituire un'implementazione con un'altra, ad esempio più efficiente, senza dover modificare i client
nel caso in esame, si possono codificare interfaccia e implementazione in due file distinti, ad es. Number.h e NumberImpl.c++, con i seguenti rispettivi contenuti:
typedef int Number; #include <stdlib.h> Number randNum(); #include "Number.h" Number randNum() { return rand(); }
la separazione di interfaccia e implementazione di un tipo di dato definito dall'utente permette di modificarne l'implementazione
se si effettua la compilazione separata di client e implementazione del tipo di dato
come si fa?
supponiamo, nell'esempio visto prima, che il client sia il programma
codificato nel file MedVar.c++, che
conterrà la direttiva #include "Number.h"
con il compilatore GCC in ambiente Unix/Linux, i primi due comandi che
seguono rispettivamente generano i moduli oggetto dell'implementazione
e del client (con estensione .o
), senza produrre alcun programma eseguibile (opzione
"-c"
), mentre il terzo comando assembla i moduli oggetto e
genera l'eseguibile
MedVar nella directory
bin
c++ -c NumberImpl.c++ c++ -c MedVar.c++ c++ -o bin/MedVar NumberImpl.o MedVar.o