Kalkulator pola figur
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 61 z 61.
Wyzwanie
ŁatwyTo 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ęShapez metodąarea, która zwraca wartość typuf64. Ta cecha określa wymagania, które muszą spełniać wszystkie kształty.shapes.rs: Utwórz dwie struktury implementujące tę cechę.Circlemaradius(f64), aSquaremaside(f64). Każda struktura powinna implementować cechęShapeza pomocą odpowiedniego wzoru na pole. W przypadku kół użyj3.14159jako π.main.rs: Zaimportuj oba moduły i utwórz funkcjętotal_area, która przyjmujeVec<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.56636Dzieje 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.14159Otrzymasz 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
1Metody i zachowanie
Wprowadzenie do bloków implementacjiParametr selfMetody modyfikująceFunkcje powiązaneWiele bloków implementacjiŁańcuchowe wywoływanie metodPowtórzenie — działania na prostokącie4Projekt: Wirtualne zwierzątko
Definiowanie zwierzątkaKarmienie zwierzątka7Standardowe cechy
Cecha DebugCecha DisplayClone i CopyCechy równościPowtórka – punkt do wydrukowania10Projekt: System dokumentów
Trait DrawKomponent tekstowy2Hermetyzacja i moduły
Podstawy modułówSłowo kluczowe publicPola prywatneGetterySetteryPodsumowanie — bezpieczna skrytka5Typy generyczne
Struktury generyczneMetody generyczneWiele typów generycznychFunkcje generycznePodsumowanie – punkt współrzędnych8Cechy jako ograniczenia
Składnia ograniczeń cechWiele ograniczeńKlauzula whereZwracanie typów z użyciem cechPodsumowanie — generyczna drukarka11Wzorce projektowe w Rust
Wzorzec NewtypeKompozycjaTrait DropFrom i IntoPodsumowanie — atrapowy inteligentny wskaźnik3Zaawansowane typy wyliczeniowe
Typy wyliczeniowe z danymiMetody typów wyliczeniowychDopasowywanie wariantów danychTyp wyliczeniowy Option — powtórzeniePodsumowanie — typ wyliczeniowy Shape6Definiowanie cech
Czym jest cecha?Implementowanie cechImplementacje domyślneNadpisywanie wartości domyślnychCechy z parametramiPowtórzenie — odtwarzacz multimedialnyPoćwicz samodzielnie: Kompilator Rust online