Оператори for-next
У мові Бейсік передбачена пара операторів, що забезпечують побудову циклу того ж виду, що й в наведеному вище прикладі (див. Розд. 3.3). Це оператори FOR і NEXT, які облямовують групу операторів, що складають тіло циклу. Наприклад, наведену вище програму можна з їх допомогою переписати у вигляді
Рядок 20 автоматично бере на себе присвоювання лічильнику циклу I початкового значення 1 і збільшення I на 1 після кожного проходу циклу. Рядок 60 позначає кінець циклу.
Всі оператори між операторами FOR і NEXT виконуються при I = 1, I = 2, I = 3 і так далі до I = N. Після цього управління передається оператору, наступному за оператором NEXT. Отже, в нашому прикладі буде введено, перетворено і надруковано N значень температури, після чого програма завершує свою роботу.
Цю програму можна ілюструвати наступною діаграмою:
ВВЕДЕННЯ З F = С * ... ДРУК F КІНЕЦЬ
Загальна форма запису: FOR i = j ТО k або
де i числова керуюча змінна, а j. k, m можуть бути числовими виразами (т. е.
константами, змінними, а також комбінаціями змінних і констант).
Нижньою межею циклу, розпочатого оператором FOR, служить оператор NEXT i. Всі оператори між FOR та NEXT виконуються при
i = j, i = j + m, i = j + 2m, i = j + 3m, i =. до тих пір, поки не буде досягнута межа k.
Іншими словами, якщо т позитивно, то цикл триває весь час поки i ≤k. Якщо m негативно, то цикл триває, поки i ≥k. Якщо додаткове службове слово STEP (крок) відсутня, то величина кроку m передбачається рівний +1.
Наведемо кілька прикладів. програма
10 FOR I = 1 ТО 10
надрукує всі числа від 1 до 10, Програма
10 FOR K = 1 TO 10 STEP 2
надрукує всі непарні числа від 1 до 10. Програма
30 FOR P = X + Y TO X * Y
надрукує значення 5 і 6, а програма
10 FOR А = 10 ТО 1 STEP -1
надрукує числа від 10 до 1 в порядку убування.
У багатьох системах з Бейсиком, наприклад Sinclair ZX81, перевірка виходу за межі циклу здійснюється відповідно до стандарту, на початку циклу. Тому при виконанні операторів
нічого не буде надруковано і управління буде передано в рядок 40. Це відповідає прикладу програми з розд. 3.3 і структограмме "ПОВТОРЮВАТИ, ПОКИ".
В інших системах з Бейсиком, наприклад ВВС, стандарт не дотримується. Цикл виконується, принаймні, один раз, і перевірка його завершення проводиться в кінці циклу. Подібного підходу відповідає модифікована програма з розд. 3.3 і структограмма "ПОВТОРЮВАТИ ДО". В цьому випадку наведена вище програма надрукує 3.
У всіх наведених нижче прикладах передбачається, що цикл FOR-NEXT реалізований згідно структограмме "ПОВТОРЮВАТИ, ПОКИ", оскільки саме цей варіант передбачений стандартом для мінімального підмножини мови Бейсік. Якщо у Вашій системі перевірка умови виходу з 56
циклу проводиться в кінці циклу, то треба користуватися іншою структограммой, "ПОВТОРЮВАТИ ДО", позначаючи її внизу службовим словом FOR. Можете не дуже піклуватися про це відмінності: воно викликає зміни в результатах роботи програми при переході від системи першого типу до системи другого типу приблизно в одному випадку з тисячі. Достатньо лише мати уявлення про те, до якого з цих двох типів відноситься Ваша система. Дамо кілька застережень. Не змінюйте значення керуючої змінної всередині циклу. Система автоматично збільшує значення цієї змінної і перевіряє його при кожному проході циклу. Тому керуюча змінна не повинна з'являтися в лівій частині оператора LET, в операторах READ або INPUT, а також не повинна використовуватися як керуюча змінна вкладеного циклу. Нижче наводяться приклади помилкового використання керуючоїзмінної:
10 FOR I = 1 ТО 10
20 I = I + 1 (керуюча змінна I змінюється) 30 NEXT I
10 FOR А = 2 ТО 8 STEP 2
20 INPUT I, А (керуюча змінна вказана в операторі INPUT)
Не слід розраховувати на те, що після виходу з циклу керуюча змінна буде мати певне значення. У прикладі
10 FOR L = 1 TO 10
при виконанні рядка 40 може друкуватися 10,11 або взагалі якась нісенітниця. Результати будуть відрізнятися у різних систем, хоча в стандарті мінімального підмножини Бейсика рекомендується, щоб керуюча змінна після виходу з циклу містила значення, яке вона мала б всередині циклу при його продовженні ще на один крок.
Намагайтеся всередині циклу FOR не зраджувати зазначені в операторі FOR межі значень керуючої змінної, хоча це може не вплинути на виконання циклу; наприклад, програма
20 FOR I = A TO 4
50 NEXT I видає правильні результати 2, 3 і 4.
Оператор NEXT Загальна форма запису: NEXT i
NEXT де i - числова змінна.
Завершує цикл FOR Крім того, більшість версій Бейсика для кожного оператора FOR вимагає наявності окремого оператора NEXT із зазначенням імені керуючої змінної. Однак в деяких версіях допускається застосування оператора NEXT без вказівки імені керуючої змінної або навіть (в разі вкладених циклів) із зазначенням декількох імен керуючих змінних.
Для виходу з циклу FOR-NEXT, не чекаючи його повного завершення, можна використовувати оператори IF або GO TO. Правда, робити це не рекомендується, так як такий вихід із циклу може викликати непорозуміння і, крім того, його, як правило, не можна зобразити структограммой. І вже у всякому разі, ніколи не передавайте управління всередину циклу FOR-NEXT, так як це може призвести до непередбачуваних результатів.
Джерело: Уолш Б. Програмування на Бейсике: Пер. з англ. М. Радио и связь, 1988. 336 с: ил.