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, objetos de trait e polimorfismo para resolver um problema prático: calcular a área total de diferentes formas armazenadas em uma única coleção.

Vamos criar um calculador de área de formas que demonstra o poder dos objetos de trait e do polimorfismo! Você criará um sistema em que diferentes formas, circle e square, podem ser armazenadas juntas em uma única coleção e ter sua área total calculada por meio de uma interface unificada.

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

  • shape.rs: Defina o trait Shape com um method area que retorna um f64. Esse trait estabelece o contrato que todas as formas devem cumprir.
  • shapes.rs: Crie duas structs que implementam seu trait. Um Circle tem um radius (f64), e um Square tem um side (f64). Cada struct deve implementar o trait Shape com sua fórmula de área apropriada. Para circles, use 3.14159 como π.
  • main.rs: Inclua ambos os módulos e crie uma total_area function que aceita um Vec<Box<dyn Shape>> e retorna a soma de todas as áreas. Usando as entradas fornecidas, crie um circle e um square, armazene-os em um vetor de objetos de trait, calcule a área total e imprima o resultado.

As fórmulas de área são:

  • Circle: 3.14159 × radius × radius
  • Square: 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 circle) e 3.0 (lado do square):

Total area: 21.56636

Isso ocorre porque: área do Circle = 3.14159 × 2² = 12.56636, área do Square = 3² = 9, Total = 21.56636

E com as entradas 1.0 e 4.0:

Total area: 19.14159

Você receberá duas entradas: o radius do circle e o comprimento do side do square (faça o parse de ambos como f64).

Experimente você mesmo

mod shape;
mod shapes;

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

// TODO: Implemente a função total_area
// Ela 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