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.
Desafío
FácilVamos 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 estructuraCirclecon un único miembrodouble radius. También declara dos métodos auxiliares:circle_area— recibe un punteroconsta Circle y devuelve el áreacircle_circumference— recibe un punteroconsta Circle y devuelve la circunferencia
CIRCLE_H.circle.c: Implementa ambos métodos auxiliares. Para los cálculos, usa3.14159como el valor de pi. La fórmula del área espi * radius * radius, y la fórmula de la circunferencia es2 * 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.42Prué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;
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Object Oriented Programming
1Fundamentos de programación modular
Archivos de cabeceraGuardas de inclusiónArchivos fuenteFunciones estáticasRepaso: Calculadora modular4Encapsulamiento
Concepto de punteros opacosDefinición de structs opacosGetters y SettersValidación en settersResumen: Caja secreta7Punteros a funciones
Declaración de punteros a funcionesLlamada a punteros a funcionesTypedef para punteros a funcionesPasar funciones como argumentosRepaso: Dispatch de calculadora10Contenedores genéricos
Repaso de punteros voidWrapper genéricoSwap genéricoComparación genéricaRepaso: Array genérico2Objetos y métodos
Structs como objetosEl puntero 'Self'Const CorrectnessPuntero vs. ValorMétodos auxiliaresResumen: Point Manager5Proyecto: Cuenta bancaria simple
Configuración del proyectoImplementación de la cuenta3Ciclo de vida de los objetos
Patrón ConstructorPatrón DestructorInicialización en StackCopia profundaResumen: String Wrapper6Herencia mediante composición
Incrustación de StructsLa regla del primer miembroAcceso a miembros padreUpcastingResumen: Jerarquía de formas9Proyecto: Dibujador de figuras
Descripción general del proyectoImplementación del círculoImplementación del rectánguloUso polimórficoContenedor de figuras