Программирование в среде Турбо Паскаль (Поляков, Круглов) - страница 67

- 103 -

Циклы с параметром — очень быстрые и генерируют компактный выполнимый код. Но всем им присущ один традиционный в Паскале недостаток — параметр должен принадлежать к перечислимому типу, а шаг не может быть изменен. Так, в первых двух циклах на рис. 6.2 шагом будет значение +1 и -1 соответственно, в цикле от 'а' до 'г' параметр C примет последовательные значения 'а', 'б', 'в', 'г', т.е. каждый следующий элемент — это значение функции Succ(C). Следствием этого являются проблемы организации циклов с шагом, отличным, например, от 1, а тем более циклов с вещественным параметром.

Для разрешения таких проблем приходится использовать обходные пути: обращаться к циклам с условиями. Так, цикл с вещественным параметром r от 3,20 до 4,10 с шагом 0,05 можно запрограммировать циклом WHILE:

r:=3.20;

WHILE r<=4.10 do

BEGIN

...

r := r + 0.05

end;

Возвращаясь к циклам FOR, заметим, что они допускают вложенность при условии, что никакой из вложенных циклов, наряду с другими операторами, не использует и не модифицирует переменные — параметры внешних циклов.

6.7. Оператор безусловного перехода Goto


Оператор Goto, имеющийся во многих алгоритмических языках, включая и Турбо Паскаль, можно с полным правом назвать «злосчастным». В разгар моды на структурное программирование он подвергся сильным гонениям, ибо было доказано, что можно вообще программировать без него. Из-за того же Goto здорово доставалось Фортрану и раннему Бейсику, большей частью справедливо, так как от пары десятков переходов вдоль и поперек программа не становится более понятной.

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

Полный синтаксис оператора перехода — это

Goto Метка;

- 104 -

где метка — описанный в блоке LABEL идентификатор (цифры от 0 до 9999 или собственно идентификатор). Метка может стоять в программе «где угодно» между операторами. При этом каждая метка может появиться только один раз (рис. 6.3):


| LABEL

| > m10, m20, StopLabel, 1;

| VAR

| > i : ShortInt;

| BEGIN

| > 0001:

| >IF i<10 THEN Goto m10 ELSE Goto m20;

| >...

| > m10 : WriteLn('i меньше 10');

| > Goto StopLabel;

| > m20 : i := i - 1;

| >...

| > Goto 1;

| > StopLabel:

| END.


Рис. 6.3

Метка от оператора должна отделяться символом «:». Если метка обозначается цифрой, то предшествующие нули не являются значащими. Так, на рис. 6.3 метки 1 и 0001 эквивалентны. Обычно метки размещаются у операторов, но могут стоять и у слова