#9 Ненужные прыжки, чёрные метки и запасной выход.

Вступление

Добрый день!
Звезды не были благосклонны и поэтому выпуск выходит только сегодня с утра. Число подписчиков рассылки с каждым днём неумалимо растёт, поэтому, что бы отсечь вопросы: где взять предыдущие выпуски? повторюсь, что они лежат по этой ссылке: http://www.ibp7.narod.ru/arxiv.chm

Теория

Помните выпуск про циклы? Конечно помните! Так вот если попробовали сотавить парочку программ самостоятельно (боже, как я на это надеюсь!) у вас могла возникнуть необходимость выйдти из цикла. Как этого добится я не упомянул. Пришло время закрыть это белое пятно. Итак для управления циклами есть 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!

Послесловие

Поздравляем всех с днём 7 ноября (эх, знать бы ещё, что это за праздник :) и делаем небольшой перерыв в рассылке до 8-9 числа. Чему будет посвящён следующий выпуск пока остаётся тайной для нас и для вас....


[Назад] [Содержание] [Дальше]
Hosted by uCoz