Enums em Instruções Switch
Parte da seção Logic & Flow do Journey de C da Coddy — lição 57 de 63.
Uma das combinações mais poderosas na programação C é o uso de valores enum com instruções switch. Essa combinação cria uma lógica de fluxo de controle excepcionalmente legível e de fácil manutenção que expressa claramente o processo de tomada de decisão do seu programa.
Quando você usa constantes enum como casos em uma instrução switch, o código se torna autodocumentado. Em vez de ver números misteriosos como case 0: ou case 5:, você vê nomes significativos que transmitem imediatamente seu propósito:
switch (day) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
printf("It's a weekday\n");
break;
case SATURDAY:
case SUNDAY:
printf("It's a weekend\n");
break;
}Esta abordagem torna seu código muito mais fácil de entender e modificar. Qualquer pessoa que ler este código saberá imediatamente o que cada caso representa, e adicionar novos casos ou alterar a lógica torna-se algo simples. O compilador também ajuda a capturar erros - se você escrever incorretamente uma constante de enum, receberá um erro de compilação em vez de um bug silencioso.
Desafio
FácilCrie um programa em C que utilize um enum com uma instrução switch para construir um sistema simples de consultoria meteorológica. Seu programa deve:
- Definir um
enumchamadoWeatherConditioncom as seguintes constantes nesta ordem exata:SUNNYCLOUDYRAINYSTORMYSNOWY
- Escrever uma função chamada
getWeatherAdviceque:- Recebe um parâmetro
enum WeatherConditionchamadoweather - Não retorna nada (void)
- Usa uma instrução
switchpara imprimir conselhos específicos sobre o clima com base na condição:- Para
SUNNY: imprimaPerfect day for outdoor activities! - Para
CLOUDY: imprimaGood day for a walk, no sun protection needed. - Para
RAINY: imprimaDon't forget your umbrella! - Para
STORMY: imprimaStay indoors and avoid travel. - Para
SNOWY: imprimaDrive carefully and dress warmly.
- Para
- Recebe um parâmetro
- Escrever uma função chamada
getActivitySuggestionque:- Recebe um parâmetro
enum WeatherConditionchamadoweather - Não retorna nada (void)
- Usa uma instrução
switchpara sugerir atividades com base no clima:- Para
SUNNY: imprimaSuggested activity: Beach or hiking - Para
CLOUDY: imprimaSuggested activity: Photography or gardening - Para
RAINY: imprimaSuggested activity: Reading or indoor games - Para
STORMY: imprimaSuggested activity: Movie marathon - Para
SNOWY: imprimaSuggested activity: Skiing or hot cocoa
- Para
- Recebe um parâmetro
- Na função main:
- Declare uma variável do tipo
enum WeatherConditionchamadacurrentWeather - Leia um número inteiro da entrada representando a condição climática (0, 1, 2, 3 ou 4)
- Atribua o valor enum correspondente a
currentWeathercom base na entrada - Imprima a condição climática atual neste formato exato:
Current weather: [numeric_value] - Chame a função
getWeatherAdvicecomcurrentWeather - Chame a função
getActivitySuggestioncomcurrentWeather
- Declare uma variável do tipo
Este desafio demonstra o poder de combinar enums com instruções switch para criar um código legível e de fácil manutenção. Em vez de usar casos numéricos confusos em suas instruções switch, você usará constantes enum significativas que expressam claramente a lógica do programa. A instrução switch torna-se autodocumentada, facilitando a compreensão do que cada caso representa e a modificação do comportamento conforme necessário.
Folha de consulta
Usar valores de enum com instruções switch cria uma lógica de fluxo de controle legível e de fácil manutenção:
switch (day) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
printf("It's a weekday\n");
break;
case SATURDAY:
case SUNDAY:
printf("It's a weekend\n");
break;
}Essa abordagem torna o código autodocumentado ao usar nomes significativos em vez de números misteriosos como case 0: ou case 5:. O compilador ajuda a capturar erros gerando erros de compilação para constantes de enum digitadas incorretamente, em vez de bugs silenciosos.
Experimente você mesmo
#include <stdio.h>
// TODO: Defina o enum WeatherCondition aqui
// TODO: Implemente a função getWeatherAdvice aqui
// TODO: Implemente a função getActivitySuggestion aqui
int main() {
// Ler entrada
int weatherInput;
scanf("%d", &weatherInput);
// TODO: Declare a variável currentWeather e atribua o valor do enum com base na entrada
// TODO: Imprima a condição climática atual no formato "Current weather: [numeric_value]"
// TODO: Chame a função getWeatherAdvice
// TODO: Chame a função getActivitySuggestion
return 0;
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Logic & Flow
1Fundamentos de Ponteiros
O que é um Ponteiro?Declarando PonteirosO Operador de Endereço (&)O Operador de Desreferência (*)Ponteiros NULLRecapitulação: Fundamentos de Ponteiros4Projeto: Utilitário de Texto Simples
Visão Geral do ProjetoContando Caracteres7Estruturas (structs)
O que é uma Struct?Declarando uma StructCriando Variáveis de StructAcessando Membros de uma StructInicializando StructsRecapitulação: Struct de Dados de Aluno10Enums e Typedef
enum para Constantes NomeadasDeclarando e Usando EnumsEnums em Instruções SwitchUsando typedef para Aliases de Tipotypedef com StructsRecapitulação: Prática de Typedef e Enum2Ponteiros e Arrays
Nomes de Arrays como PonteirosElementos de Array - PonteirosAritmética de PonteirosComparando PonteirosRecapitulação: Percorrendo Arrays com Ponteiros5Ponteiros e Funções
Passagem por ValorPassando Ponteiros para FunçõesModificando Variáveis via PonteirosUm Exemplo Clássico: SwapPassando Arrays para FunçõesRecapitulação: Ponteiros como Argumentos3Arrays de Caracteres e Strings
Strings como Arrays de charO Terminador NuloEntrada de Strings com scanfUsando strlen()Usando strcpy()Usando strcat()Usando strcmp()Recapitulação: Funções Básicas de Strings6Gerenciamento de Memória
Memória Stack vs. HeapAlocação Dinâmica - malloc()Usando sizeof() para AlocaçãoVerificando Falhas de AlocaçãoLiberando Memória com free()Alocando com calloc()Recapitulação: Array Dinâmico9Projeto: Cadastro Simples de Contatos
Projeto: Definir a Struct de ContatoFunção para Criar um Contato