Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
c:tipos_enumerados [2023/08/01 18:10] – criada maziero | c:tipos_enumerados [2023/08/01 20:16] (atual) – edição externa 127.0.0.1 | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== Tipos enumerados ====== | ||
+ | |||
+ | {{ progc_enum.mkv |Video desta aula}} | ||
+ | |||
+ | {{ numbers.png|https:// | ||
+ | |||
+ | 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: | ||
+ | |||
+ | <code c> | ||
+ | // 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 '' | ||
+ | |||
+ | <code c> | ||
+ | typedef enum { BLACK, BLUE, GREEN, RED, YELLOW, WHITE } Color_t ; | ||
+ | |||
+ | Color_t c1; | ||
+ | </ | ||
+ | |||
+ | Variáveis enumeradas podem ser usadas como variáveis inteiras: | ||
+ | |||
+ | <code c> | ||
+ | // 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: | ||
+ | |||
+ | <code c> | ||
+ | typedef enum { | ||
+ | BLACK = 1, | ||
+ | BLUE, | ||
+ | GREEN, | ||
+ | RED = 10, | ||
+ | YELLOW, | ||
+ | WHITE | ||
+ | } Color_t ; | ||
+ | </ | ||
+ | |||
+ | Os valores inteiros associados à enumeração são: | ||
+ | |||
+ | ^ valor simbólico | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | |||
+ | 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: | ||
+ | |||
+ | <code c> | ||
+ | typedef enum | ||
+ | { | ||
+ | FALSE = 0, | ||
+ | False = 0, | ||
+ | false = 0, | ||
+ | TRUE = 1, | ||
+ | True = 1, | ||
+ | true = 1 | ||
+ | } bool_t ; | ||
+ | |||
+ | bool_t flag ; | ||
+ | </ | ||
+ | |||
+ | ===== Imprimindo tipos enumerados ===== | ||
+ | |||
+ | Internamente, | ||
+ | |||
+ | <code c print_enum.c> | ||
+ | #include < | ||
+ | |||
+ | // tipo " | ||
+ | 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: | ||
+ | |||
+ | <code c color-array.c> | ||
+ | #include < | ||
+ | |||
+ | // tipo " | ||
+ | typedef enum { BLACK, BLUE, GREEN, RED, YELLOW, WHITE } Color_t ; | ||
+ | |||
+ | // nome das cores | ||
+ | char *color_name[] = {" | ||
+ | |||
+ | int main () | ||
+ | { | ||
+ | Color_t c1; | ||
+ | |||
+ | // ... | ||
+ | c1 = BLUE ; | ||
+ | |||
+ | printf ("Cor %s\n", color_name[c1]) ; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <note important> | ||
+ | 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 '' | ||
+ | |||
+ | <code c color-switch.c> | ||
+ | #include < | ||
+ | |||
+ | // tipo " | ||
+ | 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 (" | ||
+ | case BLUE : return (" | ||
+ | case GREEN : return (" | ||
+ | case RED : return (" | ||
+ | case YELLOW | ||
+ | case WHITE : return (" | ||
+ | default | ||
+ | } | ||
+ | } | ||
+ | |||
+ | 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 '' | ||
+ | - Escreva um programa em C capaz de receber um número e classificá-lo, | ||
+ | - Escreva um programa em C que leia uma determinada sequência de caracteres, que seja capaz de classificar cada um deles entre '' | ||