Calculadora de área de figuras
Parte de la sección Programación Orientada a Objetos del Journey de Rust de Coddy. Lección 61 de 61.
Desafío
FácilEste desafío final reúne los rasgos, los objetos de rasgo y el 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 figuras que demuestre el poder de los objetos de rasgo y el polimorfismo! Crearás un sistema en el que diferentes figuras, círculos y cuadrados, se puedan almacenar juntas en una sola colección y cuyo área total se pueda calcular mediante una interfaz unificada.
Organizarás tu código en tres archivos:
shape.rs: Define el rasgoShapecon un métodoareaque devuelve unf64. Este rasgo establece el contrato que todas las figuras deben cumplir.shapes.rs: Crea dos estructuras que implementen tu rasgo. UnCircletiene unradius(f64), y unSquaretiene unside(f64). Cada estructura debe implementar el rasgoShapecon 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, guárdalos en un vector de objetos de rasgo, calcula el área total e imprime el resultado.
Las fórmulas del área son:
- Círculo:
3.14159 × radius × radius - Cuadrado:
side × side
Tu salida debe mostrar el área total de todas las figuras:
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 ambas como 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 Programación Orientada a Objetos
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