Implementación del rectángulo
Parte de la sección Object Oriented Programming del Journey de C de Coddy — lección 46 de 61.
Desafío
FácilContinuemos construyendo el proyecto Shape Drawer implementando el Rectangle — otra forma concreta que incorpora la estructura base Shape, tal como hicimos con Circle.
Basándote en tu proyecto existente, añadirás la funcionalidad de rectángulo en estos archivos:
shape.h: Mantén tu interfaz baseShapecon los tipos de punteros a funciónDrawFuncyAreaFuncde las lecciones anteriores.circle.hycircle.c: Mantén tu implementación de Circle de la lección anterior.rectangle.h: Define tu estructuraRectangleaquí. Un rectángulo incorporaShapecomo su primer miembro y añade los camposwidthyheight(ambosdouble). Declara una función constructoracreate_rectangleque reciba los parámetros width y height y devuelva unRectanglepor valor.rectangle.c: Implementa el comportamiento específico del rectángulo:draw_rectangle— imprimeDrawing Rectangle with width: X.XX and height: X.XX(ambos valores mostrados con 2 decimales)area_rectangle— devuelve width × heightcreate_rectangle— inicializa unRectangle, conecta los punteros a función de laShapeincorporada con las funciones del rectángulo, establece las dimensiones y devuelve el rectángulo
main.c: Demuestra ambas formas funcionando a través de la misma interfaz. Lee dos entradas: width y height para un rectángulo. Crea un rectángulo usando tu constructor, luego llama tanto adrawcomo aareaa través de los punteros a función de laShapeincorporada. Imprime el área con 2 decimales.
Tu programa recibirá dos entradas: los valores de width y height (como números de punto flotante).
Ejemplo de salida cuando las entradas son 4.0 y 3.0:
Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00Ejemplo de salida cuando las entradas son 7.5 y 2.5:
Drawing Rectangle with width: 7.50 and height: 2.50
Area: 18.75Al igual que con Circle, el Rectangle incorpora Shape como su primer miembro, lo que te permite acceder a los punteros a función a través del miembro incorporado. Este patrón consistente es lo que permite el polimorfismo — ambas formas pueden ser tratadas uniformemente a través de su interfaz Shape. Recuerda usar protectores de inclusión (include guards) en todos los archivos de cabecera.
Pruébalo tú mismo
#include <stdio.h>
#include "shape.h"
#include "rectangle.h"
int main() {
double width, height;
scanf("%lf", &width);
scanf("%lf", &height);
// TODO: Crear un rectángulo usando create_rectangle(width, height)
// TODO: Llamar a draw a través del puntero de función de la Shape embebida
// TODO: Llamar a area a través del puntero de función de la Shape embebida
// TODO: Imprimir el área con 2 decimales: "Area: %.2f\n"
return 0;
}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írculo