Lección 17 · 17 de 20
Estructuras · C
Agrupe datos relacionados en una struct de C: los productos de una tienda con nombre, precio y existencias, el punto, la flecha y punteros.

Una estructura (struct) reúne en un solo tipo varios datos relacionados, cada uno con su nombre y su tipo. struct Product tiene tres campos: name, price y stock. Es la forma de C de describir «un producto».
Para crear una se dan los valores entre llaves en el mismo orden que los campos, como en mug, o con su nombre, como en lamp: .name = "Lamp". El punto da acceso a cada campo: mug.price = 6.95 cambia el precio. Un campo de texto se cambiaría con strcpy, como cualquier cadena.
show recibe la estructura por valor, es decir, una copia: le basta para leerla. sell, en cambio, tiene que cambiar las existencias, así que recibe un puntero: sell(&mug, 5). Con un puntero a estructura, los campos se alcanzan con la flecha: p->stock es lo mismo que (*p).stock.
sell no deja vender más de lo que hay: con 4 lámparas pedidas y 3 en el almacén, ajusta units y la lámpara queda a 0.
Código · main.c
#include <stdio.h>// A struct groups related data under one name.struct Product { char name[20]; double price; int stock;};void show(struct Product p) { // gets a copy: enough to read it printf("%-10s %6.2f stock %2d\n", p.name, p.price, p.stock);}// A pointer lets the function change the struct; -> reaches its fields.void sell(struct Product *p, int units) { if (units > p->stock) units = p->stock; p->stock -= units; printf("Sold %d x %s\n", units, p->name);}int main(void) { struct Product mug = {"Mug", 7.50, 12}; struct Product lamp = {.name = "Lamp", .price = 24.90, .stock = 3}; mug.price = 6.95; // the dot reaches each field show(mug); show(lamp); sell(&mug, 5); sell(&lamp, 4); // only 3 left show(mug); show(lamp); return 0;}Salida · cc main.c -o main && ./main
Mug 6.95 stock 12 Lamp 24.90 stock 3 Sold 5 x Mug Sold 3 x Lamp Mug 6.95 stock 7 Lamp 24.90 stock 0
Para recordar
- Una
structagrupa varios campos en un tipo. variable.campolee o cambia un campo.- Pase un puntero para que la función cambie la estructura.
p->campoes(*p).campo.- Se puede iniciar por orden o con
.campo = valor.
Ejercicio
Escriba void restock(struct Product *p, int units) que sume existencias, y una función double stock_value(struct Product p) que devuelva precio por existencias; úselas con los dos productos.