Урок 76. Массивы и циклы

   ⁄ 

 Обновлено 28 Сен 2017

  ⁄   

⁄  2

Рассмотрим случай, когда нужно найти средний балл среди оценок всех студентов в группе. Используя отдельные переменные:

Мы получим много объявлений переменных и, следовательно, много текста — и это всего лишь 5 студентов! А представьте, если их было бы 30 или 150.

Кроме того, чтобы добавить нового студента, придется объявить новую переменную, инициализировать её и добавить в выражение totalScore. И это всё вручную. А каждый раз при изменении старого кода есть риск наделать новых ошибок.

А вот с использованием массива:

Количество объявленных переменных сократится, но в totalScore по-прежнему требуется заносить каждый элемент массива вручную. И, как указано выше, изменение количества студентов означает, что формулу totalScore необходимо будет изменять также, вручную.

Если бы только был способ автоматизировать этот процесс.

Циклы и массивы

В предыдущем уроке мы узнали, что индекс массива не обязательно должен быть константным значением — он может быть переменной. Это означает, что мы можем использовать счетчик цикла в качестве индекса массива для доступа к элементам и выполнения необходимых математических и других операций. Это настолько распространенная практика, что почти всегда при обнаружении массива, вы найдете рядом с ним цикл! Когда цикл используется для доступа к каждому элементу массива по очереди, то это называются итерацией по массиву.

Вот пример выше, но уже с использованием цикла for:

Это решение идеально подходит как в плане удобства и чтения, так и поддержки. Поскольку доступ к каждому элементу массива выполняется через цикл, то формула подсчета суммы всех значений автоматически настраивается с учетом количества элементов в массиве. И для вычисления средней оценки нам уже не нужно будет вручную добавлять новых студентов и индексы новых элементов массива!

А вот пример использования цикла для поиска в массиве наибольшего значения (наилучшей оценки среди всех студентов в группе):

Здесь уже используется переменная maxScore (не из цикла) для отслеживания самого большого значения в массиве. Сначала инициализируем maxScore значением 0, что означает, что мы еще не видели никаких оценок. Затем перебираем каждый элемент массива и, если находим оценку, которая выше предыдущей, присваиваем её значение переменной maxScore. Таким образом, maxScore всегда будет хранить наибольшее значение из всех элементов в массиве.

Использование циклов с массивами

Циклы с массивами обычно используются для выполнения одной из трех задач:

Вычислить значение (например, среднее или сумму всех значений).

Найти значение (например, самое высокое или самое низкое).

Отсортировать элементы массива (например, по возрастанию или по убыванию).

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

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

Сортировка массива происходит несколько сложнее, так как в этом деле используются вложенные циклы. Но об этом уже в следующем уроке.

Массивы и «ошибка на единицу»

Одна из самых сложных частей использования циклов с массивами — это убедиться, что цикл выполняется правильное количество раз. Ошибку на единицу (или еще «ошибку неучтенной единицы») сделать легко, а попытка получить доступ к элементу, индекс которого больше, чем длина массива, может иметь самые разные последствия. Рассмотрим следующую программу:

Здесь проблема состоит в неверном условном выражении if в цикле for! Объявленный массив содержит 5 элементов, проиндексированных от 0 до 4. Однако цикл внутри перебирает элементы от 0 до 5. Следовательно, на последней итерации в цикле for выполнится:

Но ведь students[5] не определен! Его значением, скорее всего, будет простой мусор. И в итоге, результатом выполнения цикла может быть ошибочный maxScore.

Однако представьте, что бы произошло, если бы мы ненароком присвоили значение элементу students[5]! Мы бы могли перезаписать другую переменную (или ее часть) или испортить что-либо — эти типы ошибок очень трудно отследить!

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

Тест

1. Выведите на экран следующий массив с помощью цикла:

Подсказка: Используйте трюк с sizeof() (из предыдущего урока) для определения длины массива.

2. Используя массив из задания № 1:

Попросите пользователя ввести число от 1 до 9. Если пользователь введет что-либо другое — попросите снова и так до тех пор, пока он не введет корректное значение из заданного диапазона. Как только пользователь введет число от 1 до 9 – выведите массив на экран. Затем найдите в массиве элемент с числом, которое ввел пользователь, и выведите его индекс.

Для обработки некорректного ввода используйте следующий код:

3. Измените следующую программу, чтобы вместо maxScore с наибольшим значением переменная maxIndex содержала индекс элемента с наибольшим значением.

Ответы

Ответ 1

Ответ 2

Ответ 3

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (6 оценок, среднее: 5,00 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Комментариев: 2

  1. Валерий:

    Много же тебе еще переводить! Хватит ли духу до конца? Вообще нужное дело!

    1. Li4ik:

      Уже можно сказать рефлекс выработался 🙂 Сам не знаю, пока будет свободное время — буду переводить.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *