Calculadora de Área de Formas
Parte da seção Object Oriented Programming do Journey de Rust da Coddy — lição 61 de 61.
Desafio
FácilEste 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 traitShapecom um métodoareaque retorna umf64. Esta trait estabelece o contrato que todas as formas devem cumprir.shapes.rs: Crie duas structs que implementam sua trait. UmCircletem umradius(f64), e umSquaretem umside(f64). Cada struct deve implementar a traitShapecom sua fórmula de área apropriada. Para círculos, use3.14159como π.main.rs: Importe ambos os módulos e crie uma funçãototal_areaque aceita umVec<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.56636Isso 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.14159Você 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
1Métodos e Comportamento
Introdução a Blocos de ImplementaçãoO Parâmetro SelfMétodos MutáveisFunções AssociadasMúltiplos Blocos de ImplementaçãoEncadeamento de MétodosRecapitulação - Ações de Retângulo4Projeto: Pet Virtual
Definindo o PetAlimentando o Pet7Traits Padrão
A Trait DebugA Trait DisplayClone e CopyTraits de IgualdadeRecapitulação - Ponto Imprimível10Projeto: Sistema de Documentos
A Trait DrawComponente de Texto2Encapsulamento e Módulos
Fundamentos de MódulosA Palavra-chave PublicCampos PrivadosGettersSettersRecapitulação - Cofre Seguro5Genéricos
Structs GenéricasMétodos GenéricosMúltiplos Tipos GenéricosFunções GenéricasRecapitulação - Ponto de Coordenada8Traits como Restrições
Sintaxe de Restrições de TraitRestrições MúltiplasA Cláusula WhereRetornando Tipos com TraitsRecapitulação - Impressora Genérica11Padrões de Projeto em Rust
Padrão NewtypeComposiçãoA Trait DropFrom e IntoRecapitulação - Mock de Smart Pointer3Enums Avançados
Enums com DadosMétodos em EnumsCorrespondência de Variantes de DadosO Enum Option RevisitadoRecapitulação - Enum Shape6Definição de Traits
O que é uma Trait?Implementando TraitsImplementações PadrãoSobrescrevendo PadrõesTraits com ParâmetrosRecapitulação - Media Player