Menu
Coddy logo textTech

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

Часть раздела Object Oriented Programming путешествия по Rust на Coddy — урок 28 из 61.

challenge icon

Задание

Легко

Давайте создадим гибкую систему координат, которая работает с любым числовым типом! Вы создадите универсальную структуру Point, которая может представлять позиции, используя целые числа для игр на основе сетки или числа с плавающей запятой для точной графики — и все это на основе одного определения.

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

  • point.rs: Определите публичную универсальную структуру Point<T> с двумя публичными полями: x и y, оба типа T. Реализуйте методы для вашей точки:
    • Ассоциированную функцию new, которая создает точку из координат x и y
    • Метод translate, который принимает значения dx и dy и возвращает новую Point с координатами, смещенными на эти значения (это требует, чтобы T поддерживал сложение и копирование, поэтому используйте ограничение T: std::ops::Add<Output = T> + Copy)
  • main.rs: Подключите модуль point и продемонстрируйте, как одна и та же универсальная структура бесперебойно работает с различными числовыми типами.

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

  1. Создайте целочисленную точку, используя первые два входных значения (преобразованные в i32)
  2. Сместите ее на третье и четвертое входные значения (также i32)
  3. Создайте точку с плавающей запятой, используя пятое и шестое входные значения (преобразованные в f64)
  4. Выведите все три точки

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

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

Например, при входных данных 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> — одно и то же определение структуры адаптируется к обоим случаям!

Вы получите шесть входных значений: два целых числа для первой точки, два целых числа для смещения и два числа с плавающей запятой для второй точки.

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

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

Все уроки раздела Object Oriented Programming