Calculateur d'aire de formes
Fait partie de la section Object Oriented Programming du Journey Rust de Coddy — leçon 61 sur 61.
Défi
FacileCe défi final rassemble les traits, les objets de trait et le polymorphisme pour résoudre un problème pratique : calculer l'aire totale de différentes formes stockées dans une seule collection.
Construisons un calculateur d'aire de formes qui démontre la puissance des objets de trait et du polymorphisme ! Vous allez créer un système où différentes formes — cercles et carrés — peuvent être stockées ensemble dans une seule collection et voir leur aire totale calculée via une interface unifiée.
Vous organiserez votre code sur trois fichiers :
shape.rs: Définissez le traitShapeavec une méthodeareaqui retourne unf64. Ce trait établit le contrat que toutes les formes doivent remplir.shapes.rs: Créez deux structures qui implémentent votre trait. UnCirclepossède unradius(f64), et unSquarepossède unside(f64). Chaque structure doit implémenter le traitShapeavec sa formule d'aire appropriée. Pour les cercles, utilisez3.14159comme π.main.rs: Importez les deux modules et créez une fonctiontotal_areaqui accepte unVec<Box<dyn Shape>>et retourne la somme de toutes les aires. En utilisant les entrées fournies, créez un cercle et un carré, stockez-les dans un vecteur d'objets de trait, calculez l'aire totale et affichez le résultat.
Les formules d'aire sont :
- Cercle :
3.14159 × radius × radius - Carré :
side × side
Votre sortie doit afficher l'aire totale de toutes les formes :
Total area: {total}Par exemple, avec les entrées 2.0 (rayon du cercle) et 3.0 (côté du carré) :
Total area: 21.56636C'est parce que : Aire du cercle = 3.14159 × 2² = 12.56636, Aire du carré = 3² = 9, Total = 21.56636
Et avec les entrées 1.0 et 4.0 :
Total area: 19.14159Vous recevrez deux entrées : le rayon du cercle et la longueur du côté du carré (analysez les deux comme f64).
Essayez vous-même
mod shape;
mod shapes;
use shape::Shape;
use shapes::{Circle, Square};
// TODO: Implémenter la fonction total_area
// Elle doit accepter un Vec<Box<dyn Shape>> et retourner la somme de toutes les aires en tant que f64
fn total_area(shapes: Vec<Box<dyn Shape>>) -> f64 {
// TODO: Calculer et retourner la somme des aires de toutes les formes
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: Créer un Circle avec le rayon donné
// TODO: Créer un Square avec le côté donné
// TODO: Stocker les deux formes dans un Vec<Box<dyn Shape>>
// TODO: Appeler total_area et afficher le résultat au format : "Total area: {total}"
}
Toutes les leçons de Object Oriented Programming
1Méthodes et comportement
Introduction aux blocs d'implémentationLe paramètre SelfMéthodes mutablesFonctions associéesBlocs d'implémentation multiplesChaînage de méthodesRécapitulatif - Actions sur le rectangle4Projet : Animal virtuel
Définir l'animalNourrir l'animal7Traits standards
Le trait DebugLe trait DisplayClone et CopyLes traits d'égalitéRécapitulatif - Point affichable10Projet : Système de documents
Le trait DrawComposant texte2Encapsulation et modules
Bases des modulesLe mot-clé publicChamps privésGettersSettersRécapitulatif - Casier sécurisé5Généricité
Structures génériquesMéthodes génériquesPlusieurs types génériquesFonctions génériquesRécapitulatif - Point de coordonnées8Les Traits comme contraintes
Syntaxe des contraintes de traitContraintes multiplesLa clause whereRetourner des types avec des traitsRécapitulatif - Afficheur générique11Design Patterns en Rust
Le pattern NewtypeCompositionLe trait DropFrom et IntoRécapitulatif - Mock de Smart Pointer3Enums avancées
Enums avec donnéesMéthodes sur les EnumsMatching des variantes de donnéesL'Enum Option revisitéeRécapitulatif - Enum Shape6Définition des Traits
Qu'est-ce qu'un Trait ?Implémenter des TraitsImplémentations par défautRedéfinir les comportements par défautTraits avec paramètresRécapitulatif - Lecteur multimédia