Обращение к элементам массива
Элемент массива находят по его индексу — номеру позиции в массиве. В типовых задачах важно не перепутать индекс и значение элемента, правильно определить границы перебора и изменить именно тот элемент, который требуется условием.
Индекс и элемент массива
Массив хранит несколько однотипных значений, расположенных в определённом порядке. У каждого значения есть индекс. Индекс используют в квадратных скобках: \(a[i]\) — элемент массива \(a\) с индексом \(i\). Индекс не является самим значением: например, в массиве \(a=[7, 3, 9]\) число \(3\) — значение, а \(1\) — его индекс при нумерации с нуля.
Индекс — целое число, однозначно указывающее позицию элемента в массиве. В Python и C++ индексы обычно начинаются с нуля, поэтому для массива из \(n\) элементов допустимы индексы от \(0\) до \(n-1\).
В школьных задачах встречаются разные соглашения. В Python и C++ первый элемент записывают как \(a[0]\). В Паскале массив часто объявляют с индексацией от \(1\), например array[1..n] of integer. Поэтому перед решением нужно посмотреть, с какого индекса начинается массив.
| Позиция элемента | Индекс в Python/C++ | Значение для a = [7, 3, 9] |
|---|---|---|
| первый | 0 | a[0] = 7 |
| второй | 1 | a[1] = 3 |
| третий | 2 | a[2] = 9 |
Если массив содержит \(n\) элементов и нумерация начинается с нуля, то первый индекс равен \(0\), последний — \(n-1\). При нумерации с единицы индексы находятся в диапазоне от \(1\) до \(n\).
Подробные правила перехода от номера позиции к индексу разобраны на странице индексация массива. Здесь достаточно помнить: позиция «первый» при нулевой нумерации соответствует индексу \(0\), а позиция «k-й» — индексу \(k-1\).
Чтение элемента по индексу
Чтение элемента означает получение его значения без изменения массива. Например, выражение a[4] возвращает шестой элемент массива в Python, если массив индексируется с нуля. Значение можно вывести, сравнить с числом, прибавить к переменной или использовать в формуле.
1a = [12, 5, 8, 10] 2print(a[0]) # 12 3print(a[2] + 1) # 9 4x = a[1] # x получает значение 5
Если в условии сказано «вывести элемент с индексом 2», выводят a[2], а не a[1] и не порядковый номер 2. Если сказано «вывести третий элемент» при нумерации с нуля, используют a[2].
Дан массив a = [4, 11, 6, 2]. Что выведет команда print(a[2])?
Частая задача — найти соседний элемент. Для элемента \(a[i]\) левый сосед имеет индекс \(i-1\), а правый — \(i+1\). Такие обращения допустимы только тогда, когда сосед существует: для первого элемента нельзя обращаться к \(a[i-1]\), а для последнего — к \(a[i+1]\).
Обращение к индексу, которого нет в массиве, вызывает ошибку или приводит к неверным данным. При сравнении соседей перебирайте только индексы, для которых оба соседа существуют: обычно от \(1\) до \(n-2\) при нулевой нумерации.
Изменение элемента
Чтобы заменить значение элемента, записывают новое значение по его индексу: a[i] = новое_значение. Остальные элементы массива при этом не меняются. Например, команда a[1] = 20 заменяет второй элемент массива.
1a = [7, 3, 9] 2a[1] = 20 3print(a) # [7, 20, 9]
Изменение может зависеть от старого значения. Запись a[i] = a[i] + 5 увеличивает элемент на 5, а a[i] = a[i] * 2 удваивает его. Слева от знака равенства находится место, которое изменяют, справа — выражение, вычисляемое до присваивания.
Команда a[i] = выражение вычисляет выражение и записывает полученный результат в элемент массива с индексом \(i\). Старое значение этого элемента заменяется.
Если требуется изменить несколько элементов, используют цикл. Важно изменять элемент по текущему индексу цикла, а не всегда один и тот же элемент.
1a = [2, 5, 8, 1] 2for i in range(len(a)): 3 a[i] = a[i] + 1 4print(a) # [3, 6, 9, 2]
Такой приём связан с изменением элемента массива. Если массив нужно преобразовать с перестановкой соседних значений, полезно также изучить циклический сдвиг массива.
Разобранная задача: обмен двух элементов
Рассмотрим типовую задачу: дан массив a = [6, 2, 9, 4, 7]. Нужно поменять местами первый и последний элементы. Нельзя просто выполнить две команды подряд без дополнительной переменной: после первой команды исходное значение первого элемента будет потеряно.
Поменять местами элементы с индексами \(0\) и \(4\).
Показать решение Решение
1a = [6, 2, 9, 4, 7] 2t = a[0] 3a[0] = a[4] 4a[4] = t 5print(a) # [7, 2, 9, 4, 6]
В Python обмен можно записать короче: a[0], a[4] = a[4], a[0]. Но при ручном трассировании алгоритма полезно понимать вариант с временной переменной: он показывает, какие значения читаются и куда записываются.
Для обмена значений \(a[p]\) и \(a[q]\) используют временную переменную: сначала сохраняют \(a[p]\), затем записывают \(a[q]\) в \(a[p]\), а сохранённое значение — в \(a[q]\).
Как решать задачи на обращение к элементам
При чтении программы или составлении алгоритма действуйте последовательно: определите длину массива, подпишите индексы, найдите каждое обращение вида a[i], а после присваивания сразу обновите значение изменённого элемента. Если индексы вычисляются формулой, сначала вычислите сам индекс и только потом обращайтесь к массиву.
- Запишите массив и индексы под его элементами.
- Проверьте, с нуля или с единицы начинается нумерация.
- Для каждой команды отделите индекс от значения элемента.
- После присваивания замените старое значение новым.
- Проверьте, не выходит ли индекс за допустимые границы.
1. Считать, что a[1] — первый элемент при нулевой нумерации. 2. Перепутать запись a[i] = 5 с проверкой a[i] == 5: первая изменяет массив, вторая только сравнивает. 3. При обмене перезаписать первый элемент и потерять его исходное значение. 4. В цикле использовать a[n], хотя последний индекс равен n-1. 5. Изменить значение переменной x, полагая, что изменился элемент a[i]: это не так, если новое значение не присвоено обратно массиву.
Составьте таблицу из двух строк: в первой укажите индексы, во второй — текущие значения. После каждой команды присваивания меняйте только соответствующую ячейку. Такой способ особенно удобен в заданиях, где несколько раз изменяется один и тот же элемент.
Быстрая проверка
a[2] = a[2] + 3, если a[2] равно 10?Главное
- Индекс указывает позицию элемента, а значение хранится в элементе массива.
- При нулевой нумерации массив из n элементов имеет индексы от 0 до n − 1.
- Чтение выполняют выражением
a[i], а изменение — присваиваниемa[i] = новое_значение. - Для обращения к соседям и другим вычисляемым индексам обязательно проверяют границы массива.
- При обмене элементов сначала сохраняют одно значение во временной переменной.