Menu
Coddy logo textTech

Flächenrechner für Formen

Teil des Abschnitts Object Oriented Programming der Rust-Journey von Coddy. Lektion 61 von 61.

challenge icon

Aufgabe

Einfach

Diese abschließende Herausforderung verbindet traits, Trait-Objekte und Polymorphismus, um ein praktisches Problem zu lösen: die Berechnung der gesamten area verschiedener shapes, die in einer einzigen Sammlung gespeichert sind.

Erstellen wir einen Rechner für die area von shapes, der die Leistungsfähigkeit von Trait-Objekten und Polymorphismus demonstriert! Du erstellst ein System, in dem verschiedene shapes, Circle und Square, gemeinsam in einer einzigen Sammlung gespeichert werden können und ihre gesamte area über eine einheitliche Schnittstelle berechnet wird.

Du wirst deinen Code auf drei Dateien verteilen:

  • shape.rs: Definiere den Shape-trait mit einer area-Methode, die ein f64 zurückgibt. Dieser trait legt den Vertrag fest, den alle shapes erfüllen müssen.
  • shapes.rs: Erstelle zwei structs, die deinen trait implementieren. Ein Circle hat einen radius (f64), und ein Square hat eine side (f64). Jeder struct sollte den Shape-trait mit seiner passenden area-Formel implementieren. Verwende für Circle 3.14159 als π.
  • main.rs: Binde beide Module ein und erstelle eine total_area-function, die ein Vec<Box<dyn Shape>> akzeptiert und die Summe aller areas zurückgibt. Erstelle mithilfe der bereitgestellten Eingaben einen Circle und ein Square, speichere sie in einem Vektor von Trait-Objekten, berechne die gesamte area und gib das Ergebnis aus.

Die area-Formeln lauten:

  • Circle: 3.14159 × radius × radius
  • Square: side × side

Deine Ausgabe sollte die gesamte area aller shapes anzeigen:

Total area: {total}

Beispielsweise mit den Eingaben 2.0 (radius des Circle) und 3.0 (side des Square):

Total area: 21.56636

Das liegt daran: area des Circle = 3.14159 × 2² = 12.56636, area des Square = 3² = 9, Total = 21.56636

Und mit den Eingaben 1.0 und 4.0:

Total area: 19.14159

Du erhältst zwei Eingaben: den radius des Circle und die side-Länge des Square (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 Object Oriented Programming

Übe selbstständig: Online-Rust-Compiler