DMarlon Studio

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.

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

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 struct agrupa varios campos en un tipo.
  • variable.campo lee o cambia un campo.
  • Pase un puntero para que la función cambie la estructura.
  • p->campo es (*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.