Menu
Coddy logo textTech

Podsumowanie – punkt współrzędnych

Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 28 z 61.

challenge icon

Wyzwanie

Łatwy

Stwórzmy elastyczny układ współrzędnych, który działa z dowolnym typem numerycznym! Utworzysz generyczną strukturę Point, która może reprezentować pozycje za pomocą liczb całkowitych w grach opartych na siatce lub liczb zmiennoprzecinkowych w precyzyjnej grafice — a wszystko to w ramach jednej definicji.

Rozmieścisz swój kod w dwóch plikach:

  • point.rs: Zdefiniuj publiczną generyczną strukturę Point<T> z dwoma publicznymi polami: x i y, oba typu T. Zaimplementuj metody dla swojego punktu:
    • Skojarzoną funkcję new, która tworzy punkt ze współrzędnych x i y
    • Metodę translate, która przyjmuje wartości dx i dy oraz zwraca nowy Point ze współrzędnymi przesuniętymi o te wartości (wymaga to, aby T obsługiwał dodawanie i kopiowanie, więc użyj ograniczenia T: std::ops::Add<Output = T> + Copy)
  • main.rs: Zaimportuj moduł punktu i pokaż, jak ta sama generyczna struktura działa bezproblemowo z różnymi typami numerycznymi.

W pliku głównym zaprezentuj swoją generyczną strukturę Point, wykonując następujące czynności:

  1. Utwórz punkt całkowitoliczbowy, używając dwóch pierwszych danych wejściowych (parsowanych jako i32)
  2. Przesuń go o trzecią i czwartą daną wejściową (również typu i32)
  3. Utwórz punkt zmiennoprzecinkowy, używając piątej i szóstej danej wejściowej (parsowanych jako f64)
  4. Wyświetl wszystkie trzy punkty

Wynik powinien mieć następujący format:

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

Na przykład dla danych wejściowych 3, 5, 2, -1, 1.5 i 2.5:

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

Zwróć uwagę, że Point::new(3, 5) tworzy Point<i32>, podczas gdy Point::new(1.5, 2.5) tworzy Point<f64>: ta sama definicja struktury dostosowuje się do obu typów!

Otrzymasz sześć danych wejściowych: dwie liczby całkowite dla pierwszego punktu, dwie liczby całkowite do przesunięcia oraz dwie liczby zmiennoprzecinkowe dla drugiego punktu.

Spróbuj swoich sił

mod point;

use point::Point;

fn main() {
    // Odczytaj dane wejściowe
    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: Utwórz punkt o współrzędnych całkowitych, używając x1 i y1
    
    // TODO: Przesuń punkt o współrzędnych całkowitych o dx i dy
    
    // TODO: Utwórz punkt o współrzędnych zmiennoprzecinkowych, używając x2 i y2
    
    // TODO: Wypisz wyniki w wymaganym formacie:
    // println!("Integer point: ({}, {})", ...);
    // println!("After translation: ({}, {})", ...);
    // println!("Float point: ({}, {})", ...);
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Rust online