المصفوفات ثنائية الأبعاد في 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!();
}
}
Двумерные массивы — это просто таблицы. Главное — запомнить, что первый индекс отвечает за строку, второй за столбец, и что нумерация начинается с нуля. Потренируйся на задачах про кинозал, землетрясения и посты — и ты быстро освоишь эту тему!