====== Tipos enumerados ====== {{ progc_enum.mkv |Video desta aula}} {{ numbers.png|https://www.publicdomainpictures.net/pt/view-image.php?image=161413&picture=numeros-educacionais-para-criancas-poste}}Enumerações, ou tipos enumerados, são tipos de dados definidos pelo programador. Uma variável de tipo enumerado pode assumir um valor dentre um conjunto fixo de valores possíveis previamente definido. Um tipo enumerado é visto como um caso especial de tipo inteiro. Variáveis de tipos enumerados são implementadas pelo compilador usando valores inteiros, mas isso é transparente para o programador. ===== Declaração e uso ===== Um exemplo simples de declaração de tipo enumerado: // definição do tipo enumerado enum Color_t { BLACK, BLUE, GREEN, RED, YELLOW, WHITE } ; // declaração de variável do tipo enum Color_t enum Color_t c1; A definição do tipo enumerado também pode ser feita usando ''typedef'': typedef enum { BLACK, BLUE, GREEN, RED, YELLOW, WHITE } Color_t ; Color_t c1; Variáveis enumeradas podem ser usadas como variáveis inteiras: // atribuição c1 = GREEN ; // uso if (c1 == RED) { ... } // os valores enumerados têm uma ordem definida if (c1 >= BLUE && c1 <= YELLOW) { ... } // variáveis enumeradas podem ser incrementadas c1 = BLACK ; while (c1 <= WHITE) { ... c1++ ; } // um laço for enumerado for (c1 = BLACK; c1 <= WHITE; c1++) { ... } Por default, o primeiro valor de um tipo enumerado vale 0 (zero), o segundo valor vale 1 e assim por diante. Esses valores podem ser alterados se isso for conveniente: typedef enum { BLACK = 1, BLUE, GREEN, RED = 10, YELLOW, WHITE } Color_t ; Os valores inteiros associados à enumeração são: ^ valor simbólico ^ valor original ^ valor com atribuição ^ | ''BLACK'' | 0 | 1 | | ''BLUE'' | 1 | 2 | | ''GREEN'' | 2 | 3 | | ''RED'' | 3 | 10 | | ''YELLOW'' | 4 | 11 | | ''WHITE'' | 5 | 12 | Tipos enumerados podem ser usados para tornar o código mais legível e também diminuir erros devidos a valores imprevistos em variáveis. Um exemplo clássico de uso de tipos enumerados é a definição de um tipo booleano em C: typedef enum { FALSE = 0, False = 0, false = 0, TRUE = 1, True = 1, true = 1 } bool_t ; bool_t flag ; ===== Imprimindo tipos enumerados ===== Internamente, um tipo enumerado é representado por um inteiro, os valores simbólicos (''WHITE'', ''RED'', ...) são descartados durante a compilação. Por isso, **não é possível imprimir o valor simbólico** diretamente, apenas seus valores internos: #include // tipo "Cor" typedef enum { BLACK, BLUE, GREEN, RED, YELLOW, WHITE } Color_t ; int main () { Color_t c1; // ... c1 = BLUE ; printf ("Cor %s\n", c1) ; // errado! printf ("Cor %d\n", c1) ; // correto! } Uma forma simples de contornar esse problema consiste em usar um vetor de nomes: #include // tipo "Cor" typedef enum { BLACK, BLUE, GREEN, RED, YELLOW, WHITE } Color_t ; // nome das cores char *color_name[] = {"black", "blue", "green", "red", "yellow", "white" } ; int main () { Color_t c1; // ... c1 = BLUE ; printf ("Cor %s\n", color_name[c1]) ; } A solução acima só funciona se a enumeração usar os valores numéricos //default// (0, 1, 2, 3, ...). Uma solução mais robusta consiste em usar uma estrutura ''switch'': #include // tipo "Cor" typedef enum { BLACK, BLUE, GREEN, RED, YELLOW, WHITE } Color_t ; // define o nome da cor char* color_name (Color_t c) { switch (c) { case BLACK : return ("black") ; case BLUE : return ("blue") ; case GREEN : return ("green") ; case RED : return ("red") ; case YELLOW : return ("yellow") ; case WHITE : return ("white") ; default : return ("") ; } } int main () { Color_t c1; // ... c1 = BLUE ; printf ("Cor %s\n", color_name(c1)) ; } ===== Exercícios ===== - Escreva um programa em C capaz de classificar os alunos de uma determinada matéria de acordo com sua situação. O programa deve ser capaz de: - Ler os dados do aluno referentes a sua nota na disciplina e sua frequência. - Classificar o aluno pelas enumerações ''Aprovado'', ''Exame Final'' ou ''Reprovado'' de acordo com os dados obtidos. - Escreva um programa em C capaz de receber um número e classificá-lo, por meio de tipos enumerados, entre número par ou impar; positivo, negativo ou zero; palíndromo ou não-palíndromo; múltiplo de 10 ou não múltiplo; - Escreva um programa em C que leia uma determinada sequência de caracteres, que seja capaz de classificar cada um deles entre ''letra'', ''pontuação'' e ''caractere especial'' e guarde os dados em uma estrutura. Para o caso de letras, o programa deve ainda classificá-las, por meio de enumerações, entre ''maiúsculas'' e ''minúsculas''; ''vogais'' e ''consoantes''.