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. {конец раздела операторов и всей программы}