Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_часть1.doc
Скачиваний:
26
Добавлен:
18.11.2019
Размер:
4.1 Mб
Скачать

Лабораторная работа № 4 операторы цикла

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

Постановка задачи.

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

  1. сумму N элементов ряда (с использованием оператора FOR);

  2. сумму S элементов ряда для каждого значения x из заданного интервала, каждый раз изменяя значение x на величину шага hx. Каждую сумму искать с точностью до , то есть прекратить вычисления, когда значение очередного члена ряда станет меньше . Использовать для организации циклов операторы WHILE, REPEAT…UNTIL.

Теоретические сведения

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

В языке Pascal три оператора цикла:

  • с параметром for;

  • с предусловием while;

  • с постусловием repeat.

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

Оператор цикла с параметром имеет следующую синтаксическую форму:

for идентификатор := <выражение1> to[downto] <выражение2> do оператор ;

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

а) диапазон (выражение1 .. выражение2) изменения значений управляющей переменной (идентификатор) и одновременно количество повторений оператора, содержащегося в теле цикла (оператор);

б) направление изменения значения переменной (возрастание – to или убывание – downto );

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

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

  1. В качестве управляющей переменной должна использоваться простая переменная.

  2. Управляющая переменная должна иметь дискретный тип.

  3. Начальные и конечные значения диапазона должны иметь тип, совместимый с типом управляющей переменной.

  4. В теле цикла запрещается явное изменение значения управляющей переменной.

  5. После завершения оператора значение управляющей переменной становится неопределенным.

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

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

Program power;

var

p,x:real;

i,n:integer;

begin

read(x,n);{ввод x ,n}

p:=1;{присвоение степени начального значения}

for i:=1 to abs(n) do

p:=p*x;{вычисление степени}

if n<0 then {если степень отрицательна}

p:=p/x;

write(p);

end.

Оператор цикла с предусловием используется в тех случаях, когда количество повторений цикла заранее не известно. Он имеет следующую синтаксическую форму:

while <условие>do <оператор>;

Этот оператор задает повторяющееся выполнение оператора, содержащегося в нем. Перед каждым выполнением внутреннего оператора производится проверка значения булевского выражения (условие), которое служит критерием повторения: если это выражение имеет значение true, то выполняется очередная итерация; в противном случае выполнение оператора цикла заканчивается. Если выражение с самого начала имеет значение false, то цикл не выполнится ни разу.

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

Program digits;

var

n,k:integer;

begin

write(‘введите n’);

readln(n);

k:=1;

while n div 10>0 do

begin

k:=k+1;

n:=n div 10;

end;

write(‘Количество цифр:’,k);

end.

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

write(‘введите положительное n’);

readln(n);

while n < 0 do

begin

write(‘введите n’);

readln(n);

end;

Это простой пример так называемой защиты от дурака. Теперь пользователь не получит результат, пока не введет положительное число. Однако нам пришлось написать один и тот же фрагмент ввода числа дважды: перед циклом и в теле цикла. Поэтому здесь лучше воспользоваться другим оператором цикла, а именно оператором цикла с постусловием.

Оператор цикла с постусловием имеет следующую синтаксическую форму:

repeat

оператор1;

оператор2;

. . . . . .

операторN;

until <условие>;

Этот оператор аналогичен предыдущему. Отличие заключается в том, что условие окончания цикла проверяется после выполнения очередной итерации (таким образом гарантируется хотя бы однократное выполнение цикла). Кроме того, критерием окончания цикла является равенство выражения, описывающего <условие>, константе true. Если выражение имеет значение false, то цикл выполняется.

Перепишем теперь фрагмент ввода, используя цикл repeat.

repeat

write(‘введите положительное n’);

readln(n);

until n>=0;

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

.

Для любого k было бы нерационально считать входящие в выражения для общего члена степень и факториал с самого начала, имея их значения при предыдущем k. Как степень, так и факториал будут возрастать с ростом k, что может привести к потере точности и/или переполнению разрядной сетки при раздельном их вычислении. Удобнее найти так называемое рекуррентное соотношение, которое устанавливает зависимость между двумя соседними членами ряда в виде коэффициента рекуррентности (q) и в дальнейшем вычислять рекуррентно bk = bk–1q для k = 1, 2, ... при очевидном начальном условии b0 = x. Для нашего случая

.

Пример выполнения задания

;

1) n = 9, x = 0.6;

2) x = 0.1…1.0,