Em muitos programas, variáveis do tipo int são utilizadas não por suas propriedades numéricas, mas para representar uma escolha dentre um pequeno número de alternativas. Por exemplo:
int sexo; /* masculino = 1 feminino = 2 */ int cor; /* vermelho = 1 amarelo = 2 verde = 3 */
A utilização de códigos para representar os valores que uma variável poderá assumir, certamente compromete a clareza da estrutura de dados do programa, tornando sua lógica obscura e inconsistente. Por exemplo:
cor = 3; if( sexo == 2 ) ... cor = cor + sexo; for( cor = 1; cor < 10; cor ++ )...
Um tipo enumerado permite definir uma lista de valores que uma variável deste tipo poderá assumir. A definição de um tipo enumerado é feita da seguinte forma:
Exemplos de definição de tipos enumerados:
enum TpCores {VERMELHO, AMARELO, VERDE}; enum TpDias {SEG, TER, QUA, QUI, SEX, SAB, DOM}; enum TpSexos {MASCULINO, FEMININO};
Variáveis destes tipos são definidas da seguinte forma:
enum TpCores var1, var2; enum TpDias var3;
Agora, é possível dar valores a estas variáveis, por exemplo:
var1 = AMARELO; var3 = QUI;
é um erro usar valores não definidos na declaração do tipo. A expressão var2 = AZUL; causa erro de compilação.
Internamente, o compilador trata variáveis enumeradas como inteiros. Cada valor na lista de valores possíveis corresponde a um inteiro, começando com 0 (zero). Portanto, no exemplo enum TpCores, VERMELHO é armazenado como 0, AMARELO é armazenado como 1, e VERDE é armazenado como 2.
Utilização de tipos enumerados
Variáveis de tipos enumerados são geralmente usados para clarificar a operação do programa. Considere o seguinte trecho de programa que codifica dias da semana como inteiros (sendo sabado = 5 e domingo = 6) para verificar se o dia do pagamento cai no final de semana e altera a dia para a segunda-feira seguinte.
#include <stdio.h> /* prototipo da funcao que dada a data, retorna o dia da semana. seg=0, ter=1, qua=2, qui=3, sex=4, sab=5, dom=6 */ int diaDaSemana( int dia, int mes, int ano ); int main(){ int diaPgto, mesPgto, anoPgto; int diaSem; printf("Entre com a data de pagamento (dd mm aa): "); scanf("%d %d %d", &diaPgto, &mesPgto, &anoPgto); diaSem = diaDaSemana( diaPgto, mesPgto, anoPgto ); if( diaSem == 5 ) diaPgto = diaPgto + 2; else if( diaSem == 6 ) diaPgto++; printf("Data do pagamento: %d/%d/%d\n", diaPgto, mesPgto, anoPgto); }
Este programa ficaria mais legível se ao invés de codificar os dias da semana como inteiros e colocar a codificação como comentário, utilizar tipos enumerados. O programa ficaria então
#include <stdio.h> enum TpSemana {SEG, TER, QUA, QUI, SEX, SAB, DOM}; /* prototipo da funcao que dada a data, retorna o dia da semana */ enum TpSemana diaDaSemana( int dia, int mes, int ano ); int main(){ int diaPgto, mesPgto, anoPgto; int diaSem; printf("Entre com a data de pagamento (dd mm aa): "); scanf("%d %d %d", &diaPgto, &mesPgto, &anoPgto); diaSem = diaDaSemana( diaPgto, mesPgto, anoPgto ); if( diaSem == SAB ) diaPgto = diaPgto + 2; else if( diaSem == DOM ) diaPgto++; printf("Data do pagamento: %d/%d/%d\n", diaPgto, mesPgto, anoPgto); }
Note que a função diaDaSemana agora retorna apenas um dos valores da lista SEG, TER, QUA, QUI, SEX, SAB, DOM e portanto, no programa principal ao invés de testar se o diaSem == 5 podemos escrever diaSem == SAB, o que torna o programa muito mais legível.
Armando Luiz Nicolini Delgado