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

Лабораторная работа № 3

«Алгоритмы циклической структуры»

Цель работы: научиться правильно использовать различные операторы циклов; научиться составлять программы решения задач с использование циклических структур.

Общие сведения

Алгоритм называется циклическим, если он содержит многократное выполнение одних и тех же операторов при различных значениях промежуточных данных. Число повторений этих операторов может быть задано в явной (цикл с известным заранее числом повторений) или неявной (цикл с неизвестным заранее числом повторений) форме.

Перед выполнением работы необходимо изучить различные схемы организации циклов и операторы FOR, WHILE, REPEAT. [см. Приложения].

Пример 1. Найти наибольший общий делитель (НОД) двух натуральных чисел A и B.

Этапы решения задачи:

1. Для решения поставленной задачи воспользуемся алгоритмом Евклида: будем уменьшать каждый раз большее из чисел на величину меньшего до тех пор, пока оба значения не станут равными, так, как показано в таблице.

Таблица: Поиск НОД для чисел A = 25 и B = 15.

Исходные данные Первый шаг Второй шаг Третий шаг НОД (A, B)=5
A=25 A=10 A=10 A=5
B=15 B=15 B=5 B=5

2. Составим схему алгоритма. В блок-схеме решения задачи, представленной на рисунке, для решения поставленной задачи используется цикл с предусловием, то есть тело цикла повторяется до тех пор, пока A не равно A. Следовательно, при создании программы воспользуемся циклом while..do.

Рисунок Алгоритм поиска наибольшего общего делителя двух чисел

3. Программа

program example8;

var a,b:word;

begin

writeln('введите два натуральных числа');

write('A='); readln(A);

write('B='); readln(B);

{Если числа не равны, выполнять тело цикла.}

while a<>b do

{Если число А больше, чем В, то уменьшить его значение на В,}

if a>b then

a:=a-b

{иначе уменьшить значение числа В на А.}

else

b:=b-a;

writeln('НОД=',A);

end.

Пример 2. Вычислить факториал числа N (N!=1×2×3 …×N).

Этапы решения задачи:

1. Входные данные: N – целое число, факториал которого необходимо вычислить.

Выходные данные: factorial – значение факториала числа N, произведение чисел от 1 до N, целое число.

Промежуточные переменные: i – параметр цикла, целочисленная переменная, последовательно принимающая значения 2, 3, 4 и так далее до N.

Итак, вводится число N. Переменной factorial, предназначенной для хранения значения произведения последовательности чисел, присваивается начальное значение, равное единице. Затем организуется цикл, параметром которого выступает переменная i.

Если значение параметра цикла меньше или равно N, то выполняется оператор тела цикла, в котором из участка памяти с именем factorial считывается предыдущее значение произведения, умножается на текущее значение параметра цикла, а результат снова помещается в участок памяти с именем factorial.

Когда параметр i становится больше N, цикл заканчивается, и выводится значение переменой factorial.

2. Составим схему алгоритма.

Рисунок Алгоритм вычисления факториала

3. Программа

program example9;

Var factorial, n, i:integer;

begin

write('n='); readln(n);

factorial:=1;

for i:=2 to n do

factorial:=factorial*i;

writeln(factorial);

end.

Задания

Вариант 1

1. Определить количество четных чисел на заданном отрезке [a, b].

Вариант 2

1. Вычислить P = 1 . 2 + 2 . 3 + 3 . 4 +...+ (N+1) . N.

Вариант 3

1. Дана последовательность целых чисел, 0 – конец последовательности. Найти наименьшее число.

Вариант 4

1. Дано натуральное N. Выясните, сколько цифр оно содержит.

Вариант 5

1. Дана последовательность целых чисел, 0 – конец последовательности. Найти количество положительных чисел.

Контрольные вопросы

1. Как записывается и как работает оператор FOR?

2. Для организации каких циклов применим оператор FOR?

3. В чем отличие оператора WHILE от оператора REPEAT?

4. Как программируются циклические алгоритмы с явно заданным числом повторений цикла?

5. Как программируются циклические алгоритмы с заранее неизвестным числом повторений цикла?

6. Напишите оператор цикла, который не выполняется ни разу.

7. Напишите оператор цикла, который выполняется неограниченное число раз.

8. Замените оператор "Repeat A Until B" равносильным фрагментом программы с оператором While.


Приложение 1.

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

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

При написании циклических алгоритмов следует помнить следующее. Во-первых, чтобы цикл имел шанс когда-нибудь закончиться, содержимое его тела должно обязательно влиять на условие цикла.

Во-вторых, условие должно состоять из корректных выражений и значений, определенных еще до первого выполнения тела цикла.

В языке Free Pascal для удобства программиста предусмотрены три оператора, реализующих циклический процесс: while, repeat…until и for.

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

На рис. изображена блок-схема алгоритма цикла с предусловием.

Рисунок Алгоритм циклической структуры с предусловием.

Оператор, реализующий этот алгоритм в языке Free Pascal, имеет вид:

while выражение do оператор;

здесь while.. do – зарезервированные слова языка Free Pascal, выражение – логическая константа, переменная или логическое выражение, оператор – любой допустимый оператор языка.

Работает оператор while следующим образом. Вычисляется значение выражения. Если оно истинно (True), выполняется оператор. В противном случае цикл заканчивается, и управление передается оператору, следующему за телом цикла. Выражение вычисляется перед каждой итерацией цикла. Если при первой проверке выражение ложно (False), цикл не выполнится ни разу.

Если в цикле надо выполнить более одного оператора, необходимо использовать составной оператор:

while условие do

begin

оператор_1;

оператор_2;

оператор_n;

end;

Рассмотрим пример.

Пусть необходимо вывести на экран значения функции y = e sin(x) cos(x) на отрезке [0;π] с шагом 0.1. Применим цикл с предусловием:

var x,y:real;

begin

{Присваивание параметру цикла стартового значения.}

x:=0;

{Цикл с предусловием.}

while x<=pi do {Пока параметр цикла не превышает конечное значение, выполнять тело цикла.}

begin

{Вычислить значение y.}

y:=exp(sin(x))*cos(x);

{Вывод на экран пары х и y.}

writeln('x=', x,' y=', y);

{Изменение параметра цикла - переход к следующему значению x.}

x:=x+0.1;

end; {Конец цикла.}

end.

В результате работы данного фрагмента программы на экран последовательно будут выводиться сообщения со значениями переменных x и y:

x= 0; y=1

x= 0.1; y=1.0995

x= 3.1; y=-1.0415

Оператор цикла с постусловием repeat … until

Если в цикле с предусловием проверка условия осуществляется до тела цикла, то в цикле с постусловием условие проверяется после тела цикла. Сначала выполняются операторы, являющиеся телом цикла, после чего проверяется условие, если последнее ложно, то цикл повторяется. Выполнение цикла прекратится, если условие станет истинным.

В языке Free Pascal цикл с постусловием реализован конструкцией

repeat

оператор;

until выражение;

здесь repeat.. until – зарезервированные слова языка Free Pascal, выражение – логическая константа, переменная или логическое выражение, оператор – любой допустимый оператор языка.

Рисунок Алгоритм цикла с постусловием.

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

repeat

оператор_1;

оператор_2;

.............

оператор_N;

until выражение;

Работает цикл следующим образом. В начале выполняется оператор, представляющий собой тело цикла. Затем вычисляется значение выражения. Если оно ложно (False), оператор тела цикла выполняется еще раз. В противном случае цикл завершается, и управление передается оператору, следующему за циклом.

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

Если применить цикл с постусловием для создания подпрограммы, которая выводит значения функции y = e sin(x) cos(x) на отрезке [0;π] с шагом 0.1, получим:

var

x,y:real;

begin

{Присваивание параметру цикла стартового значения.}

x:=0;

{Цикл с постусловием.}

repeat {Начало цикла}

y:=exp(sin(x))*cos(x);

writeln('x=',x,' y=',y);

x:=x+0.1; {Изменение параметра цикла.}

until x>pi; {Закончить работу цикла, когда параметр превысит конечное значение.}

end.

Оператор цикла for … do

Операторы цикла с условием обладают значительной гибкостью, но не слишком удобны для организации ≪строгих≫ циклов, которые должны быть выполнены заданное число раз. Оператор цикла for … do используется именно в таких случаях:

for i:= in to ik do оператор;

for i:= ik downto in do оператор;

где оператор – любой оператор языка, i, in и ik — переменная целочисленного или перечислимого типов.

Переменную i называют параметром цикла. Переменные in и ik — диапазон изменения параметра цикла: in — начальное значение, а ik — конечное значение параметра цикла.

Шаг изменения цикла for всегда постоянен и равен интервалу между двумя ближайшими значениями типа параметра цикла (при целочисленном значении параметра цикла шаг равен 1).

В случае если тело цикла состоит более чем из одного оператора, необходимо использовать составной оператор:

for i:= in to ik do

begin

оператор_1;

оператор_2;

...........

оператор_n;

end;

Рисунок Алгоритм работы цикла for...do

Опишем алгоритм работы цикла for … do:

1. Параметру цикла i присваивается начальное значение in.

2. Если значение параметра цикла превосходит конечное значение (i>ik), то цикл завершает свою работу. В противном случае выполняется пункт 3.

3. Выполняется оператор.

4. Значение параметра цикла i изменяется на соответствующий шаг и осуществляется переход к п.2 и т. д.

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

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

Рисунок: Представление цикла for...do с помощью блок-схемы

Вернемся к задаче вывода значений функции y = e sin(x) cos(x) на отрезке [0;π] с шагом 0.1. Как видим, здесь количество повторений цикла явно не задано. Однако это значение, можно легко вычислить.

Предположим, что параметр цикла х принимает значения в диапазоне от xn до xk, изменяясь с шагом dх, тогда количество повторений тела цикла можно определить по формуле:

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

var i,n:integer; x,y:real;

begin

{Количество повторений цикла:}

{n=(xk-xn)/dx+1; xk=pi, xn=0, dx=0.1}

n:=round((pi-0)/0.1)+1;

x:=0; {Начальное значение аргумента.}

{Цикл с известным числом повторений,}

{i – параметр цикла,

изменяется от 1 до n с шагом 1.}

for i:=1 to n do

begin {Начало цикла.}

{Вычисление значения функции }

y:=exp(sin(x))*cos(x);

{для соответствующего значения аргумента.}

writeln('x=',x,' y=',y);

x:=x+0.1; {Вычисление нового значения аргумента.}

end; {Конец цикла.}

end.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  




Подборка статей по вашей теме: