INFORMATICA typedef Ridefinizione dei tipi: typedef • E’ possibile ridefinire un tipo già esistente mediante la parola chiave typedef, cosicché si può utilizzare un nuovo identificatore (sinonimo) al posto del precedente. • Formato: typedef tipo_esistente nuovo_nome; • Esempio: typedef long int interolungo; integerolungo dato_int; /* ridefinizione di tipo */ /* dato_int e' un intero lungo */ • Mediante typedef si possono definire, ad esempio, tipi astratti, integer8, integer16 e integer32, dall'ovvio significato, per poi ridefinirli in funzione del compilatore effettivamente usati. © Piero Demichelis 2 Il tipo enumerazione Il tipo enumerazione: enum • Nei problemi reali può succedere di dover trattare colori, categorie, dimensioni, ecc., per i quali non esiste un tipo predefinito che si adatti opportunamente alla loro rappresentazione. • In questi casi il C permette di definire le entità su cui il programma deve operare: questa possibilità è data dalla definizione dei tipi enumerati. • La forma generale è: enum [identif_tipo] {identif. [, identif.]} [variabile]; enum identif_tipo variabile; dove le parti opzionali sono tra parentesi quadra. © Piero Demichelis 4 Il tipo enumerazione: enum Esempio: enum colore {bianco, rosso, blu, giallo, verde, nero}; enum week {lunedi, martedi, mercoledi, giovedi, venerdi, sabato, domenica}; ................................ enum colore col_parete; enum week giorno; • La variabile col_parete, di tipo colore, potrà assumere i valori bianco, rosso, blu, ecc. • La variabile giorno di tipo week i valori lunedi, martedi, ecc. © Piero Demichelis 5 Il tipo enumerazione: enum • La definizione può apparire in varie forme: enum {identif. [, identif.]} variabili; a) • variabile può assumere uno dei valori della lista (espressi in modo simbolico); esempio: enum colore {bianco, rosso, blu, giallo, verde, nero} col_parete; b) enum nome_tipo {identif. [, identif.]}; ............................... enum nome_tipo variabili; In questo modo si identifica con nome_tipo la lista dei valori assunti, successivamente si definisce variabile di quel tipo enumerativo che potrà assumere soltanto i valori indicati nella lista precedente. © Piero Demichelis 6 Il tipo enumerazione: enum Ad esempio: enum colore {bianco, rosso, blu, giallo, verde, nero}; ................................ enum colore col_parete; c) enum nome_tipo {ident. [, ident.]} variabile_1; ..................................... enum nome_tipo variabile_2, ......, variabile_n; è una combinazione delle precedenti; esempio: enum colore {bianco, rosso, blu, giallo, verde, nero} parete_A; ................................ enum colore parete_B; © Piero Demichelis 7 Il tipo enumerazione: enum • In un programma si possono pertanto avere istruzioni del tipo: col_parete = verde; giorno = mercoledi; • Nella definizione di tipo si evidenziano due elementi: l’ identificatore di tipo, detto tag, e gli identificatori che verranno usati per esprimere i valori assunti da quel tipo. • I valori assunti da quel tipo corrispondono a delle costanti intere definite in modo automatico dal compilatore, che pertanto devono essere uniche nel programma. Ad esempio, enum festivo {sabato, domenica}; enum feriale {lunedi, martedi, mercoledi, giovedi, venerdi, sabato}; è errato perché sabato è presente in due tipi; analogamente è illecito usare, per esempio, l'identificatore domenica come nome di una variabile. © Piero Demichelis 8 Il tipo enumerazione: enum • La lista degli identificatori che denotano i valori assunti da un tipo enumerato forma un insieme ordinato che il compilatore codifica con valori interi crescenti a partire da 0. • Nella definizione del tipo colore, l'identificatore bianco viene codificato con 0, rosso con 1, blu con 2, ecc. Si possono modificare questi valori, assegnati automaticamente, imponendo i valori interi che si vogliono assegnare direttamente nella definizione. • Si fa seguire al nome dell'identificatore il segno uguale e il valore che si intende assegnare. Il compilatore assumerà questo numero come nuovo valore di partenza per le assegnazioni successive. © Piero Demichelis 9 Il tipo enumerazione: enum • Esempio: enum colore {bianco, rosso, blu = 20, giallo, verde, nero}; In questo caso bianco vale 0, rosso vale 1, blu vale 20, giallo vale 21, ecc. • E’ possibile attribuire a più identificatori valori identici, o esplicitamente (ad esempio, blu = 20, giallo = 20), o implicitamente: se, ad esempio, si pone blu = 0 (lo stesso valore di bianco che a questo punto è già stato codificato), giallo assumerà lo stesso valore di rosso, cioé 1). © Piero Demichelis 10 Il tipo enumerazione: enum • In generale quindi questi identificatori agiscono come costanti intere e possono essere usati dovunque è appropriata una costante. • Un'applicazione interessante è la definizione del tipo logico (assente in C) ottenuta combinando la definizione di tipo enumerato con la creazione di un tipo simbolico mediante typedef: typedef enum {FALSO, VERO} boolean; /*boolean è definito come sinonimo di un tipo enumerato a due valori*/ boolean finito, trovato; /* definizione di due variabili logiche */ • Si noti che FALSO e VERO sono definite in un modo implicito e assumono rispettivamente i valori 0 e 1. © Piero Demichelis 11 Il tipo enumerazione: enum • Il linguaggio C definisce gli enumerati come una forma particolare del tipo intero: ne consegue che i valori definiti in tipi enumerati differenti sono a tutti gli effetti dei valori interi. • Sono pertanto lecite (sintatticamente, non semanticamente!) assegnazioni di valori di un tipo enumerato a una variabile di un altro tipo enumerato. • Un'altra conseguenza è che per le operazioni di I/O dei dati di tipo enumerato non sono previsti specificatori ad hoc, in quanto sono a tutti gli effetti degli interi. © Piero Demichelis 12 Il tipo enumerazione: enum • Esempio: main() { enum enum enum enum materia {italiano, latino, storia, geografia}; giorni {lunedi, martedi}; materia corso; giorni domani; corso = storia; corso = 3; domani = latino; } /* /* corso assume il valore 2 corso assume il valore 3, cioè geografia /* domani assume il valore 1 © Piero Demichelis */ */ */ 13 enum: esempio • Esempio: programma per introdurre da terminale i voti acquisiti in ogni materia di insegnamento e calcolo della media. #include <stdio.h> main() { enum materia {italiano, latino, storia, geografia}; float sommavoti, voto, numvoti; enum materia corso; numvoti = 0; sommavoti = 0; printf (“\nCalcola la media dei voti. Introdurre i voti.\n"); © Piero Demichelis 14 enum: esempio for (corso = italiano; corso <= geografia; corso++) { printf(“\nVoto di "); /* costruisce il messaggio di richiesta voto */ switch (corso) { case italiano: printf ("italiano: "); break; case latino: printf ("latino: "); break; case storia: printf ("storia: "); break; case geografia: printf ("geografia: "); } scanf ("%f", &voto); sommavoti += voto; /* accumula in sommavoti (per la media) */ numvoti++; /* incrementa numvoti (per la media) */ } printf (“\n\nMedia dei voti: %5.2f\n", sommavoti/numvoti); } © Piero Demichelis 15