Máy tính diện tích hình
Thuộc phần Lập trình hướng đối tượng trong hành trình Rust của Coddy. Bài học 61 trên 61.
Thử thách
DễThử thách cuối cùng này kết hợp trait, đối tượng trait và tính đa hình để giải quyết một vấn đề thực tế: tính tổng diện tích của nhiều hình khác nhau được lưu trong cùng một tập hợp.
Hãy xây dựng một chương trình tính diện tích hình để minh họa sức mạnh của đối tượng trait và tính đa hình! Bạn sẽ tạo một hệ thống có thể lưu nhiều hình khác nhau, gồm hình tròn và hình vuông, trong cùng một tập hợp rồi tính tổng diện tích của chúng thông qua một giao diện thống nhất.
Bạn sẽ sắp xếp code trong ba tệp:
shape.rs: Định nghĩa traitShapevới phương thứcareatrả về mộtf64. Trait này thiết lập hợp đồng mà tất cả các hình phải tuân theo.shapes.rs: Tạo hai cấu trúc triển khai trait của bạn.Circlecóradius(f64), cònSquarecóside(f64). Mỗi cấu trúc cần triển khai traitShapevới công thức tính diện tích phù hợp. Với hình tròn, hãy dùng3.14159làm π.main.rs: Đưa cả hai module vào và tạo hàmtotal_areanhận mộtVec<Box<dyn Shape>>rồi trả về tổng diện tích của tất cả các hình. Dùng các đầu vào đã cho để tạo một hình tròn và một hình vuông, lưu chúng trong một vector các đối tượng trait, tính tổng diện tích rồi in kết quả.
Công thức tính diện tích:
- Hình tròn:
3.14159 × radius × radius - Hình vuông:
side × side
Đầu ra cần hiển thị tổng diện tích của tất cả các hình:
Total area: {total}Ví dụ, với đầu vào 2.0 (bán kính hình tròn) và 3.0 (cạnh hình vuông):
Total area: 21.56636Lý do: Diện tích hình tròn = 3.14159 × 2² = 12.56636, diện tích hình vuông = 3² = 9, tổng = 21.56636
Với đầu vào 1.0 và 4.0:
Total area: 19.14159Bạn sẽ nhận hai đầu vào: bán kính hình tròn và độ dài cạnh hình vuông (phân tích cả hai thành f64).
Tự làm thử
mod shape;
mod shapes;
use shape::Shape;
use shapes::{Circle, Square};
// TODO: Triển khai hàm (function) total_area
// Hàm cần nhận một Vec<Box<dyn Shape>> và trả về tổng diện tích của tất cả hình dưới dạng f64
fn total_area(shapes: Vec<Box<dyn Shape>>) -> f64 {
// TODO: Tính và trả về tổng diện tích của tất cả hình
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: Tạo một Circle với bán kính đã cho
// TODO: Tạo một Square với độ dài cạnh đã cho
// TODO: Lưu cả hai hình vào một Vec<Box<dyn Shape>>
// TODO: Gọi total_area và in kết quả theo định dạng: "Total area: {total}"
}
Tất cả bài học trong Lập trình hướng đối tượng
1Phương thức và hành vi
Nhập môn khối triển khaiTham số selfPhương thức có thể thay đổiHàm liên kếtNhiều khối triển khaiNối chuỗi phương thứcÔn tập: thao tác với hình chữ nhật4Dự án: Thú cưng ảo
Định nghĩa thú cưngCho thú cưng ăn7Các trait tiêu chuẩn
Trait DebugTrait DisplayClone và CopyCác trait so sánh bằngÔn tập: Điểm có thể in ra2Tính đóng gói và module
Kiến thức cơ bản về moduleTừ khóa publicTrường riêng tưHàm lấy giá trịHàm thiết lập giá trịÔn tập: tủ khóa an toàn5Kiểu tổng quát
Cấu trúc tổng quátPhương thức tổng quátNhiều kiểu tổng quátHàm tổng quátÔn tập: điểm tọa độTự luyện tập: Trình biên dịch Rust online