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

Pratique por conta própria: Compilador de Rust online