TURBO PASCAL

Новости           

Программы

Turbo Pascal

Игры

Документация

"Странности"

FAQ

Ссылки

Гостевая книга

Рассылка

Благодарности

От автора

 

 

 

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

Вступление
Теория
Программа
Голосование
Послесловие

Вступление

Добрый день!
Звезды не были благосклонны и поэтому выпуск выходит только сегодня с утра. Число подписчиков рассылки с каждым днём неумалимо растёт, поэтому, что бы отсечь вопросы: где взять предыдущие выпуски? повторюсь, что они находятся на этом сайте (прим. авторов сайта)

Теория

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

 

На первую страницу

 

Rambler's Top100 PROext: Top 1000 Rambler's Top100
(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz