Lección 18 · 18 de 20
Enumeraciones y typedef · C
Dé nombre a valores fijos con enum en C y cree nombres de tipo cortos con typedef: un semáforo y los pedidos de una cafetería.

Un `enum` da nombres a un conjunto de números enteros. En enum Light { RED, YELLOW, GREEN }, RED vale 0, YELLOW 1 y GREEN 2. El código se lee mejor con RED que con un 0 suelto, y el compilador puede avisar si un switch olvida algún caso.
next usa un switch sobre el enum para seguir el orden del semáforo: rojo, verde, amarillo y vuelta a rojo. Como los valores son números, también sirven de índice: light_names[light] busca el nombre en un array de textos.
Los valores se pueden elegir: en SMALL = 1, MEDIUM, LARGE, los siguientes continúan contando, así que MEDIUM es 2 y LARGE 3. Por eso size_names empieza con un texto vacío en la posición 0.
`typedef` da otro nombre a un tipo. Gracias a él se escribe Size en vez de enum ... y Coffee en vez de struct .... El struct de Coffee se declara en una sola línea y el array orders guarda tres pedidos, que el for escribe en columnas.
Código · main.c
#include <stdio.h>// enum names a set of whole numbers: RED is 0, YELLOW 1, GREEN 2.enum Light { RED, YELLOW, GREEN };// typedef gives a type a short name; values can be chosen.typedef enum { SMALL = 1, MEDIUM, LARGE } Size; // MEDIUM is 2typedef struct { char name[12]; Size size; double price; } Coffee;enum Light next(enum Light light) { switch (light) { case RED: return GREEN; case GREEN: return YELLOW; default: return RED; }}int main(void) { const char *light_names[] = {"red", "yellow", "green"}; enum Light light = RED; for (int i = 0; i < 4; i++) { printf("Light %d: %s\n", light, light_names[light]); light = next(light); } const char *size_names[] = {"", "small", "medium", "large"}; Coffee orders[] = {{"Latte", MEDIUM, 2.10}, {"Espresso", SMALL, 1.40}, {"Mocha", LARGE, 2.60}}; for (int i = 0; i < 3; i++) printf("%-9s %-7s %.2f\n", orders[i].name, size_names[orders[i].size], orders[i].price); return 0;}Salida · cc main.c -o main && ./main
Light 0: red Light 2: green Light 1: yellow Light 0: red Latte medium 2.10 Espresso small 1.40 Mocha large 2.60
Para recordar
enumda nombre a valores enteros: el primero vale 0.- Se puede fijar el valor:
SMALL = 1; los siguientes continúan. - Un
enumfunciona bien en unswitchy como índice. typedefcrea un nombre corto para un tipo.- Con
typedef struct { ... } Nombre;ya no hace falta escribirstruct.
Ejercicio
Añada un enum Milk { WHOLE, SKIMMED, OAT } y un campo milk en Coffee, y escriba también el tipo de leche de cada pedido.