Условный оператор повторения 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Условный оператор повторения



Исторически, в Паскале имеется еще одна форма условного оператора цикла, от-

личающаяся от формы записи оператора while. Это отличие состоит, во-первых, в

том, что проверка условия выполняется не в начале цикла, а в его конце (что гаран-

тирует как минимум однократное выполнение тела цикла), а во-вторых, в том, что

завершение цикла происходит, когда условное выражение равно не False, a True (эта

особенность часто вызывает ошибки у начинающих программистов).

Операторы 77

Repeat

тело-циклa

until условие;

ВНИМАНИЕ В отличие от всех остальных операторов Паскаля при использова-

нии оператора repeat тело цикла, состоящее из нескольких команд,

заключать в логические скобки begin/end не требуется. Компилятор

определяет границы тела цикла по ключевым словам repeat/until.

С помощью данного оператора можно переписать программу вычисления факто-

риала так:

begin

repeat

ReadLn(N);

WriteLnf Factorial (N));

until N = 0,-

end.

Условие завершения цикла изменилось на противоположное — теперь для его окон-

чания требуется, чтобы значение выражения N = 0 стало равно True (то есть, чтобы

значение переменной N стало равным нулю), а лишний оператор инициализации

переменной N не нужен.

Команда прерывания цикла

Условный оператор цикла позволяет остановить выполнение тела цикла, только

когда все операторы, входящие в него, выполнены и достигнута проверка условия

окончания. Такой подход иногда неудобен, особенно если тело цикла представляет

собой длинную последовательность операторов и необходимость завершения цикла

выясняется в середине этой последовательности. Для немедленного завершения

текущего оператора цикла можно использовать подпрограмму Break без парамет-

ров (это подпрограмма, играющая роль оператора). Полезна данная команда и при

использовании оператора for, например, когда в массиве с известными границами

найдено нужное значение и дальнейшие вычисления выполнять не надо.

Например, если в строке S требуется найти номер первого пробела, можно приме-

нить следующие операторы:

N:= 0;

for i:= 1 to Length(S) do

if S[i] = ' ' then

begin

N:= i;

Break;

end;

if N > 0 then

78 Урок 1. Язык Delphi (Objecl Pascal) и его использование

В переменной N хранится номер подходящего символа (первоначально — 0). Б цикле

выполняется проверка каждого символа строки, при обнаружении пробела проис-

ходит запоминание номера символа и прерывание выполнения тела цикла. Затем

значение переменной N сравнивается с нулем, чтобы определить, был ли найден

нужный символ.

S ЗАМЕЧАНИЕ В системе Delphi 7 имеется стандартная функция Роз[), которая,

получая в качестве параметров подстроку и проверяемую строку,

возвращает номер вхождения подстроки в строку или ноль, если

совпадения не найдено:

Ров (' ', S)

Команда ____________продолжения цикла

В Паскале имеется команда, по своему действию противоположная команде пре-

рывания цикла. Она позволяет немедленно продолжить выполнение цикла, про-

пустив все оставшиеся операторы в теле цикла. Эта команда (подпрограмма без

параметров, играющая роль оператора) записывается так:

Continue,-

С ее помощью предыдущий пример можно записать следующим образом:

N:= 0;

for i:= 1 to Length(S] do

Begin

if S[i] <> ' ' then Continue;

N:= i;

Break;

end;

if N > 0 then...

При очередном выполнении тела цикла сначала произойдет проверка текущего

символа на равенство пробелу, и если это не пробел, то выполнится команда про-

должения цикла — все последующие операторы будут пропущены, а счетчик примет

новое значение.

Вложенные циклы

При решении некоторых задач возникает потребность в организации вложенных

циклов. Например, при анализе двумерного массива требуется выполнять цикл

как по первому, так и по второму измерениям. В таких случаях используют вложен-

ные циклы. Процедуры Break и Conti nue всегда воздействуют только иа ближайший

оператор цикла, поэтому прекратить выполнение всех циклов с их помощью невоз-

можно.

Например, требуется написать программу, которая печатает все целые числа, сумма

квадратов которых равна заданному числу. Проще всего сделать это с помощью

двух вложенных циклов, которые последовательно перебирают все возможные

Операторы 79

значения, а в теле внутреннего цикла проверяется, не равна ли сумма квадратов

значений счетчиков заданной величине.

program Projectl;

{$APPTYPE CONSOLE}

uses sysutils;

var i,j,N: integer;

Begin

ReadLn(N|,-

for i:= 1 to N dlv 2 do

for j:= 1 to N div 2 do

if i*i + j*j = N then

WriteLn(i, ', ', j I;

end.

В каждом из циклов рассматривается диапазон значении от 3 до половины вели-

чины введенного числа (потому что сумма квадратов половин числа заведомо больше

или равна этому числу). Можно найти дополнительные способы улучшить этот

код, в частности, вынести вычисление произведения i*i из тела вложенного цикла,

потому что это произведение не имеет смысла многократно вычислять во вложенном

цикле, где оно всегда будет иметь одно и то же значение, а операция умножения

для процессора достаточно дорогая (медленная).__

 



Поделиться:


Последнее изменение этой страницы: 2017-02-21; просмотров: 248; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.119.160.85 (0.009 с.)