Лекция 6 Операторы цикла

6.1 Оператор цикла с параметром

6.1.1 Формат оператора. Язык ТП7.0 содержит три оператора, позволяющие выполнять повторяющиеся действия. Это операторы For…To…Do, While…Do и Repeat…Until. Формат использования первого из названных операторов

For X:=N1 To N2 Do <Тело цикла> (1.5)

где X – переменная порядкового типа, обычно типа целых чисел;

N1 и N2 – значения переменных того же типа (в случае целого типа это целые числа или целочисленные арифметические выражения);

<Тело цикла> - оператор или группа операторов; в последнем случае группа операторов помещается между служебными словами Begin…End.

Выполнение оператора For…To…Do, определяющего работу цикла, иногда называемого циклом с параметром, рассмотрим на примере переменных целого типа. Оно состоит в следующем. Сначала вычисляется целочисленное арифметическое выражение N1, которое присваивается переменной Х целого типа. Затем вычисляется целочисленное арифметическое выражение N2 и начинается выполнение операторов тела цикла при значении переменной Х=N1. На следующем шаге к переменной Х прибавляется 1 и производится повторное выполнение операторов цикла для изменённого значения Х. Далее Х последовательно возрастает на 1 до тех пор, пока его значение не станет равным N2. По условию работы цикла N2>=N1. Нарушение этого условия не контролируется. Если N2<N1, то операторы тела цикла не выполняются.

Замена в (1.5) служебного слова To на слово Downto позволяет организовать работу цикла в нисходящем порядке, когда переменная Х последовательно уменьшается в каждом шаге на 1 до тех пор, пока его значение не станет равным N2<=N1.

НЕ нашли? Не то? Что вы ищете?

Выполнение оператора For…To…Do в случае переменной порядкового типа происходит аналогичным образом. Сначала операторы тела цикла выполняются для значения Х=N1, затем для значения Х, номер которого на 1 больше и т. д., пока не будет достигнутозначение Х=N2.

Синтаксическая диаграмма оператора (1.5) приведена на рис.1.9

Пример: создать программу, выводящую на экран квадраты целых чисел от N1 до N2. Текст программы:

Var

I, N1, N2:Integer;

Begin

WriteLn(‘Введите два целых числа’);

ReadLn(N1, N2); For I:=N1 To N2 Do WriteLn(Sqr(I))

End.

Рис. 1.9 Синтаксическая диаграмма оператора цикла с параметром

После ввода с клавиатуры двух целых чисел N2>=N1 программа выдаст на экран квадраты всех чисел от N1 до N2. При N1>N2 оператор тела цикла WriteLn(Sqr(I)) выполняться не будет.

Оператор (1) очень удобен в математических приложениях при табулировании, например, функций, вычислении рядов, решении уравнений и т. д. Пример. Протабулировать функцию

y = (2+sinx)1/2

от х=0 до х=2 с шагом 0.2.

Введём целочисленный параметр i цикла с изменением его от 0 до 11 с шагом 1. Для решения задачи достаточно потребовать, чтобы функция вычислялась в точках x=0.2i. Соответствующая программа имеет вид:

Var

I:Byte;

X, Y:Real;

Begin

For I:=0 To 10 Do

Begin

X:=0.2*I;Y:=Sqrt(2+Sin(X));

WriteLn(X:2:1,’ ‘,Y:4:3)

End.

6.1.2 Пример использования оператора For...To...Do. Известно, что квадрат целого числа N равен сумме N членов ряда

