10. Метки. Оператор GOTO. Процедура Halt

Операторы в Паскале могут быть помечены. Метки - это идентификаторы, или целые числа от 0 до 9999, они могут записываться перед любым выполняе­мым оператором и отделяются от него двоеточием. Оператор может иметь любое количество меток. Все метки, использованные в программе, должны быть описа­ны в разделе описаний с ключевым словом LABEL. В одном операторе LABEL можно описать несколько меток, тогда они разделяются запятыми. Оператор безусловного перехода

GOTO метка;

передает управление оператору с соответствующей меткой, при этом все опера­торы, расположенные между оператором GOTO и оператором, которому переда­ется управление, не выполняются. С помощью оператора GOTO нельзя передать управление : внутрь цикла, внутрь условного оператора и внутрь оператора вы­бора.

Общепризнано, что оператор GOTO является вредным оператором, он ус­ложняет алгоритмы, затрудняет чтение программы и является источником оши­бок. Постарайтесь не применять этот оператор в своих программах.

Одним из случаев, когда программисту может показаться полезным оператор GOTO, является необходимость прекратить выполнение программы при возник­новении той или иной ошибки. Пусть, например, программа вычисляет некото­рую функцию от квадратного корня из заданного числа:

VAR x : Real;

BEGIN WRITE('Введите число '); READ(x); x:=SQRT(x);

{ вычисление функции от x}

END.

Если введено отрицательное число, то в третьем операторе программы произой­дет аварийное прерывание. Стремясь избежать этого, мы могли бы записать про­грамму в виде:

VAR x : Real; LABEL Finish;

BEGIN WRITE('Введите число '); READ(x); IF x<0 THEN GOTO Finish; x:=SQRT(x);

{ вычисление функции от x}

Finish:END.

Однако можно не использовать GOTO :

VAR x : Real;

BEGIN WRITE('Введите число '); READ(x); IF x<0 THEN МГСІПта^Сошибка !') ELSE BEGIN

x:=SQRT(x);

{ вычисление функции от x}

END;

END.

Как видите, программа даже стала лучше, т.к. теперь она сообщает о непра­вильном вводе. Но она все-таки имеет один недостаток - условный оператор ус­ложнил структуру программы. В этом и в других подобных случаях очень удобно пользоваться стандартной процедурой Паскаля HALT, которая останавливает выполнение программы, будучи вызвана в любом ее месте:

VAR x : Real;

BEGIN WRITE('Введите число '); READ(x);

IF x<0 THEN BEGIN WRITELN('ошибка !'); HALT; x:=SQRT(x);

{вычисление функции от x}

END.

Наша программа стала почти идеальной. Доведем ее до совершенства : VAR x : Real; BEGIN REPEAT

WRITE('Введите неотрицательное число ');

READ(x); WRITELN; UNTIL x>=0;

x:=SQRT(x);

{ вычисление функции от x}

END.