Menu
Coddy logo textTech

Métodos auxiliares

Parte de la sección Object Oriented Programming del Journey de C de Coddy — lección 10 de 61.

Hasta ahora, hemos visto funciones que modifican datos de estructuras (como player_take_damage) y funciones que simplemente los muestran. Pero hay otra categoría importante: funciones que calculan valores derivados a partir de los miembros de la estructura sin cambiar nada.

Considera una estructura Rectangle que almacena el ancho y el alto. El área no se almacena; se calcula bajo demanda:

typedef struct {
    double width;
    double height;
} Rectangle;

double rectangle_area(const Rectangle *self) {
    return self->width * self->height;
}

double rectangle_perimeter(const Rectangle *self) {
    return 2 * (self->width + self->height);
}

Estos son métodos auxiliares—toman los datos existentes del struct y producen un nuevo valor. Observa que utilizan punteros const, ya que solo leen, nunca escriben. El resultado calculado se devuelve en lugar de almacenarse en el struct.

Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box));       // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0

Este patrón mantiene tus structs ligeros: almacena solo los datos esenciales y calcula todo lo demás cuando sea necesario. También garantiza que los valores derivados sean siempre consistentes con el estado actual.

challenge icon

Desafío

Fácil

Vamos a construir un módulo Circle que calcule valores derivados a partir de datos almacenados. Practicarás la escritura de métodos auxiliares: funciones que calculan resultados a partir de miembros de una estructura sin modificarlos.

Crearás tres archivos:

  • circle.h: Declara una estructura Circle con un único miembro double radius. También declara dos métodos auxiliares:
    • circle_area — recibe un puntero const a Circle y devuelve el área
    • circle_circumference — recibe un puntero const a Circle y devuelve la circunferencia
    Usa protectores de inclusión (include guards) con el símbolo CIRCLE_H.
  • circle.c: Implementa ambos métodos auxiliares. Para los cálculos, usa 3.14159 como el valor de pi. La fórmula del área es pi * radius * radius, y la fórmula de la circunferencia es 2 * pi * radius. Ambas funciones solo deben leer el radio, nunca modificarlo.
  • main.c: Crea un Circle y usa los métodos auxiliares para calcular y mostrar sus propiedades.

Recibirás una entrada: el radius del círculo (como un double).

In su archivo principal, inicializa un Circle con el radio dado, luego usa tus métodos auxiliares para calcular e imprimir el área y la circunferencia.

Imprime los resultados en este formato:

Area: {area}
Circumference: {circumference}

Usa %.2f para ambos valores para mostrar dos decimales.

Por ejemplo, con un radio de 5.0, la salida sería:

Area: 78.54
Circumference: 31.42

Hoja de referencia

Las funciones pueden calcular valores derivados de los miembros de una estructura sin modificar la estructura. Estos se denominan métodos auxiliares.

Los métodos auxiliares utilizan punteros const ya que solo leen datos, nunca escriben:

typedef struct {
    double width;
    double height;
} Rectangle;

double rectangle_area(const Rectangle *self) {
    return self->width * self->height;
}

double rectangle_perimeter(const Rectangle *self) {
    return 2 * (self->width + self->height);
}

Uso de métodos auxiliares:

Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box));       // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0

Este patrón mantiene las estructuras ligeras al almacenar solo los datos esenciales y calcular los valores derivados bajo demanda, garantizando la coherencia con el estado actual.

Pruébalo tú mismo

#include <stdio.h>
#include "circle.h"

int main() {
    double radius;
    scanf("%lf", &radius);
    
    // TODO: Crear una estructura Circle con el radius dado
    
    // TODO: Usar los métodos auxiliares circle_area y circle_circumference
    // para calcular e imprimir los resultados
    
    // Formato de impresión:
    // printf("Area: %.2f\n", ...);
    // printf("Circumference: %.2f\n", ...);
    
    return 0;
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Object Oriented Programming