Перебор массива
Перебор массива — это последовательный просмотр его элементов, обычно от первого к последнему. При переборе можно искать нужные значения, подсчитывать элементы по условию, находить сумму или максимум, а также изменять элементы массива.
Идея последовательного перебора
Перед началом работы важно различать сам массив и его индекс. Элемент массива — это значение, расположенное в ячейке с определённым индексом. В большинстве языков программирования индексы начинаются с 0, поэтому для массива из \(n\) элементов допустимы индексы от \(0\) до \(n-1\). В школьных алгоритмах и некоторых вариантах Паскаля нумерация может начинаться с 1. Всегда проверяйте, какая нумерация используется в условии и коде.
Перебор массива — выполнение одинаковых действий для каждого элемента массива в заданном порядке. Чаще всего используется цикл for, реже — цикл while.
Переменная \(i\) называется индексом или счётчиком цикла. На каждом шаге она принимает очередное значение, а программа обращается к элементу \(a[i]\). Общая схема такова: прочитать элемент, проверить условие или выполнить действие, перейти к следующему индексу.
for i in range(n): x = a[i] # обработка элемента x
for i := 1 to n do begin x := a[i]; { обработка элемента x } end;
Если массив содержит \(n\) элементов и индексация начинается с нуля, цикл должен просмотреть индексы от \(0\) до \(n-1\). Если индексация начинается с единицы, границы — от \(1\) до \(n\). Выход за эти границы приводит к обращению к несуществующему элементу.
Типовые действия при переборе
Один и тот же цикл может решать разные задачи. Отличается главным образом начальное значение вспомогательной переменной и действие внутри цикла.
- Подсчёт: увеличить счётчик, если элемент удовлетворяет условию.
- Сумма: прибавить очередной элемент к накопленной сумме.
- Поиск: сравнить элемент с искомым значением и запомнить результат.
- Выбор минимума или максимума: сравнивать элементы с текущим лучшим значением. Подробный случай разобран на странице минимума и максимума в массиве.
- Преобразование: заменить элемент новым значением, например увеличить все положительные элементы в два раза.
Здесь квадратные скобки означают индикатор условия: они равны 1, если условие истинно, и 0 — если ложно. На практике вместо такой математической записи используется if.
count = 0 for x in a: if x > 0: count += 1
Этот фрагмент считает положительные элементы. Начальное значение count = 0 обязательно: до просмотра массива найдено ноль подходящих элементов. Аналогично сумма обычно начинается с нуля, а произведение — с единицы. Среднее арифметическое нельзя вычислять до проверки, что количество выбранных элементов не равно нулю; отдельная страница посвящена среднему арифметическому элементов массива.
Что окажется в переменной count после выполнения кода для массива [-2, 0, 4, 7]?
Как правильно строить алгоритм
Перед написанием цикла полезно назвать величину, которую требуется получить, и определить её начальное значение. Затем нужно выбрать условие обработки и способ обновления результата. Например, для количества элементов, больших \(k\), нужны переменная-счётчик, начальное значение 0, проверка a[i] > k и увеличение счётчика на 1.
| Задача | Начальное значение | Действие внутри цикла |
|---|---|---|
| Количество элементов по условию | 0 | если условие истинно, увеличить на 1 |
| Сумма выбранных элементов | 0 | если условие истинно, прибавить элемент |
| Произведение выбранных элементов | 1 | если условие истинно, умножить на элемент |
| Поиск значения | ложь или специальный признак | при совпадении запомнить результат |
| Преобразование | массив уже заполнен | изменить \(a[i]\) при выполнении условия |
Сначала найдите границы цикла, затем определите, какой элемент рассматривается на шаге, и только после этого анализируйте условие и изменение переменных. Так легче не перепутать индекс, значение элемента и накопленный результат.
Разобранный пример: сумма и количество
Дан массив из \(n\) целых чисел. Требуется найти среднее арифметическое положительных элементов. Если положительных элементов нет, вывести сообщение об отсутствии результата.
Одного перебора достаточно. Во время него будем хранить сумму положительных элементов sum и их количество count. После цикла вычислим sum / count, но только если count > 0.
sum_positive = 0 count = 0 for x in a: if x > 0: sum_positive += x count += 1 if count > 0: average = sum_positive / count print(average) else: print("нет положительных элементов")
Рассмотрим массив \([-3, 5, 2, -1]\). После обработки \(-3\) значения не меняются. После 5 получаем sum = 5, count = 1. После 2 — sum = 7, count = 2. Последний элемент отрицательный, поэтому итоговое среднее равно \(7/2=3{,}5\).
1. Неправильные границы: цикл идёт до \(n\), хотя последний индекс равен \(n-1\).<br>2. Забытое начальное значение: счётчик или сумма используют случайное значение.<br>3. Изменение не той переменной: вместо a[i] меняют индекс i.<br>4. Лишнее условие: ноль ошибочно считают положительным или отрицательным.<br>5. Деление на ноль: среднее вычисляют при count = 0.<br>6. Смешение индекса и значения: i — номер ячейки, а a[i] — её содержимое.<br>7. Изменение массива при поиске: если задача требует только найти ответ, не нужно менять элементы.
Перебор с изменением массива
При преобразовании нужно обращаться к элементу по индексу, потому что переменная цикла, содержащая значение, может быть лишь копией. Например, чтобы заменить отрицательные элементы их модулями, записывают новое значение обратно в массив.
for i in range(len(a)): if a[i] < 0: a[i] = -a[i]
После такого прохода все элементы становятся неотрицательными. Для простого чтения можно использовать for x in a, но для изменения обычно нужен for i in range(len(a)). Ввод и вывод массива рассматриваются на соседних страницах ввода массива и вывода массива. Если обрабатывать нужно только часть массива, сначала изучите обработку отрезка массива. Обратный порядок просмотра разобран на странице обратного перебора массива.
Перебор — это не отдельная сложная операция, а каркас алгоритма: выбрать очередной элемент, обработать его и перейти к следующему. Почти всегда ответ строится накоплением результата во время одного прохода.
Быстрая проверка
count > 0?Итоги
- Перебор последовательно рассматривает каждый элемент массива в заданных границах.
- Для индексации с нуля используются индексы от 0 до \(n-1\).
- Счётчик, сумма и произведение требуют правильной инициализации до начала цикла.
- Условие внутри цикла определяет, какие элементы учитывать или изменять.
- Для изменения элемента обращаются к
a[i]и записывают новое значение обратно. - Перед делением на количество найденных элементов нужно убедиться, что оно не равно нулю.