Menu
Coddy logo textTech

Kalkulator pola figur

Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 61 z 61.

challenge icon

Wyzwanie

Łatwy

To ostatnie wyzwanie łączy cechy, obiekty cech i polimorfizm, aby rozwiązać praktyczny problem: obliczenie łącznego pola różnych kształtów przechowywanych w jednej kolekcji.

Zbudujmy kalkulator pola kształtów, który pokazuje możliwości obiektów cech i polimorfizmu! Utworzysz system, w którym różne kształty — koła i kwadraty — można przechowywać razem w jednej kolekcji, a ich łączne pole obliczać za pomocą ujednoliconego interfejsu.

Rozmieścisz kod w trzech plikach:

  • shape.rs: Zdefiniuj cechę Shape z metodą area, która zwraca wartość typu f64. Ta cecha określa wymagania, które muszą spełniać wszystkie kształty.
  • shapes.rs: Utwórz dwie struktury implementujące tę cechę. Circle ma radius (f64), a Square ma side (f64). Każda struktura powinna implementować cechę Shape za pomocą odpowiedniego wzoru na pole. W przypadku kół użyj 3.14159 jako π.
  • main.rs: Zaimportuj oba moduły i utwórz funkcję total_area, która przyjmuje Vec<Box<dyn Shape>> i zwraca sumę wszystkich pól. Korzystając z podanych danych wejściowych, utwórz koło i kwadrat, umieść je w wektorze obiektów cech, oblicz łączne pole i wyświetl wynik.

Wzory na pola:

  • Koło: 3.14159 × radius × radius
  • Kwadrat: side × side

Wynik powinien wyświetlać łączne pole wszystkich kształtów:

Total area: {total}

Na przykład dla danych wejściowych 2.0 (promień koła) i 3.0 (długość boku kwadratu):

Total area: 21.56636

Dzieje się tak, ponieważ: pole koła = 3.14159 × 2² = 12.56636, pole kwadratu = 3² = 9, łącznie = 21.56636

A dla danych wejściowych 1.0 i 4.0:

Total area: 19.14159

Otrzymasz dwa dane wejściowe: promień koła i długość boku kwadratu (oba sparsuj jako f64).

Spróbuj swoich sił

mod shape;
mod shapes;

use shape::Shape;
use shapes::{Circle, Square};

// TODO: Zaimplementuj funkcję total_area
// Powinna przyjmować Vec<Box<dyn Shape>> i zwracać sumę pól wszystkich figur jako f64
fn total_area(shapes: Vec<Box<dyn Shape>>) -> f64 {
    // TODO: Oblicz i zwróć sumę pól wszystkich figur
    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: Utwórz Circle o podanym promieniu
    // TODO: Utwórz Square o podanej długości boku
    // TODO: Umieść obie figury w Vec<Box<dyn Shape>>
    // TODO: Wywołaj total_area i wypisz wynik w formacie: "Total area: {total}"
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Rust online