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 multimediaPractica por tu cuenta: Compilador de Rust online