Главная » Basic » ОПЕРАТОРЫ FOR-NEXT

0

В языке Бейсик предусмотрена пара операторов, обеспечивающих построение цикла того же вида, что и в приведенном выше примере (см. разд. 3.3). Это операторы FOR и NEXT, которые окаймляют группу операторов, составляющих тело цикла. Например, приведенную выше программу можно с их помощью переписать в виде

Строка 20 автоматически  берет на себя присваивание  счетчику цикла I начального значения 1 и увеличение I на 1 после каждого прохода цикла. Строка 60 обозначает конец цикла.

Все операторы между операторами FOR и NEXT исполняются  при I=1, I = 2,I = 3 и так далее до I = N. После этого управление передается оператору, следующему за оператором NEXT. Следовательно, в нашем примере будет введено, преобразовано и  напечатано N значений температуры, после  чего программа завершает свою работу.

Эту программу можно иллюстрировать следующей диаграммой:

ВВОД N

ДЛЯ I=1 ДО N

ВВОД С F=С* … ПЕЧАТЬ F КОНЕЦ

Оператор FOR

Общая форма записи: FOR i=j ТО k или

FOR i =j ТО k STEP m

где i числовая управляющая переменная, а j, k, m могут быть числовыми выражениями (т.  е.

константами, переменными, а также комбинациями переменных и констант).

Нижней     границей     цикла,      начатого    оператором   FOR,    служит оператор NEXT  i.  Все операторы между FOR и NEXT выполняются при

i=j, i=j+m, i =j+2m, i =j+3m, i =. . . до тех пор, пока не будет достигнут предел k.

Другими  словами,  если  т  положительно,  то  цикл  продолжается  все  время  пока  ik.  Если  m отрицательно, то цикл продолжается, пока ik. Если дополнительное служебное слово STEP (шаг) отсутствует, то величина шага m предполагается равной +1.

Приведем несколько примеров. Программа

10   FOR I = 1 ТО 10

20     PRINT I

30   NEXT I

напечатает все числа от 1 до 10, Программа

10  FOR K=1 TO 10 STEP 2

20     PRINT К

30  NEXT К

напечатает все нечетные числа от 1 до 10. Программа

10   Х=2

20  Y=3

30   FOR P = X+Y TO X*Y

40     PRINT P

50  NEXT P

напечатает значения 5 и 6, а программа

10   FOR А = 10 ТО 1  STEP -1

20     PRINT A

30  NEXT A

напечатает числа от 10 до 1 в порядке убывания.

Во  многих системах с  Бейсиком, например Sinclair  ZX81,  проверка  выхода  за  пределы  цикла осуществляется согласно стандарту, в начале цикла. Поэтому при исполнении операторов

10  FOR I=3 TO 2

20     PRINT I

30  NEXT I

ничего не будет напечатано и  управление будет передано в строку 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)

30     I=10+I+А

40 NEXT A

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

10 FOR L=1 TO 10

20     PRINT L

30 NEXT L

40 PRINT L

при исполнении  строки 40 может печататься 10,11 или  вообще какая-нибудь ерунда. Результаты будут  отличаться  у  разных  систем,  хотя  в  стандарте  минимального подмножества  Бейсика рекомендуется, чтобы управляющая переменная после выхода из цикла  содержала значение, которое она имела бы внутри цикла при его продолжении еще на один шаг.

Старайтесь  внутри цикла FOR  не  изменять указанные  в  операторе  FOR  пределы  значений управляющей переменной, хотя это может не повлиять на исполнение цикла; например, программа

10 А=2

20  FOR I = A TO 4

30     А=А+1

40     PRINT I

50 NEXT I выдает правильные результаты 2, 3 и 4.

Оператор NEXT Общая форма записи: NEXT i

или

NEXT где i — числовая переменная.

Завершает цикл FOR, Большинство версий Бейсика для каждого оператора FOR требует наличия отдельного оператора NEXT с указанием имени управляющей переменной. Однако в  некоторых версиях допускается применение оператора NEXT без указания имени управляющей переменной или даже (в случае вложенных циклов) с указанием нескольких имен управляющих переменных.

Для  выхода  из  цикла FOR-NEXT,  не  дожидаясь его  полного  завершения, можно  использовать операторы IF или GO TO. Правда, делать это не рекомендуется, так как такой выход из цикла  может вызывать недоразумения и, кроме того, его, как правило, нельзя изобразить структограммой. И уж во всяком случае, никогда не передавайте управление внутрь цикла FOR-NEXT, так как это может привести к непредсказуемым результатам.

Источник: Уолш Б.    Программирование на Бейсике: Пер. с англ. М.: Радио и связь, 1988. 336 с: ил.

По теме:

  • Комментарии