Лабораторная работа № 4. ОПЕРАТОРЫ ЦИКЛА




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

 

ОПЕРАТОРЫЦИКЛА

 

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

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

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

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

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

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

 

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

В языке Delphi есть три оператора цикла:

1) с целочисленным параметром for;

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

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

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

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

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.

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

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;

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

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

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,

 

Порядок выполнения работы

1. С помощью Проводника Windows на рабочем логическом диске создайте папку (например, Ivanov-4) для размещения файлов проекта.

2. Создать проект консольного приложения Delphi.

2.1. Командой меню «Пуск / Borland Delphi 7 / Delphi 7» (или аналогичной командой) запустите интегрированную среду программирования Delphi.

2.2. В появившемся основном окне Delphi выберите команду меню «File / New / Other…»

2.3. В окне «New Items» выберите пиктограмму мастера создания консольного приложения «Console Application» и нажмите кнопку «ОК». Появится окно редактора консольного приложения.

2.4. Сохраните файлы проекта в раннее созданную папку Ivanov-4 с помощью команды основного меню «File / Save Project As…».

2.5. В окне «Save Project As» с помощью списка «Папка» перейти в папку проекта Ivanov-4 нажать кнопку «Сохранить».

2.6. В результате файлы проекта Project2 будут сохранены в папку Ivanov-4 и Вы в дальнейшем сможете легко отыскать проект на жестком диске для продолжения работы с ним, скопировать папку на дискету для переноса проекта на другой компьютер и т.д.

3. Вывод коэффициента рекуррентности q.

      до цикла цикл ®

 

.

4. Проверка правильности вычисления q.

До цикла: предыдущее слагаемое ;

значение переменной .

Цикл начинается при значении переменной и заканчивается при .

   
 
 
: : : : : : : : : :
n

 

 

5. Редактирование текста главной программы для задачи 1.

PROGRAM Ivanov4;

{$APPTYPE CONSOLE}

USES

SysUtils;

CONST

n=9; // количество элементов суммы

x=0.6; // для этого Х вычислить сумму

VAR

s:real; // искомая сумма

q:real; // коэффициент рекуррентности

a1,a2:real; // предыдущий и следующий элементы суммы

i:integer; // счетчик элементов суммы

BEGIN

s:=1; // значение суммы до начала цикла

a1:=1; // слагаемое перед началом цикла

for i:=1 to n do begin

q:=-x/i; // i-й коэффициент рекуррентности

a2:=a1*q; // следующий элемент суммы

s:=s+a2; // суммирование

a1:=a2 // подготовка к следующему такту цикла

end;

WriteLn (' x=',x:5:1,' s=',s:9:6);

WriteLn('***** Press <ENTER> to finish *****');

readln;

END.

 

6. Командой меню «Run / Run» (горячая клавиша F9) запустите приложение на выполнение. Консольное окно с результатами расчета для задачи 1 выглядит так:

 

 

7. Редактирование текста главной программы для задачи 2.

program Ivanov4_2;

{$APPTYPE CONSOLE}

uses

SysUtils;

CONST

xn=0.1; { начальное значение Х }

xk=1.0; { конечное значение Х }

hx=0.1; { шаг по Х }

eps=1e-6; { точность вычисления суммы }

VAR

S:real; { сумма }

q:real; { коэффициент рекуррентности }

a1,a2:real; { предыдущий и следующий элементы суммы }

x:real; { текущее значение Х }

i:integer; { счетчик элементов суммы }

k:integer; { счетчик количества точек Х }

begin

WriteLn('Task # 2');

x:=xn; {начальная точка Х }

k:=1; { номер точки X }

WHILE x<=xk+eps DO BEGIN { начало цикла по Х }

s:=1; { значение суммы до цикла в К-й точке Х }

a1:=1; { слагаемое непосредственно перед началом цикла}

i:=1; { начальное значение счетчика i }

REPEAT {цикл REPEAT для вычисления суммы в К-й точке Х}

q:=-x/i;

a2:=a1*q;

s:=s+a2;

i:=i+1;

a1:=a2

UNTIL abs(a2)<eps; { закончился оператор REPEAT }

WriteLn (k:2,'. ',' x=',x:3:1,' s=',s:9:6);

k:=k+1;

x:=x+hx; { переход на следующий Х }

END; { закончился оператор WHILE }

WriteLn('Press <ENTER> to finish');

ReadLn;

end.

 

8. Консольное окно с результатами расчета для задачи 1 выглядит так:

 

Варианты заданий

 

1. ;

1) n = 6, x = 0.1; 2) x = 0.1…1.0,

 

2. ;

1) n = 8, x = 1.2; 2) x = 1…2,

 

3.

 

4.

 

5.

 

6.

 

7.

 

8.

 

9.

 

10.

 

11.

 

12.

 

13.

 

14.

 

15.

 

16.

17.

 

18.

 

19.

 

20.

 

21.

 

22.

 

23.

 

24.

 

25.

 

26.

 

27.

 

28.

 

29.

 

30.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: