Учебная работа. Статья: Метки. Оператор GOTO. Процедура Halt
Метки. Оператор GOTO. Процедура Halt
С.А. Григорьев
Операторы в Паскале могут быть помечены. Метки — это идентификаторы, либо целые числа от 0 до 9999, они могут записываться перед хоть каким выполняемым оператором и отделяются от него двоеточием. Оператор может иметь хоть какое количество меток. Все метки, использованные в программке, должны быть описаны в разделе описаний с главным словом LABEL. В одном операторе LABEL можно обрисовать несколько меток, тогда они делятся запятыми. Оператор бесспорного перехода
GOTO метка;
передает управление оператору с соответственной меткой, при всем этом все операторы, расположенные меж оператором GOTO и оператором, которому передается управление, не производятся. При помощи оператора GOTO недозволено передать управление : вовнутрь цикла, вовнутрь условного оператора и вовнутрь оператора выбора.
Общепризнано, что оператор GOTO является вредным оператором, он усложняет методы, затрудняет чтение программки и является источником ошибок. Постарайтесь не использовать этот оператор в собственных программках.
Одним из случаев, когда программеру может показаться полезным оператор GOTO, является необходимость закончить выполнение программки при появлении той либо другой ошибки. Пусть, к примеру, программка вычисляет некую функцию от квадратного корня из данного числа:
VAR x : Real;
BEGIN WRITE(‘Введитечисло ‘); READ(x);
x:=SQRT(x);
{вычисление функции от x}
END.
Если введено отрицательное число, то в 3-ем операторе программки произойдет аварийное прерывание. Стремясь избежать этого, мы могли бы записать программку в виде:
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 WRITELN(‘ошибка !’)
ELSE BEGIN
x:=SQRT(x);
{вычисление функции от x}
END;
END.
Видите ли, программка даже стала лучше, т.к. сейчас она докладывает о неверном вводе. Но она все-же имеет один недочет — условный оператор усложнил структуру программки. В этом и в остальных схожих вариантах весьма комфортно воспользоваться обычной процедурой Паскаля HALT, которая останавливает выполнение программки, будучи вызвана в любом ее месте:
VAR x : Real;
BEGIN WRITE(‘Введитечисло ‘); READ(x);
IF x<0 THEN BEGIN WRITELN(‘ошибка !’); HALT; END;
x:=SQRT(x);
{вычисление функции от x}
END.
Наша программка стала практически безупречной. Доведем ее до совершенства :
VAR x : Real;
BEGIN REPEAT
WRITE(‘Введите неотрицательное число ‘);
READ(x);
WRITELN;
UNTIL x>=0;
x:=SQRT(x);
{вычисление функции от x}
END.
]]>