Menu
Coddy logo textTech

Повторение — Координатная точка

Часть раздела Объектно-ориентированное программирование путешествия по Rust на Coddy. Урок 28 из 61.

challenge icon

Задание

Легко

Давайте создадим гибкую систему координат, которая работает с любым числовым типом! Вы создадите generic Point struct, способный представлять положения, используя integer для игр на основе сетки или floating-point числа для точной графики: всё из одного определения.

Вы организуете свой код в двух файлах:

  • point.rs: Define public generic Point<T> struct с двумя public fields: x и y, оба типа T. Implement methods для вашего point:
    • associated function new, которая создаёт point из координат x и y
    • translate method, принимающий значения dx и dy и returns новый Point со сдвинутыми на эти величины координатами (для этого требуется, чтобы T имел support addition и copying, поэтому используйте bound T: std::ops::Add<Output = T> + Copy)
  • main.rs: Подключите свой модуль point и продемонстрируйте, как один и тот же generic struct без проблем работает с разными числовыми типами.

В своём основном файле продемонстрируйте работу generic Point следующим образом:

  1. Создайте integer point, используя первые два inputs (распарсенные как i32)
  2. Переместите его на величины из третьего и четвёртого inputs (также i32)
  3. Создайте floating-point point, используя пятый и шестой inputs (распарсенные как f64)
  4. Выведите все три point

Ваш вывод должен соответствовать этому формату:

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

Например, для inputs 3, 5, 2, -1, 1.5 и 2.5:

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

Обратите внимание: Point::new(3, 5) создаёт Point<i32>, тогда как Point::new(1.5, 2.5) создаёт Point<f64>: одно и то же определение struct адаптируется к обоим типам!

Вы получите шесть inputs: два integer для первого point, два integer для translation и два float для второго point.

Попробуйте сами

mod point;

use point::Point;

fn main() {
    // Считать входные данные
    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: Create an integer point using x1 and y1
    
    // TODO: Translate the integer point by dx and dy
    
    // TODO: Создать точку с плавающей точкой, используя x2 и y2
    
    // TODO: Вывести результаты в требуемом формате:
    // println!("Integer point: ({}, {})", ...);
    // println!("After translation: ({}, {})", ...);
    // println!("Float point: ({}, {})", ...);
}

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Rust