Помните выпуск про циклы? Конечно помните! Так вот если попробовали сотавить парочку программ самостоятельно (боже, как я на это надеюсь!) у вас могла возникнуть необходимость выйдти из цикла. Как этого добится я не упомянул. Пришло время закрыть это белое пятно. Итак для управления циклами есть 2 функции. break и continue. Судя по названиям они служат для прерывания и продолжения циклов. BREAK (англ. сломать, испортить) - немедленно прекращает выполнение цикла, переходя на следующий за циклом оператор. CONTINUE (англ. продолжение) - обеспечивает продолжение цикла. Давайте рассмотрим примеры:
j := 0;
for i := 0 to 10 do
begin
j := j + 1;
if j = 5 then break
end;
Этот цикл прервётся при j = 5, несмотря на то что i в этот момент равно 4!
j := 0;
i := 0;
while i <> 10 do
begin
j := j + 1;
if j > 5 then
continue;
i := i + 1
end;
При выходе из цикла в i будет 10, а j =-32764. Почему так? Просто при j >= 5 происходит продолжение цикла, т.е. i := i + 1 не выполняется. Управление передаётся на while i <> 10 do. Но когда j = 32767 прибавляя 1 мы получаем j < 5 и тогда цикл продолжает выполняться нормально. Однако существует второй способ выхода из цикла. Это оператор безусловного перехода. Его смысл заключается в переходе на определённую строчку программы. Записывается он в виде:
goto Метка;Метки объявляются в отдельном разделе программы под названием label. И шаблон программы превращается во всё более сложное творение:
Program ИмяПрограммы;
uses список подключаемых модулей;
const
Здесь идёт объявление констант.
label здесь объявляются метки.
var
Здесь идёт объявление переменных.
begin
Здесь идёт текст программы.
end.
Пометить строчку, т.е. поставить на неё метку, можно так:
label normal, bad;
.....
......
goto normal;
......
normal : writeLn ('All Ok!');
.......
bad:
writeLn ('All bad!');
.....
......
goto bad;
.......
Итак как вы видите мы просто ставим на строке имя метки и двоеточие. Когда программа натыкается на goto она сразу же переходит на метку, несмотря ни на что! Сразу хочу сказать, что использование goto является плохим тоном. Программа должна быть легко читаемой, а при goto происходят постоянные прыжки по тексту программы. Если вы используете Бейсик, то забудьте об этом !!! Поэтому мы не будем использовать goto в своих программах, ну разве только сегодня для примера.
Программа
Program GotoTest;
uses CRT;
label start;
var
key : char;
i : integer;
begin
start:
for i := 0 to 20 do
writeLn ('Do something...');
write ('Ещё раз? [Y/N] ');
key := readkey;
writeLn (key);
if key = 'Y' then
goto start
else
if key = 'y' then
goto start;
WriteLn ('Thanks for using our product [c] 2002')
end.
Сия простая программка демонстрирует принцип построения программы, которая делает что-то, а потом спрашивает надо ли это повторить. Обратите внимание, что когда мы проверям какую клавишу нажал юзер, мы проверяем на клавишу 'Y' и 'y' . Эти клавиши имеют раные коды, поэтому мы должны проверить оба варианта! Естественно этот вариант не является единственным. Мы могли сделать цикл while 1 do ... и потом просто проверяя клавишу на совпадение использовать break. Вот так безо всяких вредных goto!

