Добрый день!
Звезды не были благосклонны и поэтому
выпуск выходит только сегодня с утра.
Число подписчиков рассылки с каждым
днём неумалимо растёт, поэтому, что бы
отсечь вопросы: где взять предыдущие
выпуски? повторюсь, что они находятся на
этом сайте (прим. авторов сайта)
Теория
Помните выпуск про циклы? Конечно
помните! Так вот если попробовали
сотавить парочку программ
самостоятельно (боже, как я на это
надеюсь!) у вас могла возникнуть
необходимость выйдти из цикла. Как этого
добится я не упомянул. Пришло время
закрыть это белое пятно. Итак для
управления циклами есть 2 функции. break и
continue. Судя по названиям они служат для
прерывания и продолжения циклов. BREAK (англ.
сломать, испортить) - немедленно
прекращает выполнение цикла, переходя
на следующий за циклом оператор. CONTINUE (англ.
продолжение) - обеспечивает продолжение
цикла. Давайте рассмотрим примеры:
j := 0;
for i := 0 to 10 dobegin
j := j + 1;
if j = 5 then break
end;
Этот цикл прервётся при j = 5, несмотря на
то что i в этот момент равно 4!
j := 0;
i := 0;
while i <> 10 dobegin
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.
Пометить строчку, т.е. поставить на
неё метку, можно так:
Итак как вы видите мы просто ставим
на строке имя метки и двоеточие. Когда
программа натыкается на 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' thengoto start
elseif key = 'y' thengoto start;
WriteLn ('Thanks for using our product [c] 2002')
end.
Сия простая программка
демонстрирует принцип построения
программы, которая делает что-то, а потом
спрашивает надо ли это повторить.
Обратите внимание, что когда мы проверям
какую клавишу нажал юзер, мы проверяем
на клавишу 'Y' и 'y' . Эти клавиши имеют
раные коды, поэтому мы должны проверить
оба варианта!
Естественно этот вариант не является
единственным. Мы могли сделать цикл while 1
do ... и потом просто проверяя клавишу на
совпадение использовать break. Вот так
безо всяких вредных goto!
Послесловие
Поздравляем всех с днём 7 ноября (эх,
знать бы ещё, что это за праздник :) и
делаем небольшой перерыв в рассылке до
8-9 числа. Чему будет посвящён следующий
выпуск пока остаётся тайной для нас и
для вас....