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 <iostream>
using namespace std;

// 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;

   cout << "Entre com a data de pagamento (dd mm aa): ";
   cin >> diaPgto >> mesPgto >> anoPgto;
   diaSem = diaDaSemana( diaPgto, mesPgto, anoPgto );
   if( diaSem == 5 )
     diaPgto = diaPgto + 2;
   else if( diaSem == 6 )
     diaPgto++;
   cout << "Data do pagamento: " << diaPgto << "/" << mesPgto << "/" 
        << anoPgto << endl;
}

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 <iostream>
using namespace std;

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;

   cout << "Entre com a data de pagamento (dd mm aa): ";
   cin >> diaPgto >> mesPgto >> anoPgto;
   diaSem = diaDaSemana( diaPgto, mesPgto, anoPgto );
   if( diaSem == SAB )
     diaPgto = diaPgto + 2;
   else if( diaSem == DOM )
     diaPgto++;
   cout << "Data do pagamento: " << diaPgto << "/" << mesPgto << "/"
        << anoPgto << endl;
}

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.


Créditos: Documento produzido pelo Prof. Armando L.N. Delgado (DINF/ET/UFPR), baseado em revisão sobre material de Prof. Carmem Hara e Prof. Wagner Zola (DINF/ET/UFPR).

Esta obra está licenciada com uma Licença Creative Commons Atribuição-NãoComercial-CompartilhaIgual 4.0 Internacional.  Licença Creative Commons

Armando Luiz Nicolini Delgado
2020-10-20