🦀 Rust

Двумерные массивы в Rust 1.75: подробное руководство

Двумерные массивы в Rust

Что такое двумерный массив?

Представь себе шахматную доску. У неё есть строки (ряды) и столбцы (места в ряду). Каждая клетка доски — это место, где может стоять фигура. Двумерный массив — это именно такая таблица, где у каждого элемента есть два номера: номер строки и номер столбца.

Двумерные массивы помогают хранить данные, которые удобно представить в виде таблицы. Например:

  • Схема кинозала (ряды и места)
  • Карта острова с сокровищами
  • Таблица лайков у разных блогеров
  • Складские полки с товарами

Как объявить двумерный массив в Rust

В Rust двумерный массив — это массив, внутри которого находятся другие массивы. Самый простой способ создать таблицу 3×3 (3 строки, 3 столбца):

let arr: [[i32; 3]; 3] = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];

Разберём по частям:

  • [[i32; 3]; 3] — тип данных: внутри массива длиной 3 находятся массивы из трёх чисел i32
  • [0, 0, 0] — это первая строка
  • Всего таких строк три

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

let arr = [[0; 3]; 3];  // таблица 3×3, везде нули

Как обратиться к элементу

Сначала пишем номер строки, потом номер столбца. Нумерация начинается с 0.

let mut cinema = [[0; 5]; 3];  // 3 ряда, 5 мест

cinema[0][2] = 1;  // первая строка, третье место — занято
cinema[2][4] = 1;  // третья строка, пятое место — занято

println!("{:?}", cinema[0]);  // выведет [0, 0, 1, 0, 0]

Пример 1: Создаём схему кинозала

Программа запрашивает количество рядов и мест, а затем выводит схему зала, где 0 — свободно, 1 — занято.

use std::io;

fn main() {
    println!("Введите количество рядов:");
    let mut input = String::new();
    io::stdin().read_line(&mut input).unwrap();
    let rows: usize = input.trim().parse().unwrap();

    println!("Введите количество мест в ряду:");
    input.clear();
    io::stdin().read_line(&mut input).unwrap();
    let cols: usize = input.trim().parse().unwrap();

    let mut hall = [[0; 10]; 10];  // максимум 10×10

    // Заполняем несколько мест как занятые
    hall[0][0] = 1;
    hall[rows - 1][cols - 1] = 1;

    // Выводим схему
    for i in 0..rows {
        for j in 0..cols {
            print!("{} ", hall[i][j]);
        }
        println!();
    }
}

Пример 2: Данные землетрясений

Создаём таблицу 2×2 с магнитудами землетрясений и выводим среднее значение.

use std::io;

fn main() {
    let mut data = [[0.0; 2]; 2];

    for i in 0..2 {
        for j in 0..2 {
            println!("Введите магнитуду для региона {} район {}:", i + 1, j + 1);
            let mut input = String::new();
            io::stdin().read_line(&mut input).unwrap();
            data[i][j] = input.trim().parse().unwrap();
        }
    }

    let mut sum = 0.0;
    for i in 0..2 {
        for j in 0..2 {
            sum += data[i][j];
        }
    }

    println!("Средняя магнитуда: {:.2}", sum / 4.0);
}

Пример 3: Популярность постов

Программа запрашивает количество блогеров и постов, затем заполняет таблицу лайками и находит самый популярный пост.

use std::io;

fn main() {
    println!("Сколько блогеров?");
    let mut input = String::new();
    io::stdin().read_line(&mut input).unwrap();
    let bloggers: usize = input.trim().parse().unwrap();

    println!("Сколько постов у каждого?");
    input.clear();
    io::stdin().read_line(&mut input).unwrap();
    let posts: usize = input.trim().parse().unwrap();

    let mut likes = vec![vec![0; posts]; bloggers];

    for i in 0..bloggers {
        for j in 0..posts {
            println!("Лайки блогера {} пост {}:", i + 1, j + 1);
            input.clear();
            io::stdin().read_line(&mut input).unwrap();
            likes[i][j] = input.trim().parse().unwrap();
        }
    }

    let mut max_likes = 0;
    let mut best_blogger = 0;
    let mut best_post = 0;

    for i in 0..bloggers {
        for j in 0..posts {
            if likes[i][j] > max_likes {
                max_likes = likes[i][j];
                best_blogger = i;
                best_post = j;
            }
        }
    }

    println!("Самый популярный пост: блогер {}, пост {} ({} лайков)", 
             best_blogger + 1, best_post + 1, max_likes);
}

Частые ошибки новичков

  • Выход за границы массива: если массив 3×3, то индексы идут от 0 до 2. Обращение к arr[3][0] вызовет ошибку.
  • Путаница строк и столбцов: первый индекс — строка, второй — столбец. arr[строка][столбец]
  • Забыть изменить размер: в Rust размер массива фиксирован. Если нужно менять размер, используй Vec<Vec<T>> (вектор векторов).
  • Неправильный тип данных: если в таблице будут числа с запятой, используй f64 или f32, а не i32.

Итоговый пример: Замена товара на складе

У нас есть склад 3×4 (3 полки, 4 товара на каждой). Программа находит полку с максимальным количеством товаров и заменяет все товары на этой полке на число 99.

use std::io;

fn main() {
    let mut warehouse = [[0; 4]; 3];

    // Заполняем склад
    for i in 0..3 {
        for j in 0..4 {
            println!("Полка {} товар {}: сколько единиц?", i + 1, j + 1);
            let mut input = String::new();
            io::stdin().read_line(&mut input).unwrap();
            warehouse[i][j] = input.trim().parse().unwrap();
        }
    }

    // Ищем полку с максимальным количеством товаров
    let mut max_shelf = 0;
    let mut max_total = 0;

    for i in 0..3 {
        let mut total = 0;
        for j in 0..4 {
            total += warehouse[i][j];
        }
        if total > max_total {
            max_total = total;
            max_shelf = i;
        }
    }

    println!("Самая заполненная полка: №{} (всего {} единиц)", max_shelf + 1, max_total);

    // Заменяем все товары на этой полке на 99
    for j in 0..4 {
        warehouse[max_shelf][j] = 99;
    }

    // Выводим результат
    println!("Обновлённый склад:");
    for i in 0..3 {
        for j in 0..4 {
            print!("{} ", warehouse[i][j]);
        }
        println!();
    }
}

Двумерные массивы — это просто таблицы. Главное — запомнить, что первый индекс отвечает за строку, второй за столбец, и что нумерация начинается с нуля. Потренируйся на задачах про кинозал, землетрясения и посты — и ты быстро освоишь эту тему!