Урок №79. Масиви і цикли

  Юрій  | 

  Оновл. 24 Сер 2021  | 

 373

На даному уроці ми розглянемо використання масивів з циклами, а також ті підводні камені, які можуть при цьому виникнути.

Навіщо використовувати цикли з масивами?

Розглянемо випадок, коли потрібно обчислити середній бал студентів в групі. Використовуючи окремі змінні:

Ми отримаємо багато оголошень змінних і, відповідно, багато коду — а це всього лише 5 студентів! А уявіть, якби їх було 30 чи 150.

Крім того, щоб додати нового студента, нам доведеться оголосити нову змінну, ініціалізувати її і додати в змінну totalScore. І це все вручну. А кожен раз при зміні старого коду є ризик наробити нових помилок. А ось з використанням масиву:

Кількість оголошених змінних зменшиться, але в totalScore як і раніше доведеться заносити кожен елемент масиву вручну. І, як зазначено вище, зміна кількості студентів означає, що формулу totalScore необхідно буде змінювати також вручну.

От якби був спосіб автоматизувати цей процес.

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

З попереднього уроку ми вже знаємо, що індекс масиву не обов’язково повинен бути константним значенням — він може бути і звичайною змінною. А це означає, що ми можемо використовувати лічильник циклу в якості індексу масиву для доступу до елементів і виконання з ними необхідних математичних та інших операцій. Це настільки поширена практика, що майже завжди при виявленні масиву, ви знайдете поруч з ним цикл! Коли цикл використовується для доступу до кожного елементу масиву по черзі, то це називаються ітерацією по масиву. Наприклад:

Це рішення ідеально підходить як в плані зручності і читання, так і в плані підтримки. Оскільки доступ до кожного елементу масиву виконується через цикл, то формула підрахунку суми всіх значень автоматично налаштовується з урахуванням кількості елементів в масиві. І для обчислення середньої оцінки нам вже не потрібно буде вручну додавати нових студентів і індекси нових елементів масиву!

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

Ось тут вже використовується змінна maxScore (не з циклу) для відслідковування найбільшого значення масиву. Спочатку ми ініціалізуємо maxScore значенням 0, що означає, що ми ще не бачили ніяких оцінок. Потім перебираємо кожен елемент масиву і, якщо знаходимо оцінку, яка більша за попередню, присвоюємо її значення змінній maxScore. Таким чином, maxScore завжди зберігатиме найбільше значення зі всіх елементів масиву.

Використання циклів з масивами

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

   Обчислити значення (наприклад, середнє арифметичне чи суму всіх значень).

   Знайти значення (наприклад, найбільше чи найменше).

   Відсортувати елементи масиву (наприклад, по зростанню чи по спаданню).

При обчисленні значення, змінна зазвичай використовується для зберігання проміжного результату, який використовується для обчислення кінцевого значення. У вищенаведеному прикладі, де ми обчислюємо середній бал, змінна totalScore містить суму значень всіх розглянутих елементів.

При пошуку значення, змінна зазвичай використовується для зберігання найкращого варіанту (або індексу найкращого варіанту) з усіх переглянутих. У вищенаведеному прикладі, де ми використовуємо цикл для пошуку найбільшої оцінки, змінна maxScore використовується для зберігання найбільшої кількості балів з переглянутих раніше елементів масиву.

Сортування масиву відбувається дещо складніше, оскільки в цьому процесі використовуються вкладені цикли (про це трохи пізніше).

Масиви і помилка неврахованої одиниці

Найскладнішим при використанні циклів з масивами є переконатися, що цикл виконується правильну кількість разів. Помилку неврахованої одиниці зробити легко, а спроба отримати доступ до елементу, індекс якого більший за довжину масиву, може мати найрізноманітніші наслідки. Розглянемо наступну програму:

Тут проблема полягає в неправильній умові оператора if в циклі for! Оголошений масив містить 5 елементів, проіндексованих від 0 до 4. Проте цикл всередині перебирає елементи від 0 до 5. Отже, на останній ітерації в циклі for виконається наступне:

Але ж students[5] не визначений! Його значенням, швидше за все, буде сміття. І в результаті ми отримаємо помилковий maxScore.

Проте уявіть, що сталося б, якби ми ненароком присвоїли значення елементу students[5]! Ми могли б перезаписати іншу змінну (або її частину) або зіпсувати що-небудь — ці типи помилок дуже важко відстежити!

Отже, при використанні циклів з масивами, завжди перевіряйте умови в циклах, щоб переконатися, що їх виконання не призведе до помилки неврахованої одиниці.

Тест

Завдання №1

Виведіть на екран наступний масив, використовуючи цикл:

Відповідь №1

Завдання №2

Використовуючи масив з завдання №1, попросіть користувача ввести число від 1 до 9. Якщо користувач введе що-небудь інше — попросіть його ввести число ще раз і так до тих пір, поки він не введе коректне значення з вказаного діапазону. Як тільки користувач введе число від 1 до 9, виведіть масив на екран. Потім знайдіть в масиві елемент з числом, яке ввів користувач, і виведіть його індекс.

Для обробки некоректного користувацького вводу ви можете використати наступний код:

Відповідь №2

Завдання №3

Змініть наступну програму так, щоб замість maxScore з найбільшим значенням, змінна maxIndex містила індекс елементу з найбільшим значенням:

Відповідь №3

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (5 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *