Enums en sentencias switch
Parte de la sección Logic & Flow del Journey de C de Coddy — lección 57 de 63.
Una de las combinaciones más potentes en la programación en C es el uso de valores enum con sentencias switch. Esta combinación crea una lógica de flujo de control excepcionalmente legible y fácil de mantener que expresa claramente el proceso de toma de decisiones de su programa.
Cuando usas constantes de enumeración (enum) como casos en una sentencia switch, el código se vuelve autodocumentado. En lugar de ver números misteriosos como case 0: o case 5:, ves nombres significativos que transmiten inmediatamente su 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;
}Este enfoque hace que su código sea mucho más fácil de entender y modificar. Cualquier persona que lea este código sabrá inmediatamente qué representa cada caso, y añadir nuevos casos o cambiar la lógica se vuelve sencillo. El compilador también ayuda a detectar errores: si escribe mal una constante de enumeración (enum), obtendrá un error de compilación en lugar de un error silencioso.
Desafío
FácilCrea un programa en C que utilice un enum con una sentencia switch para construir un sistema simple de asesoramiento meteorológico. Tu programa debe:
- Definir un
enumllamadoWeatherConditioncon las siguientes constantes en este orden exacto:SUNNYCLOUDYRAINYSTORMYSNOWY
- Escribir una función llamada
getWeatherAdviceque:- Reciba un parámetro
enum WeatherConditionllamadoweather - No devuelva nada (void)
- Utilice una sentencia
switchpara imprimir consejos específicos del clima basados en la condición:- Para
SUNNY: imprimePerfect day for outdoor activities! - Para
CLOUDY: imprimeGood day for a walk, no sun protection needed. - Para
RAINY: imprimeDon't forget your umbrella! - Para
STORMY: imprimeStay indoors and avoid travel. - Para
SNOWY: imprimeDrive carefully and dress warmly.
- Para
- Reciba un parámetro
- Escribir una función llamada
getActivitySuggestionque:- Reciba un parámetro
enum WeatherConditionllamadoweather - No devuelva nada (void)
- Utilice una sentencia
switchpara sugerir actividades basadas en el clima:- Para
SUNNY: imprimeSuggested activity: Beach or hiking - Para
CLOUDY: imprimeSuggested activity: Photography or gardening - Para
RAINY: imprimeSuggested activity: Reading or indoor games - Para
STORMY: imprimeSuggested activity: Movie marathon - Para
SNOWY: imprimeSuggested activity: Skiing or hot cocoa
- Para
- Reciba un parámetro
- En la función main:
- Declarar una variable de tipo
enum WeatherConditionllamadacurrentWeather - Leer un entero de la entrada que represente la condición climática (0, 1, 2, 3 o 4)
- Asignar el valor del enum correspondiente a
currentWeatherbasado en la entrada - Imprimir la condición climática actual en este formato exacto:
Current weather: [numeric_value] - Llamar a la función
getWeatherAdviceconcurrentWeather - Llamar a la función
getActivitySuggestionconcurrentWeather
- Declarar una variable de tipo
Este desafío demuestra el poder de combinar enums con sentencias switch para crear código legible y mantenible. En lugar de usar casos numéricos confusos en tus sentencias switch, usarás constantes de enum significativas que expresan claramente la lógica del programa. La sentencia switch se vuelve autodocumentada, lo que facilita entender qué representa cada caso y modificar el comportamiento según sea necesario.
Hoja de referencia
El uso de valores enum con sentencias switch crea una lógica de flujo de control legible y mantenible:
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;
}Este enfoque hace que el código sea autodocumentado al utilizar nombres significativos en lugar de números misteriosos como case 0: o case 5:. El compilador ayuda a detectar errores generando fallos de compilación para constantes de enumeración mal escritas en lugar de errores silenciosos.
Pruébalo tú mismo
#include <stdio.h>
// TODO: Definir el enum WeatherCondition aquí
// TODO: Implementar la función getWeatherAdvice aquí
// TODO: Implementar la función getActivitySuggestion aquí
int main() {
// Leer entrada
int weatherInput;
scanf("%d", &weatherInput);
// TODO: Declarar la variable currentWeather y asignar el valor del enum basado en la entrada
// TODO: Imprimir la condición climática actual en el formato "Current weather: [numeric_value]"
// TODO: Llamar a la función getWeatherAdvice
// TODO: Llamar a la función getActivitySuggestion
return 0;
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Logic & Flow
1Fundamentos de Punteros
¿Qué es un puntero?Declaración de punterosEl operador de dirección (&)El operador de desreferencia (*)Punteros NULLResumen: Conceptos básicos de punteros4Proyecto: Utilidad de texto simple
Descripción general del proyectoContar caracteres7Estructuras (structs)
¿Qué es un struct?Declaración de un structCreación de variables de tipo structAcceso a los miembros de un structInicialización de structsResumen: Struct de datos de estudiantes10Enums y Typedef
enum para constantes con nombreDeclaración y uso de enumsEnums en sentencias switchUso de typedef para alias de tipostypedef con structsRepaso: Práctica de typedef y enums2Punteros y Arrays
Nombres de Arrays como PunterosElementos de un Array - PunterosAritmética de PunterosComparación de PunterosResumen: Recorrido de Arrays con Punteros5Punteros y funciones
Paso por valorPasar punteros a funcionesModificar variables mediante punterosUn ejemplo clásico: Intercambio (Swap)Pasar arrays a funcionesResumen: Argumentos de punteros a funciones3Arreglos de caracteres y cadenas
Cadenas como arreglos de charEl terminador nuloEntrada de cadenas con scanfUso de strlen()Uso de strcpy()Uso de strcat()Uso de strcmp()Resumen: Funciones básicas de cadenas