DMarlon Studio

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.

C · Enumeraciones y typedef en DMarlon Studio: el código del ejemplo y su salida en la terminal

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

  • enum da nombre a valores enteros: el primero vale 0.
  • Se puede fijar el valor: SMALL = 1; los siguientes continúan.
  • Un enum funciona bien en un switch y como índice.
  • typedef crea un nombre corto para un tipo.
  • Con typedef struct { ... } Nombre; ya no hace falta escribir struct.

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.