Flächenrechner für Formen
Teil des Abschnitts Object Oriented Programming der Rust-Journey von Coddy — Lektion 61 von 61.
Aufgabe
EinfachDiese abschließende Herausforderung führt Traits, Trait-Objekte und Polymorphismus zusammen, um ein praktisches Problem zu lösen: die Berechnung der Gesamtfläche verschiedener Formen, die in einer einzigen Sammlung gespeichert sind.
Lassen Sie uns einen Flächenrechner für Formen bauen, der die Leistungsfähigkeit von Trait-Objekten und Polymorphismus demonstriert! Sie werden ein System erstellen, in dem verschiedene Formen – Kreise und Quadrate – zusammen in einer einzigen Sammlung gespeichert werden können und deren Gesamtfläche über eine einheitliche Schnittstelle berechnet wird.
Sie werden Ihren Code auf drei Dateien verteilen:
shape.rs: Definieren Sie denShape-Trait mit einerarea-Methode, die einf64zurückgibt. Dieser Trait legt den Vertrag fest, den alle Formen erfüllen müssen.shapes.rs: Erstellen Sie zwei Structs, die Ihren Trait implementieren. EinCirclehat einenradius(f64) und einSquarehat eineside(f64). Jedes Struct sollte denShape-Trait mit der entsprechenden Flächenformel implementieren. Verwenden Sie für Kreise3.14159als π.main.rs: Binden Sie beide Module ein und erstellen Sie einetotal_area-Funktion, die einenVec<Box<dyn Shape>>akzeptiert und die Summe aller Flächen zurückgibt. Erstellen Sie unter Verwendung der bereitgestellten Eingaben einen Kreis und ein Quadrat, speichern Sie diese in einem Vektor von Trait-Objekten, berechnen Sie die Gesamtfläche und geben Sie das Ergebnis aus.
Die Flächenformeln lauten:
- Kreis:
3.14159 × radius × radius - Quadrat:
side × side
Ihre Ausgabe sollte die Gesamtfläche aller Formen anzeigen:
Total area: {total}Zum Beispiel mit den Eingaben 2.0 (Kreisradius) und 3.0 (Quadratseite):
Total area: 21.56636Dies liegt daran: Kreisfläche = 3.14159 × 2² = 12.56636, Quadratfläche = 3² = 9, Gesamt = 21.56636
Und mit den Eingaben 1.0 und 4.0:
Total area: 19.14159Sie erhalten zwei Eingaben: den Radius des Kreises und die Seitenlänge des Quadrats (parsen Sie beide als f64).
Probier es selbst
mod shape;
mod shapes;
use shape::Shape;
use shapes::{Circle, Square};
// TODO: Implementiere die Funktion total_area
// Sie sollte ein Vec<Box<dyn Shape>> akzeptieren und die Summe aller Flächen als f64 zurückgeben
fn total_area(shapes: Vec<Box<dyn Shape>>) -> f64 {
// TODO: Berechne und gib die Summe aller Formflächen zurück
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: Erstelle einen Circle mit dem angegebenen Radius
// TODO: Erstelle ein Square mit der angegebenen Seitenlänge
// TODO: Speichere beide Formen in einem Vec<Box<dyn Shape>>
// TODO: Rufe total_area auf und gib das Ergebnis im Format "Total area: {total}" aus
}
Alle Lektionen in Object Oriented Programming
1Methoden und Verhalten
Einführung in ImplementierungsblöckeDer Self-ParameterVeränderliche MethodenAssoziierte FunktionenMehrere ImplementierungsblöckeMethod ChainingRückblick – Rechteck-Aktionen4Projekt: Virtuelles Haustier
Das Haustier definierenDas Haustier füttern7Standard-Traits
Das Debug-TraitDas Display-TraitClone und CopyGleichheits-TraitsZusammenfassung – Druckbarer Punkt10Projekt: Dokumentensystem
Das Draw-TraitText-Komponente2Kapselung und Module
Grundlagen der ModuleDas Public-SchlüsselwortPrivate FelderGetterSetterWiederholung – Sicherer Tresor5Generics
Generische StructsGenerische MethodenMehrere generische TypenGenerische FunktionenZusammenfassung - Koordinatenpunkt8Traits als Einschränkungen
Syntax für Trait BoundsMehrfache BoundsDie Where-KlauselTypen mit Traits zurückgebenRückblick – Generischer Drucker11Design Patterns in Rust
Newtype-PatternKompositionDas Drop-TraitFrom und IntoZusammenfassung – Smart Pointer Mock3Fortgeschrittene Enums
Enums mit DatenMethoden für EnumsMatching von DatenvariantenDas Option-Enum erneut betrachtetZusammenfassung – Shape-Enum6Definition von Traits
Was ist ein Trait?Traits implementierenStandardimplementierungenStandardimplementierungen überschreibenTraits mit ParameternZusammenfassung – Media Player