Турбо Паскаль 7.0

Операторы тела цикла выполняются только один раз, если верхнее и нижнее значения счетчика совпадают. Если в операторе for to последнее значение счетчика цикла меньше первого, то тело цикла не выполняется ни одного раза. В операторе for downto цикл не выполняется, если последнее значение счетчика больше первого.

Программа с циклом for, которая вычисляет сумму N членов гармо­нического ряда1:

Program Sum; {сумма N членов гармонического ряда}

var x: byte; {счетчик цикла}

s : real; {сумма ряда}

N : byte; {число членов ряда}

begin

Write('N = '); ReadLn(N); {ввод числа членов ряда}

s := 0; {начальное значение суммы}

тогх:= 1 toNdos:=s+ 1/х; {подсчет суммы}

WriteLn( 'S = ', s); {вывод результата}

ReadLn {ожидание нажатия клавиши Enter}

end.

Оператор, следующий после слова do, может быть составным (пред­ставлять собой группу операторов).

Пример. Найти нечетные и кратные трем числа в диапазоне от 30 до 60 включительно. Распечатать их в порядке убывания.

Условие нечетности целого числа — Odd(J). Условие кратности трем — равенство нулю остатка от деления i mod 3=0. Нас интересуют числа, удов­летворяющие обоим условиям, то есть числа, для которых истинно Odd(i) and (i mod 3 = 0). Убывающий порядок следования чисел обеспечивает опе­ратор for downto. Таким образом, программа будет иметь вид

Program Sample;

var i: byte;

begin

for i := 60 downto 30 do {цикл по убывающей от 60 до 30}

if Odd(i) and (i mod 3=0) then WriteLn(i) end.

В результате выполнении программы получим в столбик значения 57, 51,45,39, 33.

В приведенном примере многократно повторялся один оператор, одна­ко во многих случаях необходимо повторять группу операторов. Вспомним, что говорилось в предыдущей главе о вложенности операторов друг в друга. Чтобы использовать вместо одного оператора группу, нужно эту группу превратить в один сложный оператор. Осуществляется это с по­мощью так называемых «программных скобок» — операторов begin и end.

begin

<оператор1>;

< оператор 2>;

< оператор М> end;

Любая группа операторов, начинающаяся со слова begin и кончающаяся словом end в любой конструкции языка Паскаль может использоваться как один сложный оператор. Сложный оператор, в свою очередь, может иметь в своем составе сложные операторы следующего уровня вложенности и так да­лее. Операторы begin и end подобны открывающим и закрывающим скобкам, и на их употребление накладываются те же ограничения, что и на обыкно­венные скобки в арифметических выражениях: каждой «открывающей скоб­ке» begin должна соответствовать «закрывающая скобка» end. Слово end не может предшествовать парному ему слову begin. При компиляции програм­мы проверяется правильность расстановки скобок и дается сообщение об ошибке. Это сообщение не всегда попадает в то место, где действительно нужна скобка, поэтому не спешите вставлять операторы туда, куда предлага­ет компилятор, а тщательно проанализируйте Вашу программу.

Пример. Имеется логическое выражение not a and b xor с. Требуется вы­вести на печать значения логических переменных а, Ь, с, при которых дан­ное выражение истинно. Мы предлагаем перебор всех возможных зна­чений а, b, с с проверкой выполнения условия для каждого сочетания значений.

Program Sample;

Vara, b, с : boolean;

begin

for a := false to true do

for b := false to true do

for с := false to true do

if not a and b xor с then

begin

Write('a=',a);

Write('b=',b);

WriteLn('c=',c)

End

End.

В результате выполнения этой программы на экран будет выведено:

a =FALSE

b =FALSE

с =TRUE

a =FALSE

b =TRUE

с =FALSE

a =TRUE

b =FALSE

c =TRUE

a =TRUE

b =TRUE

с =TRUE

Программа состоит из одного сложного оператора for a := false to true do, в который вложены последовательно еще два оператора for и оператор if. Часть then последнего содержит сложный оператор, состоящий из трех простых операторов, охваченных программными скобками begin и end.

Циклы с логическими условиями

Введенный в предыдущей главе оператор цикла for обеспечивает выполне­ние цикла заданное количество раз, однако часто циклические действия за­канчиваются по условию, то есть выполняются до достижения определен­ного результата. В Паскале есть два таких оператора цикла, отличающиеся тем, что в одном из них условие проверяется в начале цикла (while .do), а в другом — в конце цикла (repeat .until).

Оператор while do

Оператор цикла while (пока, в то время как) имеет вид:

While <логическое выражение> do <тело цикла>;

Цикл While обеспечивает выполнение тела цикла, следующего за сло­вом do до тех пор, пока условие имеет значение true (истина). В качестве те­ла цикла может использоваться простой или сложный оператор. Условие проверяется перед началом каждого выполнения тела цикла, поэтому, если до первого выполнения цикла условие имеет значение false (ложь), опера­тор не выполняется ни одного раза (рис. 5.2).

Пример. Необходимо преобразовать значение угла в градусах к стандарт­ному диапазону ±180° путем исключения полных оборотов окружности ±360°. Эта процедура может быть выполнена с помощью оператора цикла

While abs(Angle) > 180 do

if Angle > 0 then Angle := Angle — 360

else Angle := Angle + 360;

Оператор while в начале цикла проверяет, превышает ли угол по абсо­лютному значению 180 градусов. Если это не справедливо, тело цикла не вы­полняется. Если угол больше допустимого, начинается выполнение цикла.

Цикл состоит из оператора if. Допустим, угол равен —700. Тогда условие An­gle > 0 в операторе if имеет значение false, при этом выполняется часть else оператора if, и угол получит значение —340. Снова происходит проверка условия выполнения цикла, и цикл выполняется второй раз, после чего угол равен 20. При третьей проверке условия выполнения цикла он заканчивает­ся, поскольку условие его выполнения Abs(20)>180 приняло значение false.

Оператор repeat . until .

Оператор цикла repeat . until . (повторять до тех пор, пока) имеет вид Repeat <тело цикла> until -<логическое выражение>;

Принципиальное отличие оператора repeat .until от оператора while .do в том, что проверка условия производится не перед началом выполнения оператора, а в его конце, когда решается вопрос, повторить ли еще раз дей­ствия. Поэтому тело этого цикла всегда выполняется по крайней мере один раз (рис. 5.3). Это важное отличие: приведенный для цикла while . do при­мер реализовать с оператором цикла repeat . until невозможно без дополни­тельных проверок и усложнений.

Второе отличие от оператора while .do — в логике завершения цикла. Цикл оператора repeat .until выполняется до тех пор, пока не станет истинным логическое выражение, следующее за словом until. Таким образом, использование логического выражения здесь имеет противоположный опе­ратору while .do смысл. Здесь при истинности логического выражения (условия) цикл прекращается, а у оператора while .do при истинности ло­гического выражения цикл продолжается.


Страница: