Calculadora de área de figuras
Parte de la sección Object Oriented Programming del Journey de Rust de Coddy — lección 61 de 61.
Desafío
FácilEste desafío final reúne rasgos (traits), objetos de rasgo (trait objects) y polimorfismo para resolver un problema práctico: calcular el área total de diferentes formas almacenadas en una sola colección.
¡Vamos a construir una calculadora de área de formas que demuestre el poder de los objetos de rasgo y el polimorfismo! Crearás un sistema donde diferentes formas —círculos y cuadrados— pueden almacenarse juntas en una sola colección y calcular su área total a través de una interfaz unificada.
Organizarás tu código en tres archivos:
shape.rs: Define el traitShapecon un métodoareaque devuelva unf64. Este trait establece el contrato que todas las formas deben cumplir.shapes.rs: Crea dos estructuras que implementen tu trait. UnCircletiene unradius(f64), y unSquaretiene unside(f64). Cada estructura debe implementar el traitShapecon su fórmula de área correspondiente. Para los círculos, usa3.14159como π.main.rs: Importa ambos módulos y crea una funcióntotal_areaque acepte unVec<Box<dyn Shape>>y devuelva la suma de todas las áreas. Usando las entradas proporcionadas, crea un círculo y un cuadrado, almacénalos en un vector de objetos de rasgo, calcula el área total e imprime el resultado.
Las fórmulas de área son:
- Círculo:
3.14159 × radius × radius - Cuadrado:
side × side
Tu salida debe mostrar el área total de todas las formas:
Total area: {total}Por ejemplo, con las entradas 2.0 (radio del círculo) y 3.0 (lado del cuadrado):
Total area: 21.56636Esto se debe a que: Área del círculo = 3.14159 × 2² = 12.56636, Área del cuadrado = 3² = 9, Total = 21.56636
Y con las entradas 1.0 y 4.0:
Total area: 19.14159Recibirás dos entradas: el radio del círculo y la longitud del lado del cuadrado (analiza ambos como f64).
Pruébalo tú mismo
mod shape;
mod shapes;
use shape::Shape;
use shapes::{Circle, Square};
// TODO: Implementar la función total_area
// Debe aceptar un Vec<Box<dyn Shape>> y devolver la suma de todas las áreas como f64
fn total_area(shapes: Vec<Box<dyn Shape>>) -> f64 {
// TODO: Calcular y devolver la suma de todas las áreas de las formas
0.0
}
fn main() {
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let radius: f64 = input1.trim().parse().expect("Invalid number");
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let side: f64 = input2.trim().parse().expect("Invalid number");
// TODO: Crear un Circle con el radio dado
// TODO: Crear un Square con el lado dado
// TODO: Almacenar ambas formas en un Vec<Box<dyn Shape>>
// TODO: Llamar a total_area e imprimir el resultado en el formato: "Total area: {total}"
}
Todas las lecciones de Object Oriented Programming
1Métodos y Comportamiento
Intro a Bloques de ImplementaciónEl Parámetro SelfMétodos MutablesFunciones AsociadasMúltiples Bloques de ImplementaciónEncadenamiento de MétodosResumen - Acciones de Rectángulo4Proyecto: Mascota virtual
Definir la mascotaAlimentar a la mascota7Traits estándar
El trait DebugEl trait DisplayClone y CopyTraits de igualdadResumen - Punto imprimible10Proyecto: Sistema de documentos
El Trait DrawComponente de texto2Encapsulamiento y módulos
Conceptos básicos de módulosLa palabra clave PublicCampos privadosGettersSettersRepaso - Casillero seguro5Genéricos
Estructuras genéricasMétodos genéricosMúltiples tipos genéricosFunciones genéricasResumen - Punto de coordenadas8Traits como límites
Sintaxis de límites de traitsLímites múltiplesLa cláusula whereRetornar tipos con traitsResumen: Impresora genérica11Patrones de diseño en Rust
Patrón NewtypeComposiciónEl Trait DropFrom e IntoResumen - Mock de Smart Pointer3Enums avanzados
Enums con datosMétodos en EnumsCoincidencia de variantes de datosEl Enum Option revisitadoResumen - Enum Shape6Definición de Traits
¿Qué es un Trait?Implementación de TraitsImplementaciones por defectoSobrescribir valores por defectoTraits con parámetrosResumen - Reproductor multimedia