Menu
CoddyTech

Ôn tập: enum Shape

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 18 trên 61.

challenge icon

Thử thách

Dễ

Hãy xây dựng một máy tính hình học dùng enum để biểu diễn các hình khác nhau, mỗi hình lưu các kích thước riêng. Enum Shape sẽ cho bạn thấy một kiểu có thể chứa các cấu trúc dữ liệu khác nhau và cung cấp hành vi thống nhất thông qua các phương thức.

Bạn sẽ tạo hai tệp để sắp xếp code:

  • shape.rs: Định nghĩa enum Shape công khai với hai biến thể:
    • Circle: chứa một giá trị f64 biểu thị bán kính (cú pháp tuple)
    • Rectangle: chứa các trường có tên: width (f64) và height (f64)
    Triển khai phương thức area dùng cách khớp mẫu (pattern matching) để tính diện tích phù hợp với từng biến thể. Với hình tròn, dùng 3.14159 làm giá trị π.
  • main.rs: Đưa module hình học vào, tạo một đối tượng cho mỗi biến thể hình bằng các đầu vào đã cho, rồi in diện tích của từng hình.

Phương thức area cần trả về một giá trị f64. Khi khớp, hãy phân rã từng biến thể để lấy các kích thước rồi áp dụng công thức phù hợp:

  • Diện tích hình tròn: π × radius²
  • Diện tích hình chữ nhật: width × height

Đầu ra cần hiển thị diện tích của mỗi hình trên một dòng riêng, với chính xác một chữ số thập phân:

Circle area: {area}
Rectangle area: {area}

Ví dụ, với hình tròn có bán kính 5.0 và hình chữ nhật có chiều rộng 4.0, chiều cao 6.0, đầu ra sẽ là:

Circle area: 78.5
Rectangle area: 24.0

Bạn sẽ nhận ba đầu vào: bán kính hình tròn, chiều rộng hình chữ nhật và chiều cao hình chữ nhật.

Tự làm thử

mod shape;

use shape::Shape;

fn main() {
    // Đọc các giá trị đầu vào
    let mut radius_input = String::new();
    std::io::stdin().read_line(&mut radius_input).expect("Failed to read line");
    let radius: f64 = radius_input.trim().parse().expect("Invalid number");

    let mut width_input = String::new();
    std::io::stdin().read_line(&mut width_input).expect("Failed to read line");
    let width: f64 = width_input.trim().parse().expect("Invalid number");

    let mut height_input = String::new();
    std::io::stdin().read_line(&mut height_input).expect("Failed to read line");
    let height: f64 = height_input.trim().parse().expect("Invalid number");

    // TODO: Tạo hình Circle bằng bán kính
    
    // TODO: Tạo hình Rectangle bằng chiều rộng và chiều cao
    
    // TODO: In ra diện tích của mỗi hình với một chữ số thập phân
    // Định dạng: "Circle area: {area}" và "Rectangle area: {area}"
}

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