64 lines
3.2 KiB
Markdown
64 lines
3.2 KiB
Markdown
![]() |
---
|
|||
|
id: 587d7b86367417b2b2512b3d
|
|||
|
title: Запобігання безкінечним циклам дійсною кінцевою умовою
|
|||
|
challengeType: 1
|
|||
|
forumTopicId: 301192
|
|||
|
dashedName: prevent-infinite-loops-with-a-valid-terminal-condition
|
|||
|
---
|
|||
|
|
|||
|
# --description--
|
|||
|
|
|||
|
Остання тема - це безкінечний цикл, який багатьох жахає. Цикли є чудовими інструментами, коли вам необхідно, щоб ваша програма виконувала блок коду певну кількість разів, або поки умова не буде виконана, але їм також потрібна кінцева умова, яка закінчить цикл. Нескінченні цикли можуть призвести до блокування або збоїв у роботі браузера, чого кожен прагнув би уникнути.
|
|||
|
|
|||
|
У вступі до цього розділу був приклад нескінченного циклу - у нього немає кінцевої умови для того, щоб вибратися з циклу `while` всередині `loopy()`. НЕ викликайте цю функцію!
|
|||
|
|
|||
|
```js
|
|||
|
function loopy() {
|
|||
|
while(true) {
|
|||
|
console.log("Hello, world!");
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Завданням програми є гарантувати, що кінцева умова, яка вказує програмі на момент розірвання коду циклу, нарешті досягнута. Одна помилка може зменшити або збільшити змінну лічильника у неправильному від кінцевої умови напрямку. Інша ж може випадково скинути дані лічильника чи змінну індексу всередині самого циклу замість його збільшення чи зменшення.
|
|||
|
|
|||
|
# --instructions--
|
|||
|
|
|||
|
Функція `myFunc()` містить нескінченний цикл, оскільки кінцева умова `i != 4` ніколи не оцінюватиметься як `false` (та не розірве цикл) - `i` збільшуватиметься на 2 з кожним виконанням циклу і пропустить 4, оскільки `i` має бути непарним для початку запуску. Виправіть оператора порівняння у кінцевій умові так, щоб цикл виконувався лише якщо `i` менше або рівне 4.
|
|||
|
|
|||
|
# --hints--
|
|||
|
|
|||
|
Ваш код повинен змінити оператора порівняння у кінцевій умові (середня частина) циклу `for`.
|
|||
|
|
|||
|
```js
|
|||
|
assert(code.match(/i\s*?<=\s*?4;/g).length == 1);
|
|||
|
```
|
|||
|
|
|||
|
Ваш код повинен виправити оператора порівняння у кінцевій умові циклу.
|
|||
|
|
|||
|
```js
|
|||
|
assert(!code.match(/i\s*?!=\s*?4;/g));
|
|||
|
```
|
|||
|
|
|||
|
# --seed--
|
|||
|
|
|||
|
## --seed-contents--
|
|||
|
|
|||
|
```js
|
|||
|
function myFunc() {
|
|||
|
for (let i = 1; i != 4; i += 2) {
|
|||
|
console.log("Still going!");
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
# --solutions--
|
|||
|
|
|||
|
```js
|
|||
|
function myFunc() {
|
|||
|
for (let i = 1; i <= 4; i += 2) {
|
|||
|
console.log("Still going!");
|
|||
|
}
|
|||
|
}
|
|||
|
```
|