В предыдущей статье упоминалось о операторе 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 и метки. Еще раз замечу, что не следует использовать этот оператор в больших программах, как видите, в примерах из этой статьи все предельно ясно, но в больших программах Вы только запутаетесь и вообще поведете себя так, что любой программист скажет Вам, что Вы совершаете глупость.