If KeyPressed then

End.

Begin

Begin

ReadLn(a,b);{ввод точности расчета e}

if b=2a then break;

c:=100/(b-2a);

end;

При выполнении условияb=2aоператор break передаст управление следующему за циклом оператору, в котором должен быть предусмотрен анализ условий выхода из цикла и дальнейшее выполнение программы. Если не применять эту проверку и обращение к break, то при первом же выполнении условияb=2aпроизойдет аварийный останов выполнения программы по ошибке с номером 200 (деление на нуль) с выдачей сообщения вида: Runtime error 200 at xxxx:xxxx. Если бы вместо breakбыл использован оператор сontinue (if b=2a then сontinue;), то его применение обеспечило бы автоматический пропуск каждой итерации с делением на ноль и дальнейшее продолжение цикла.

Вмешательство пользователя для досрочного завершения цикла требуется в тех случаях, когда условия данного завершения не могут быть заданы программно и для обеспечения завершения необходимо использовать средства интерфейса. Рассмотрим их более подробно.

Для выдачи необходимых запросов и передачи данных из программы к пользователю используют операторы writeиwriteln, которые не вызывают остановок выполнения программы.

Обратная передача данных путем считывания программой информации, вводимой пользователем с клавиатуры, может быть организована в Паскале двумя существенно различающимися способами. Первый заключается в использовании операторов read и readln, которые предусматривают останов программы до тех пор, пока пользователь не введет все символы и не нажмет клавишу "Enter". Такой способ назовем передачей с остановом программы. Его желательно применять для передачи сообщений, содержащих много символов, без которых программа не может продолжать свою работу. При его использовании нет необходимости искусственно вводить временные задержки в исполнение программы, поскольку такую задержку задают сами операторы read и readln.

Второй возможный способ получения сообщения от пользователя заключается в использовании функций библиотеки CRT KeyPressed(возвращает True, если в буфер клавиатуры введен хотя бы один символ, False - если буфер пуст) и ReadKey(возвращает содержимое буфера клавиатуры, если он пуст, функция ожидает нажатия на любую клавишу). В отличие от read и readln ввод не сопровождается эхо-повтором вводимых символов на экране и не происходит остановки выполнения программы. Данный способ назовем фоновым. Его практически применяют для возможного ввода одного символа в программу. Несмотря на то, что его ввод не останавливает выполнение программы, для его практической реализации в тело цикла должны вводиться обращения к процедуре delay(ms), которые задают паузы в работе программы на ms миллисекунд. Такие остановы необходимы пользователю, для того, чтобы успеть отреагировать на ход расчета.

Пример 2 использования операторов break и continue для завершения цикла по команде пользователя, которая вводится с применением оператора readln.

Необходимо разработать код программы, который обеспечивает последовательную выдачу на экран всех целых чисел i от 1 до 10 в виде строковых сообщений вида " End of current iteration i = ". В каждой итерации цикла пользователю последовательно выдаются два запроса, требующих от него ответной реакции:

1) номер итерации и запрос на прекращение работы всего цикла (ответ "y" - завершение, выход из цикла; "others" – продолжение),

2) на пропуск вывода сообщения в текущей итерации ("y" - пропуск; "others" – вывод сообщения),

Решение. Для получения ответа пользователя по первому и второму запросу введена символьная переменная s. Код дан со всеми необходимыми комментариями:

var i: integer; s:char;

For i:=1 to 10 do{заголовок арифметического цикла по параметру i от 1 до 10}

begin{открытие составного оператора тела арифметического цикла}

Write(’ i=’,i,’ Enter request to cycle stop(y-yes, others-no)’);

Readln(s); {получение ответа от пользователя на запрос 1}

if(s='y')then begin Writeln(’LOOP EXIT!’); break end;{ выход из цикла For }

Write(’Enter request to current iteration stop(y-yes, others-no)’);

Readln(s); {получение ответа от пользователя на запрос 2}

if(s='y')then begin Writeln(’ITERATION EXIT!’);continue end;{выход из итерации};

Writeln(’ End of current iteration i =’,i);

end;{закрытие тела цикла For}

Пример 3. Решить задачу из примера 2 с использованием функций KeyPressed и ReadKey.Перед началом выполнения цикла выдать общий запрос, в котором для завершения цикла предлагается ввести с клавиатуры букву “y”, а для завершения текущей итерации - букву “d”. При других вариантах ввода или его отсутствии цикл должен продолжать работу. Для того, чтобы цикл выполнялся с задержкой на каждой итерации, использовать в ней процедуру ожидания delay(1000).

Решение. Код дан со всеми необходимыми комментариями:

uses Crt; {подключение библиотеки CRT для работы с экраном}

var s:char; i:integer;

begin {начало раздела операторов}

ClrScr;{ очистка экрана}

Writeln('Enter request for cycle stop(y-yes)or current iteration stop(d-yes)');

For i:=1 to 10 do {заголовок арифметического цикла по параметру i от 1 до 10}

begin {открытие составного оператора тела арифметического цикла}

Writeln (' iteration number i=',i);

delay (1000);{ ожидание 1000 мсек}

begin s:= ReadKey;

if(s='y')then begin Writeln(’LOOP EXIT!’);break end;{ выход из цикла For }

if(s='d') then begin Writeln(’ITER.EXIT!’);continue end;{выход из итерации};

end;{закрытие составного оператора в IF}

Writeln(’ End of current iteration i =’,i);

end;{закрытие тела цикла For}

ReadKey; {ожидание нажатия клавиши для перехода от пользовательского экрана в основной}

end. {конец раздела операторов и всей программы}