22 Tipo Enumerado

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:

enum $Nome\_do\_tipo$ { $valor_1$, $valor_2$, $\ldots$, $valor_n$ };

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
2013-10-21