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 traits, objetos de trait y polimorfismo para resolver un problema práctico: calcular el área total de diferentes figuras almacenadas en una sola colección.
¡Construyamos una calculadora del área de una shape que demuestre el poder de los objetos de trait y el polimorfismo! Crearás un sistema donde diferentes figuras, Circle y Square, puedan almacenarse juntas en una sola colección y su área total pueda calcularse mediante una interfaz unificada.
Organizarás tu código en tres archivos:
shape.rs: Define el traitShapecon un métodoareaque devuelve unf64. Este trait establece el contrato que todas las figuras deben cumplir.shapes.rs: Crea dos structs que implementen tu trait. UnCircletiene unradius(f64), y unSquaretiene unside(f64). Cada struct debe implementar el traitShapecon su fórmula de área correspondiente. Para Circle, 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 Circle y un Square, almacénalos en un vector de objetos de trait, calcula el área total e imprime el resultado.
Las fórmulas del área son:
- Circle:
3.14159 × radius × radius - Square:
side × side
Tu salida debe mostrar el área total de todas las figuras:
Total area: {total}Por ejemplo, con las entradas 2.0 (radio de Circle) y 3.0 (lado de Square):
Total area: 21.56636Esto se debe a que: área de Circle = 3.14159 × 2² = 12.56636, área de Square = 3² = 9, Total = 21.56636
Y con las entradas 1.0 y 4.0:
Total area: 19.14159Recibirás dos entradas: el radio de Circle y la longitud del lado de Square (convierte ambas con f64).
Pruébalo tú mismo
mod shape;
mod shapes;
use shape::Shape;
use shapes::{Circle, Square};
// TODO: Implementa la función total_area
// Debería 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: Calcula y devuelve 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: Crea un Circle con el radio dado
// TODO: Crea un Square con el lado dado
// TODO: Almacena ambas formas en un Vec<Box<dyn Shape>>
// TODO: Llama a total_area e imprime 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