Menu
Coddy logo textTech

Структуры как параметры функций

Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 24 из 66.

Теперь, когда вы знаете, как создавать и изменять структуры (structs), давайте изучим, как использовать их с функциями. Как и любой другой тип данных в Rust, вы можете передавать экземпляры структур в функции и возвращать их из функций.

Чтобы передать структуру в функцию, вы просто указываете её в качестве параметра в определении функции:

fn calculate_area(rect: Rectangle) -> i32 {
    rect.width * rect.height
}

Эта функция принимает структуру Rectangle в качестве параметра и возвращает i32. Внутри функции вы можете обращаться к полям структуры, используя точечную нотацию, точно так же, как и в любом другом месте.

Вы также можете возвращать структуры из функций, указывая тип структуры в качестве возвращаемого типа:

fn create_square(size: i32) -> Rectangle {
    Rectangle {
        width: size,
        height: size,
    }
}

Использование структур с функциями делает ваш код более организованным и осмысленным. Вместо передачи множества отдельных параметров вы можете сгруппировать связанные данные вместе и передать их как единую, четко определенную единицу.

challenge icon

Задание

Легко

Вы получите четыре входных значения: ширину прямоугольника (целое число), высоту прямоугольника (целое число), длину стороны квадрата (целое число) и номер выбора (1 или 2). Определите структуру Rectangle с двумя полями: width: i32 и height: i32. Создайте две функции: одну, которая принимает Rectangle и вычисляет его площадь, и другую, которая принимает длину стороны и возвращает Rectangle, представляющий квадрат. В зависимости от введенного выбора, вычислите и выведите соответствующую площадь.

Требования:

  • Определите структуру Rectangle с полями: width: i32 и height: i32
  • Создайте функцию calculate_area, которая принимает Rectangle в качестве параметра и возвращает i32 (площадь)
  • Создайте функцию create_square, которая принимает i32 (длину стороны) в качестве параметра и возвращает Rectangle с одинаковой шириной и высотой
  • Прочитайте первый ввод и преобразуйте его в i32 для ширины прямоугольника
  • Прочитайте второй ввод и преобразуйте его в i32 для высоты прямоугольника
  • Создайте экземпляр Rectangle с этими размерами
  • Прочитайте третий ввод и преобразуйте его в i32 для длины стороны квадрата
  • Прочитайте четвертый ввод и преобразуйте его в i32 для выбора (1 или 2)
  • Если выбор равен 1: вычислите и выведите площадь прямоугольника
  • Если выбор равен 2: создайте квадрат с помощью create_square, затем вычислите и выведите его площадь

Ввод:

  • Первая строка: Ширина прямоугольника как целое число (например, 8)
  • Вторая строка: Высота прямоугольника как целое число (например, 5)
  • Третья строка: Длина стороны квадрата как целое число (например, 6)
  • Четвертая строка: Выбор как целое число, либо 1, либо 2 (например, 1)

Вывод:

  • Если выбор равен 1: Rectangle area: [area]
  • Если выбор равен 2: Square area: [area]

Шпаргалка

Структуры можно передавать в функции в качестве параметров и возвращать из функций.

Чтобы передать структуру в функцию, укажите её в качестве параметра:

fn calculate_area(rect: Rectangle) -> i32 {
    rect.width * rect.height
}

Чтобы вернуть структуру из функции, укажите тип структуры в качестве возвращаемого типа:

fn create_square(size: i32) -> Rectangle {
    Rectangle {
        width: size,
        height: size,
    }
}

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

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

use std::io;

// TODO: Определите структуру Rectangle здесь


// TODO: Определите функцию calculate_area здесь


// TODO: Определите функцию create_square здесь


fn main() {
    // Чтение ширины прямоугольника
    let mut width_input = String::new();
    io::stdin().read_line(&mut width_input).expect("Failed to read line");
    let width: i32 = width_input.trim().parse().expect("Invalid input");
    
    // Чтение высоты прямоугольника
    let mut height_input = String::new();
    io::stdin().read_line(&mut height_input).expect("Failed to read line");
    let height: i32 = height_input.trim().parse().expect("Invalid input");
    
    // Чтение длины стороны квадрата
    let mut side_input = String::new();
    io::stdin().read_line(&mut side_input).expect("Failed to read line");
    let side: i32 = side_input.trim().parse().expect("Invalid input");
    
    // Чтение выбора
    let mut choice_input = String::new();
    io::stdin().read_line(&mut choice_input).expect("Failed to read line");
    let choice: i32 = choice_input.trim().parse().expect("Invalid input");
    
    // TODO: Напишите ваш код ниже
    // Создайте экземпляр Rectangle, проверьте выбор и вычислите соответствующую площадь
    
    
    // Вывод результата в зависимости от выбора
    // Используйте: println!("Rectangle area: {}", area); или println!("Square area: {}", area);
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Logic & Flow