Calcolatore dell’area delle figure
Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 61 di 61.
Sfida
FacileQuesta sfida finale combina trait, oggetti trait e polimorfismo per risolvere un problema pratico: calcolare l'area totale di forme diverse memorizzate in un'unica raccolta.
Costruiamo un calcolatore dell'area delle forme che dimostri la potenza degli oggetti trait e del polimorfismo! Creerai un sistema in cui forme diverse, cerchi e quadrati, possono essere memorizzate insieme in un'unica raccolta e la loro area totale può essere calcolata tramite un'interfaccia unificata.
Organizzerai il codice in tre file:
shape.rs: Definisci il traitShapecon un metodoareache restituisce unf64. Questo trait stabilisce il contratto che tutte le forme devono rispettare.shapes.rs: Crea due struct che implementano il tuo trait. UnCircleha unradius(f64) e unSquareha unside(f64). Ogni struct deve implementare il traitShapecon la formula appropriata per calcolarne l'area. Per i cerchi, usa3.14159come π.main.rs: Includi entrambi i moduli e crea una funzionetotal_areache accetta unVec<Box<dyn Shape>>e restituisce la somma di tutte le aree. Usando gli input forniti, crea un cerchio e un quadrato, memorizzali in un vettore di oggetti trait, calcola l'area totale e stampa il risultato.
Le formule per calcolare l'area sono:
- Cerchio:
3.14159 × radius × radius - Quadrato:
side × side
L'output deve mostrare l'area totale di tutte le forme:
Total area: {total}Per esempio, con gli input 2.0 (raggio del cerchio) e 3.0 (lato del quadrato):
Total area: 21.56636Questo perché: area del cerchio = 3.14159 × 2² = 12.56636, area del quadrato = 3² = 9, totale = 21.56636
E con gli input 1.0 e 4.0:
Total area: 19.14159Riceverai due input: il raggio del cerchio e la lunghezza del lato del quadrato (analizzali entrambi come f64).
Provalo tu
mod shape;
mod shapes;
use shape::Shape;
use shapes::{Circle, Square};
// TODO: Implementa la funzione total_area
// Deve accettare un Vec<Box<dyn Shape>> e restituire la somma delle aree come f64
fn total_area(shapes: Vec<Box<dyn Shape>>) -> f64 {
// TODO: Calcola e restituisci la somma delle aree di tutte le forme
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: Crea un Circle con il raggio dato
// TODO: Crea uno Square con il lato dato
// TODO: Memorizza entrambe le forme in un Vec<Box<dyn Shape>>
// TODO: Chiama total_area e stampa il risultato nel formato: "Total area: {total}"
}
Tutte le lezioni di Programmazione orientata agli oggetti
1Metodi e comportamento
Introduzione ai blocchi implIl parametro selfMetodi mutabiliFunzioni associateBlocchi impl multipliConcatenamento di metodiRiepilogo - Azioni sul rettangolo4Progetto: animale domestico virtuale
Definire l'animaleNutrire l'animale7Trait standard
Il trait DebugIl trait DisplayClone e CopyTrait di uguaglianzaRiepilogo - Punto stampabile10Progetto: sistema di documenti
Il trait DrawComponente di testo2Incapsulamento e moduli
Nozioni di base sui moduliLa parola chiave publicCampi privatiGetterSetterRiepilogo - Armadietto sicuro5Generics
Struct genericheMetodi genericiPiù tipi genericiFunzioni genericheRipasso - Punto di coordinate8I Trait come vincoli
Sintassi dei vincoli sui traitVincoli multipliLa clausola whereRestituire tipi con i traitRiepilogo - Stampante generica11Modelli di progettazione in Rust
Pattern NewtypeComposizioneIl trait DropFrom e IntoRipasso - Mock con smart pointer3Enumerazioni avanzate
Enumerazioni con datiMetodi sulle enumerazioniCorrispondenza delle varianti con datiL'enumerazione Option ripresaRiepilogo - enumerazione Shape6Definizione dei trait
Che cos’è un trait?Implementare i traitImplementazioni predefiniteSovrascrivere le implementazioni predefiniteTrait con parametriRiepilogo - Lettore multimedialeEsercitati da solo: Compilatore Rust online