Calculateur d'aire de formes
Fait partie de la section Programmation Orientée Objet du Journey Rust de Coddy. Leçon 61 sur 61.
Défi
FacileCe défi final réunit les traits, les objets de trait et le polymorphisme pour résoudre un problème pratique : calculer la surface totale de différentes formes stockées dans une seule collection.
Construisons un calculateur de surface de formes qui démontre la puissance des objets de trait et du polymorphisme ! Vous allez créer un système dans lequel différentes formes, des cercles et des carrés, peuvent être stockées ensemble dans une seule collection et leur surface totale calculée au moyen d’une interface unifiée.
Vous organiserez votre code dans trois fichiers :
shape.rs: définissez le traitShapeavec une méthodeareaqui renvoie unf64. Ce trait établit le contrat que toutes les formes doivent respecter.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 la formule de surface appropriée. Pour les cercles, utilisez3.14159comme valeur de π.main.rs: importez les deux modules et créez une fonctiontotal_areaqui accepte unVec<Box<dyn Shape>>et renvoie la somme de toutes les surfaces. À l’aide des entrées fournies, créez un cercle et un carré, stockez-les dans un vecteur d’objets de trait, calculez la surface totale et affichez le résultat.
Les formules de surface sont les suivantes :
- Cercle :
3.14159 × radius × radius - Carré :
side × side
Votre sortie doit afficher la surface 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.56636Cela s’explique ainsi : surface du cercle = 3.14159 × 2² = 12.56636, surface 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 toutes les deux comme un 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 f64
fn total_area(shapes: Vec<Box<dyn Shape>>) -> f64 {
// TODO : Calculer et retourner la somme de toutes les aires des 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 Programmation Orientée Objet
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édiaEntraînez-vous par vous-même : Compilateur Rust en ligne