Flächenrechner für Formen
Teil des Abschnitts Objektorientierte Programmierung der Rust-Journey von Coddy. Lektion 61 von 61.
Aufgabe
EinfachDiese abschließende Herausforderung führt Traits, Trait-Objekte und Polymorphie zusammen, um ein praktisches Problem zu lösen: die Berechnung der Gesamtfläche verschiedener Formen, die in einer einzigen Sammlung gespeichert sind.
Erstelle einen Flächenrechner für Formen, der die Leistungsfähigkeit von Trait-Objekten und Polymorphie demonstriert! Du erstellst ein System, in dem verschiedene Formen, Kreise und Quadrate, gemeinsam in einer einzigen Sammlung gespeichert werden können und ihre Gesamtfläche über eine einheitliche Schnittstelle berechnet wird.
Du organisierst deinen Code über drei Dateien:
shape.rs: Definiere dasShape-Trait mit einerarea-Methode, die einf64zurückgibt. Dieses Trait legt den Vertrag fest, den alle Formen erfüllen müssen.shapes.rs: Erstelle zwei Structs, die dein Trait implementieren. EinCirclehat einenradius(f64), und einSquarehat eineside(f64). Jedes Struct sollte dasShape-Trait mit seiner entsprechenden Flächenformel implementieren. Verwende für Kreise3.14159als π.main.rs: Binde beide Module ein und erstelle einetotal_area-Funktion, die einVec<Box<dyn Shape>>akzeptiert und die Summe aller Flächen zurückgibt. Erstelle mithilfe der vorgegebenen Eingaben einen Kreis und ein Quadrat, speichere sie in einem Vektor von Trait-Objekten, berechne die Gesamtfläche und gib das Ergebnis aus.
Die Flächenformeln lauten:
- Kreis:
3.14159 × radius × radius - Quadrat:
side × side
Deine 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.56636Das liegt daran: Kreisfläche = 3.14159 × 2² = 12.56636, Quadratfläche = 3² = 9, Gesamtfläche = 21.56636
Und mit den Eingaben 1.0 und 4.0:
Total area: 19.14159Du erhältst zwei Eingaben: den Radius des Kreises und die Seitenlänge des Quadrats (parse beide als f64).
Probier es selbst
mod shape;
mod shapes;
use shape::Shape;
use shapes::{Circle, Square};
// TODO: Implementiere die total_area Funktion
// Sie sollte einen 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 gegebenen Radius
// TODO: Erstelle ein Square mit der gegebenen Seite
// TODO: Speichere beide Formen in einem Vec<Box<dyn Shape>>
// TODO: Rufe total_area auf und gib das Ergebnis im Format aus: "Total area: {total}"
}
Alle Lektionen in Objektorientierte Programmierung
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Übe selbstständig: Online-Rust-Compiler