Menu
Coddy logo textTech

Calculadora de Área de Formas

Parte da seção Object Oriented Programming do Journey de Rust da Coddy — lição 61 de 61.

challenge icon

Desafio

Fácil

Este desafio final reúne traits, trait objects e polimorfismo para resolver um problema prático: calcular a área total de diferentes formas armazenadas em uma única coleção.

Vamos construir uma calculadora de área de formas que demonstra o poder dos trait objects e do polimorfismo! Você criará um sistema onde diferentes formas — círculos e quadrados — podem ser armazenadas juntas em uma única coleção e ter sua área total calculada através de uma interface unificada.

Você organizará seu código em três arquivos:

  • shape.rs: Defina a trait Shape com um método area que retorna um f64. Esta trait estabelece o contrato que todas as formas devem cumprir.
  • shapes.rs: Crie duas structs que implementam sua trait. Um Circle tem um radius (f64), e um Square tem um side (f64). Cada struct deve implementar a trait Shape com sua fórmula de área apropriada. Para círculos, use 3.14159 como π.
  • main.rs: Importe ambos os módulos e crie uma função total_area que aceita um Vec<Box<dyn Shape>> e retorna a soma de todas as áreas. Usando as entradas fornecidas, crie um círculo e um quadrado, armazene-os em um vetor de trait objects, calcule a área total e imprima o resultado.

As fórmulas de área são:

  • Círculo: 3.14159 × radius × radius
  • Quadrado: side × side

Sua saída deve exibir a área total de todas as formas:

Total area: {total}

Por exemplo, com as entradas 2.0 (raio do círculo) e 3.0 (lado do quadrado):

Total area: 21.56636

Isso ocorre porque: Área do círculo = 3.14159 × 2² = 12.56636, Área do quadrado = 3² = 9, Total = 21.56636

E com as entradas 1.0 e 4.0:

Total area: 19.14159

Você receberá duas entradas: o raio do círculo e o comprimento do lado do quadrado (analise ambos como f64).

Experimente você mesmo

mod shape;
mod shapes;

use shape::Shape;
use shapes::{Circle, Square};

// TODO: Implemente a função total_area
// Deve aceitar um Vec<Box<dyn Shape>> e retornar a soma de todas as áreas como f64
fn total_area(shapes: Vec<Box<dyn Shape>>) -> f64 {
    // TODO: Calcule e retorne a soma de todas as áreas das 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: Crie um Circle com o raio fornecido
    // TODO: Crie um Square com o lado fornecido
    // TODO: Armazene ambas as formas em um Vec<Box<dyn Shape>>
    // TODO: Chame total_area e imprima o resultado no formato: "Total area: {total}"
}

Todas as lições de Object Oriented Programming