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
Scarica

enum: esempio