1+3+… (2N

Используя ряд (1.6), составить программу возведения в квадрат любого целого числа. Построим блок-схему с расшифровкой действий операторов внутри цикла.

Начало

Объявление переменных I, N, Sq

Ввод N

I=0, Qr=0

I = I+1

Qr=Qr+2I-1

Да Нет

I<N

Вывод Qr

Конец

Искомая программа имеет вид:

Program Zikl_For_To_Do2;{Цикл For…To…Do}

Var

I, N,Qr:Integer;

Begin

Writeln('Введите целое число);

Readln(N);

Qr:=0;

For I:=1 To N Do Qr:=Qr+2*I-1

WriteLn(‘Квадрат числа ’,N,’ равен ’,Qr)

End.

6.2 Оператор цикла с предусловием

6.2.1 Формат оператора. Синтаксическая диаграмма оператора цикла с предусловием While...Do приведена рис.1.11.

Рис. 1.11 Синтаксическая диаграмма оператора цикла с предусловием While...Do.

Оператор с предусловием While…Do применяется для организации работы циклических процессов, когда количество повторений не известно. Окончание цикла определяется задаваемым условием. Выполнение оператора начинается с проверки условия или выражения булевского типа. Операторы цикла выполняются, если результат проверки даёт True. В противном случае операторы тела цикла игнорируются. Формат оператора While…Do имеет вид

While <Условие> Do <Тело цикла>

Если тело цикла содержит более чем один оператор, то оно должно заключаться в структурные скобки Begin…End.

Пример работы цикла While…Do. Создать программу вывода на экран символов клавиатуры. Работу программы прекратить при нажатии клавиши с символом i (код этого символа равен 105). Текст программы:

Var

Symbol:Char;

Begin

Symbol:=’q’; While Ord(Symbol)<>105 Do

Begin

WriteLn(‘Введите символ и нажмите клавишу Enter’); ReadLn(Symbol)

End

End.

После запуска программы переменная Symbol становится равной ‘q’ c кодом 113. Т. к. этот код не равен 105, то условие цикла выполняется и начинают работать операторы тела цикла. В результате на экране появляется сообщение: Введите символ и нажмите клавишу Enter

При вводе любых символов, кроме i, и нажатия Enter условие цикла будет по-прежнему выполняться, т. к. коды этих символов отличны от 105. Поэтому операторы тела цикла повторят свои действия. Как только будет введён символ i, результат проверки на выполнение условия цикла окажется равным False и программа завершит свою работу.

6.2.2 Пример использования оператора While...Do. Протабулировать функцию sin(x) в интервале от Х1 до Х2 с заданным шагом DX. Введём в программу следующие переменные: X – текущее значение аргумента функции sinx; X1 – начальное значение аргумента; X2 – конечное значение аргумента; DX – шаг табулирования; Y – значение функции sinx. Блок-схема программы представлена на рис. 1.12.

Для решения задачи построим следующий алгоритм:

Первый шаг. Введём значения Х1, Х2, DX и Y. Второй шаг. Зададим исходное значение Х равным Х1. Третий шаг. Распечатаем значения X и Y= sinx на экране дисплея. Четвёртый шаг. Прибавим к Х величину интервала табулирования DX. Пятый шаг. Сравним значение Х с правым краем интервала табулирования Х2, т. е. проверим справедливость условия цикла X2>X. При его выполнении вернёмся к операции на третьем шаге, в противном случае заканчиваем цикл.

Текст программы представлен ниже

Program While_Do;{Цикл While...Do}

Var

X, X1,X2,DX, Y:Real;

Begin

Writeln('Введите левую границу интервала'); Readln(X1);

Writeln('Введите правую границу интервала '); Readln(X2);

Writeln('Введите шаг табулирования'); Readln(DХ);

X:=X1; While X<X2 Do

Begin Writeln(X,’ ‘,Sin(X)); Х:=Х+DX; ........End

End.

Начало

Объявление переменных Х, Х1, X2, DX, Y

Ввод Х1,X2,DX

Х=Х1

Х=Х+DX

ВыводX, Sin(X)

Да Нет

Если Х<X2

Конец

Рис. 1.12 Блок – схема программы, рассматриваемой в п. 6.2.2.

6.3 Оператор цикла с постусловием

6.3.1 Формат оператора Оператор цикла с постусловием состоит из служебного слова Repeat, после которого помещается один или несколько операторов, составляющих тело цикла, и служебного слова Until, за которым следует логическое выражение:

Операторы тела цикла выполняются до тех пор, пока условие, представляющее собой логическое выражение, имеет значение Falsе (ложно). Цикл завершается, как только это значение окажется равным True,

Синтаксическая диаграмма оператора Repeat…Until изображена на рис. 1.13.

 

Оператор
цикла
Repeat…Until

Рис. 13 Синтаксическая диаграмма оператора Repeat…Until

Особенность использования оператора Repeat…Until состоит в том, что операторы тела цикла выполняются хотя бы один раз. Пример:

Repeat

WriteLn(‘Введите вещественное число’);

ReadLn(X);

Until X<0;

В данном фрагменте осуществляется запрос на введение числа. Далее, независимо от условия, производится его ввод. Запрос будет повторяться до тех пор, пока пользователь не введёт отрицательное значение Х.

При работе с циклом нужно позаботиться об организации его окончания. Пример программы без её завершения:

…………………………..

I:=1;

Repeat

Number:=I+1;

WriteLn(Number)

Until I<0;

…………………………….

Замена условия в последнем примере на I>20 приведёт к остановке программы при достижении I=21.

6.3.2 Пример использования оператора Repeat...Until. Решим задачу о вычислении суммы квадратов целых чисел от N1 до N2 с помощью следующего алгоритма:

Первый шаг. Объявляем в программе модуль с именем Crt, который обеспечивает выполнение процедур ClrScr и ReadKey. Первая из названных процедур очищает экран, вторая исключает необходимость нажатия клавиш Alt-F5 для просмотра на экране дисплея полученных результатов.

Второй шаг. Объявляем переменные программы:

N1 – меньшее целое число,

N2 – большее целое число,

Sum – результат суммирования квадратов для всех чисел от N1 до N2.

Третий шаг. Запускаем процедуру ClrScr для очистки экрана. Вводим значения N1 и N2>N1.

Четвёртый шаг. Полагаем: Sum=0.

Пятый шаг. К Sum прибавляем квадрат числа N1.

Шестой шаг. К N1 прибавляем 1.

Седьмой шаг. Проверяем условие N2>N1. В случае его выполнения возвращаемся к операции на пятом шаге В противном случае выводим на печать Sum и запускаем процедуру ReadKey.

Текст программы представлен ниже.

Program Repeat_Until;{Цикл Repeat...Until}

Uses Crt;{Вызов модуля для обеспечения работы процедур ClrScr, ReadKey}

Var N1,N2,Sum:Integer;

Begin

ClrScr;{Очистка экрана} Writeln(‘Введите число N1’);

Readln(N1); Writeln(‘Введите число N2’); Readln(N2); Sum:=0;

Repeat Sum:=Sum+N1*N1; N1:=N1+1 Until N1=N2;

ReadKey{Вывод результатов вычислений на экран без нажатия

клавиш Alt – F5}

End.

Блок – схема этой программы представлена на рис. 1.14.

Начало

Вызов модуля Crt

Объявление переменных N1, N2, Sum

Ввод N1,N2

Запуск процедуры ClrScr

Sum=0;

Sum=Sum+N12

N1=N1+1

Да Нет

N1=N2

Вывод Sum

Запуск процедуры ReadKey

Конец

Рис. 1.14 Блок – схема программы, рассматриваемой в п. 6.3.2

6.4. Сравнение режимов работы операторов цикла

6.4.1 Особенности операторов While...Do и Repeat...Until. Ранее указывалось, что операторы условия могут изменять работу программы только в пределах данного фрагмента, в частности – в рамках тела цикла. В состав ТП7.0 включены процедуры Breake, Halt и Continue, предоставляющие дополнительные возможности по управлению циклом. Первая из них Breake прерывает выполнение повторений операций с выходом из цикла в ту точку программы, где он начинался. Более сильная процедура Halt вызывает досрочный выход в операционную систему Dos. Последняя процедура Continue обеспечивает завершение цикла независимо от наличия в нём других процедур.

Каждый оператор цикла имеет свои особенности (табл.1.9, 1.10):

Таблица 1.9 - Сравнение характеристик операторов цикла While...Do Repeat...Until.

While...Do Repeat...Until

1.Цикл работает пока условие истинно 1.Цикл работает пока условие ложно(False)

2.Цикл завершается, когда условие стано - 2.Цикл завершается, когда условие стано-вит

вится ложным (False) вится истинным (True)

3.Цикл может не выполняться ни разу, 3.Цикл выполняется обязательно хотя бы

если исходное значение False один раз

4.Если выполняется несколько операто - 4.Составной оператор не требуется

ров, то обязательно использо вать состав-

ной оператор Begin..End

6.До входа в цикл необходимо определить все константы и пере менные, управляющие

работой цикла.

6.Тело цикла должно содержать операторы, обеспечивающие окончание работы цикла.

6.4.2 Особенности использования оператора For...To...Do. Выполнение оператора цикла с предусловием начинается с проверки условия. Если оно не выполняется, то цикл может оказаться “пустым”. Оператор с постусловием обеспечивает выполнение операторов тела цикла хотя бы один раз. В любом случае программист должен побеспокоиться об организации окончания работы циклических операций. Оператор For…To…Do содержит в себе специальный параметр, который обеспечивает автоматическое прекращение работы цикла и имеет ряд других отличий (табл.1.10).

Таблица 1.10 - Особенности оператора For...To...Do

1.Начальная установка переменной счётчика не требуется.

2.Изменение в теле цикла значений переменных не допускается.

3.Количество итераций цикла неизменно и определяется его нижней и верхней гра-

ницами.

4.Нормальных ход цикла может быть нарушен процедурами Breake (производится немед-

ленный выход из цикла) или Exit (производится немедленный выход из программы).

5.Цикл может не выполняться ни разу, если изменять значение счётчика в противополо-

жном направлении.