Menu
Coddy logo textTech

Calculadora de área de figuras

Parte de la sección Object Oriented Programming del Journey de Rust de Coddy. Lección 61 de 61.

challenge icon

Desafío

Fácil

Este 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 trait Shape con un método area que devuelve un f64. Este trait establece el contrato que todas las figuras deben cumplir.
  • shapes.rs: Crea dos structs que implementen tu trait. Un Circle tiene un radius (f64), y un Square tiene un side (f64). Cada struct debe implementar el trait Shape con su fórmula de área correspondiente. Para Circle, usa 3.14159 como π.
  • main.rs: Importa ambos módulos y crea una función total_area que acepte un Vec<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.56636

Esto 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.14159

Recibirá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

Practica por tu cuenta: Compilador de Rust online