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 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 trait Shape con un método area que devuelva un f64. Este trait establece el contrato que todas las formas deben cumplir.
  • shapes.rs: Crea dos estructuras que implementen tu trait. Un Circle tiene un radius (f64), y un Square tiene un side (f64). Cada estructura debe implementar el trait Shape con su fórmula de área correspondiente. Para los círculos, 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 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.56636

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

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

Practica por tu cuenta: Compilador de Rust online