В предыдущей статье упоминалось о операторе Goto, теперь пришло время разобраться и с ним, хотя он и используется довольно редко. Итак, Goto в переводе с английского означает “иди к …”
В Паскале он используется, когда присутствуют метки, о которых было рассказано в статье “Структура программы, первая программа”. Вот синтаксис этого оператора. Сначала в разделе Label объявляется метка.
В основной части программы описывается сама метка (действия, которые нужно повторить). Это делается так
<Имя метки>:<Повторяющиеся действия>; если действий нужно повторять несколько, то пишем Begin…End; И в любом месте программы мы можем написать строку “goto <имя нашей метки>;” Вот простейший пример программы.
Program FirstLabel;
Label m1;
Begin
m1: Write ('Привет ');
goto m1;
End. Итак, в разделе Label мы объявили метку m1, описали ее, это строка “m1: Write (‘Привет ‘);” Написав далее “goto m1;” мы заставляем компилятор зацикливаться и бесконечно писать “Привет “. Вот именно из-за подобных зацикливаний и вообще принципа работы этого оператора программисты практически не используют “goto”. Ну раз это оператор цикла, давайте напишем программу, выводящую числа от 1 до 10.
Program SecondLabel;
label metka;
var i: integer;
begin
i := 1;
writeln('Начнем счет! ');
metka:
begin
writeln(i, ' ');
inc(i);
end;
if i <= 10 then goto metka
else write('Это конец счета!');
End. Теперь напишем небольшой диалог с пользователем. Попросим его ввести свое имя, проверим, верно ли оно написано, спросим, сколько ему лет, также проверим, что он ввел и выведем последнюю реплику. Причем, если данные пользователь вводит неверно, с помощью меток мы будем заставлять его вводить заново. Вот код такой программы.
Program ThirdLabel;
label m1, m2;
var st:string; i, age:integer;
Begin
m1: writeln('Ведите Ваше имя по-русски и без цифр');
readln(st);
for i:=1 to length(st) do
if not(st[i] in ['А'..'Я', 'а'..'я']) then goto m1;
writeln('Привет, ', st);
m2: writeln('Сколько Вам лет?');
readln(age);
if (age<0) then goto m2;
writeln('Спасибо за ответы! Всего Вам доброго!');
End. Здесь мы считали строку (имя пользователя) и в цикле проверяем каждые ее символ, является ли он буквой русского алфавита. В данном случае использован такой тип данных, как множество, о которых мы поведем речь несколько позже. Не будем проверять, является ли возраст числом, потому что программа сама выведет ошибку несоответствия типов и закончит свою работу.
Итак, надеюсь, что Вам стало ясно, что такое оператор перехода goto и метки. Еще раз замечу, что не следует использовать этот оператор в больших программах, как видите, в примерах из этой статьи все предельно ясно, но в больших программах Вы только запутаетесь и вообще поведете себя так, что любой программист скажет Вам, что Вы совершаете глупость.


