Menu
CoddyTech

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.

challenge icon

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 trait Shape với phương thức area trả về một f64. 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. Circle có radius (f64), còn Square có side (f64). Mỗi cấu trúc cần triển khai trait Shape với công thức tính diện tích phù hợp. Với hình tròn, hãy dùng 3.14159 làm π.
  • main.rs: Đưa cả hai module vào và tạo hàm total_area nhận một Vec<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.56636

Lý 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.14159

Bạ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

Tự luyện tập: Trình biên dịch Rust online