"Информатика (базовый уровень)", Семакин И.Г., Хеннер Е.К., Шеина Т.Ю.
Массив хранит набор однотипных значений, к которым обращаются по индексам. Он нужен, когда данные удобно обрабатывать как последовательность: например, найти сумму оценок, наибольшее число или количество элементов, подходящих под условие. Основа большинства таких задач — перебор массива, то есть последовательное обращение к каждому элементу. Важно правильно выбрать начальные значения и границы цикла, а перед вычислением среднего или поиском первого элемента проверить, что массив не пуст.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Массив — упорядоченная последовательность однотипных элементов, доступных по индексам. В программе ему дают имя, а значения размещают в ячейках, которые можно последовательно просматривать и изменять. Массив удобен, когда требуется хранить и обрабатывать много однотипных данных: например, оценки учеников или результаты измерений.
Элемент массива — отдельное значение, входящее в эту последовательность. Чтобы обратиться к нему, указывают имя массива и индекс: например, запись a[i] означает элемент массива a с индексом i. Такое обращение позволяет использовать конкретное значение в вычислении или проверять его условием.
Индекс массива — целое число, указывающее положение элемента. Диапазон индексов определяется языком программирования и способом объявления массива: начало нумерации может различаться. Поэтому перед циклом нужно выяснить, какие значения индекса соответствуют первому и последнему элементам.
Перебор массива — последовательное обращение к его элементам, обычно с помощью цикла. На каждом шаге алгоритм получает очередное значение и выполняет с ним нужное действие. Перебор лежит в основе многих задач, потому что результат часто нельзя получить, не проверив все элементы.
Обработку массива обычно начинают с перебора, потому что условие задачи может относиться к любому его элементу. Цикл последовательно задаёт допустимые индексы: от первого до последнего, не выходя за границы массива. Если элементов n и индексация начинается с нуля, обычно перебирают индексы от 0 до n − 1; при нумерации с единицы — от 1 до n.
Сумму находят с помощью накопителя — переменной, которая хранит промежуточный результат. Перед циклом в неё записывают 0, а при обработке каждого элемента прибавляют его значение: sum = sum + a[i]. Ноль выбран потому, что он не меняет результат сложения, поэтому первый элемент попадёт в сумму без лишней поправки.
Среднее арифметическое получают делением найденной суммы на количество элементов: average = sum / n. Размер массива n известен, поэтому отдельный подсчёт его элементов не нужен. Если n равно нулю, деление невозможно, а у пустого массива нет среднего; такой случай нужно проверить до вычисления.
Максимум или минимум определяют сравнением элементов. Начальное значение удобно взять из первого элемента непустого массива: тогда каждый следующий элемент сравнивается с настоящим значением из данных. Если же произвольно начать, например, с нуля, алгоритм может дать неверный ответ для массива, где все значения отрицательные или все положительные.
Количество элементов, удовлетворяющих условию, хранят в счётчике. Его начинают с нуля и увеличивают на единицу только тогда, когда текущий элемент проходит проверку, например a[i] ≥ порога. Счётчик отвечает на вопрос «сколько?», а накопитель суммы складывает сами значения; при необходимости оба результата обновляют в одном цикле.
| Задача | Что хранится в промежуточной переменной | Начальное значение | Действие при обработке элемента |
|---|---|---|---|
| Нахождение суммы элементов | Текущая сумма | 0 | Прибавить очередной элемент |
| Вычисление среднего арифметического | Сумма элементов | 0 | Прибавить очередной элемент; после цикла разделить сумму на размер массива |
| Поиск максимального или минимального элемента | Лучшее найденное значение | Первый элемент непустого массива | Заменить сохранённое значение, если текущий элемент больше или меньше |
| Подсчёт элементов, удовлетворяющих условию | Количество подходящих элементов | 0 | Увеличить счётчик на 1, если условие выполнено |
В таблице указано, что именно нужно хранить до получения окончательного ответа и как обновлять это значение при каждом шаге. Перед запуском цикла проверь, подходит ли начальное значение для выбранной операции и непуст ли массив, если требуется первый элемент. Несколько переменных можно обновлять в одном переборе, если задача требует получить несколько результатов.
Задача 1. Дан массив целых чисел. Найти сумму его элементов. Поскольку сумма зависит от каждого значения, нужно пройти массив полностью, а не ограничиваться первым или последним элементом. Для промежуточного результата заведём переменную sum.
Ответ: сумма элементов равна значению sum после завершения цикла. Если массив пуст, сумма по принятому соглашению равна нулю, но конкретное условие задачи может требовать отдельно сообщить об отсутствии данных.
Задача 2. Дан массив оценок. Найти средний балл и количество оценок не ниже заданного порога. Оба результата можно получить за один проход: каждую оценку нужно включить в сумму, а для счётчика дополнительно проверить условие. Пусть число оценок равно n, а порог обозначен p.
Ответ: средний балл равен sum / n, число оценок не ниже порога равно count. Например, оценки 4, 5 и 3 при пороге 4 дают сумму 12, среднее 4 и счётчик 2. При пустом массиве среднее не вычисляют.
Задача 3. Дан массив целых чисел. Найти максимальный элемент и количество элементов, равных ему. Сначала нужно узнать само максимальное значение, а затем посчитать, сколько раз оно встречается. Второй проход полезен тем, что максимум может встретиться в массиве несколько раз.
Ответ: max — наибольший элемент, count — число его вхождений. Повторный подсчёт нужен, потому что простое обновление максимума не сохраняет сведения о том, сколько раз значение встретилось.
Если максимум или минимум изначально равен нулю, результат может оказаться неверным: например, ноль больше любого числа в массиве, состоящем только из отрицательных значений. Такую ошибку допускают, принимая удобное число за универсальную начальную границу. Задай начальное значение первым элементом непустого массива и проверь алгоритм на наборе отрицательных чисел.
Неверные границы цикла приводят к тому, что первый или последний элемент пропускается либо программа обращается за пределы массива. Причина часто в путанице между размером массива и индексом последнего элемента: при нумерации с нуля последний индекс равен n − 1. Проверь, что цикл охватывает ровно n индексов и обращение к каждому из них допустимо.
Если перед обработкой не обнулить сумму или счётчик, переменная сохранит результат предыдущего вычисления. Это происходит, когда накопитель объявляют один раз и затем используют повторно. Перед каждым новым запуском алгоритма присвой сумме и счётчику начальные значения и проверь, что результат не зависит от прежнего содержимого переменных.
Деление суммы на количество элементов без проверки размера массива вызывает ошибку при пустом массиве. Её допускают, когда формулу среднего сразу переносят в программу, не рассматривая крайний случай. До деления проверь, что количество элементов больше нуля, и отдельно определи, какое сообщение или действие требуется при отсутствии данных.
Для обработки массива нужны знания о самом массиве и индексе элемента: они объясняют, где находятся данные и как обратиться к каждому значению. Цикл организует повторение действий, а условный оператор позволяет выбирать элементы по заданному признаку. Поэтому перед составлением алгоритма полезно уверенно пользоваться всеми этими понятиями.
Перебор и накопление результатов встречаются не только при работе с одномерными последовательностями. Эти приёмы применяют при обработке таблиц и поиске нужных данных, а также используют как основу более сложных алгоритмов. Например, перед сортировкой часто требуется уметь сравнивать элементы и находить нужные значения.
Почему сумму начинают накапливать с нуля?
Ноль — нейтральное значение для сложения: прибавление к нему первого элемента даёт сам этот элемент. Если взять другое начальное значение, оно ошибочно попадёт в итоговую сумму.
Как правильно задать начальное значение максимума?
Для непустого массива начальный максимум задают равным его первому элементу. Так алгоритм работает и тогда, когда все числа отрицательные, и не зависит от произвольной границы.
Чем счётчик отличается от накопителя суммы?
Счётчик хранит количество подходящих элементов и обычно увеличивается на единицу при выполнении условия. Накопитель суммы хранит результат сложения значений элементов.
Можно ли за один перебор найти сумму и посчитать подходящие элементы?
Да. В цикле можно одновременно прибавлять каждый элемент к сумме и увеличивать счётчик, если элемент удовлетворяет условию. Для этих результатов используют отдельные переменные.
Что делать, если массив пуст?
Нужно проверить размер массива до начала вычислений. Для пустого массива нельзя делить сумму на количество элементов или обращаться к первому элементу; следует обработать этот случай отдельно.
§ 26. Типовые задачи обработки массивов