Menu
CoddyTech

Ôn tập: điểm tọa độ

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

challenge icon

Thử thách

Dễ

Hãy cùng xây dựng một hệ tọa độ linh hoạt, hoạt động với mọi kiểu số! Bạn sẽ tạo một cấu trúc Point tổng quát có thể biểu diễn vị trí bằng số nguyên cho các trò chơi dạng lưới hoặc bằng số thực dấu phẩy động cho đồ họa chính xác, tất cả chỉ với một định nghĩa.

Bạn sẽ sắp xếp code trong hai tệp:

  • point.rs: Định nghĩa cấu trúc Point<T> tổng quát, công khai, với hai trường công khai là x và y, cả hai đều có kiểu T. Cài đặt các phương thức cho điểm:
    • Một hàm liên kết new tạo điểm từ tọa độ x và y
    • Một phương thức translate nhận các giá trị dx và dy, rồi trả về một Point mới với tọa độ được dịch chuyển theo các giá trị đó (việc này yêu cầu T hỗ trợ phép cộng và sao chép, vì vậy hãy dùng ràng buộc T: std::ops::Add<Output = T> + Copy)
  • main.rs: Đưa module point vào và minh họa cách cùng một cấu trúc tổng quát hoạt động liền mạch với các kiểu số khác nhau.

Trong tệp chính, hãy minh họa cấu trúc tổng quát Point bằng cách:

  1. Tạo một điểm số nguyên bằng hai đầu vào đầu tiên (phân tích thành i32)
  2. Dịch chuyển điểm đó bằng đầu vào thứ ba và thứ tư (cũng là i32)
  3. Tạo một điểm số thực dấu phẩy động bằng đầu vào thứ năm và thứ sáu (phân tích thành f64)
  4. Hiển thị cả ba điểm

Đầu ra cần theo định dạng này:

Integer point: ({x}, {y})
After translation: ({x}, {y})
Float point: ({x}, {y})

Ví dụ, với các đầu vào 3, 5, 2, -1, 1.5 và 2.5:

Integer point: (3, 5)
After translation: (5, 4)
Float point: (1.5, 2.5)

Hãy chú ý cách Point::new(3, 5) tạo ra một Point<i32>, còn Point::new(1.5, 2.5) tạo ra một Point<f64>: cùng một định nghĩa cấu trúc có thể thích ứng với cả hai!

Bạn sẽ nhận sáu đầu vào: hai số nguyên cho điểm đầu tiên, hai số nguyên để dịch chuyển và hai số thực dấu phẩy động cho điểm thứ hai.

Tự làm thử

mod point;

use point::Point;

fn main() {
    // Đọc các giá trị đầu vào
    let mut input = String::new();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let x1: i32 = input.trim().parse().expect("Invalid input");
    
    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let y1: i32 = input.trim().parse().expect("Invalid input");
    
    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let dx: i32 = input.trim().parse().expect("Invalid input");
    
    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let dy: i32 = input.trim().parse().expect("Invalid input");
    
    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let x2: f64 = input.trim().parse().expect("Invalid input");
    
    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let y2: f64 = input.trim().parse().expect("Invalid input");
    
    // TODO: Tạo một điểm có tọa độ nguyên từ x1 và y1
    
    // TODO: Tịnh tiến điểm có tọa độ nguyên theo dx và dy
    
    // TODO: Tạo một điểm có tọa độ thực từ x2 và y2
    
    // TODO: In kết quả theo định dạng yêu cầu:
    // println!("Integer point: ({}, {})", ...);
    // println!("After translation: ({}, {})", ...);
    // println!("Float point: ({}, {})", ...);
}

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