Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Repeat

Repeat

Begin

End.

Begin

Begin

Var

End.

Begin

Var

p,x: real;

i,n: integer;

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);

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

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

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

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

Program digits;

n,k: integer;

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

readln(n);

k:=1;

while n div 10>0 do

k:=k+1;

n:=n div 10;

end;

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

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

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

readln(n);

while n < 0 do

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

readln(n);

end;

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

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

оператор1;

оператор2;

......

операторN;

until <условие>;

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

Перепишем теперь фрагмент ввода, используя цикл 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,

 

 

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

 

.

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

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

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

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

   
 
 
: : : : : : : : : :
n

 

Программа для задачи 1:

 

PROGRAM lab7_1;

uses crt;

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

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

VAR s:real; { искомая сумма }

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

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

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

BEGIN

clrscr; { очистка экрана }

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;

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

readln;

END.

 

Экран выполнения программы для задачи 1:

 

Программа для задачи 2:

PROGRAM lab_7_2;

USES crt;

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

clrscr; { очистка экрана }

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;

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

k:=k+1;

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

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

repeat until keypressed; { задержка экрана }

END.

 

Экран выполнения программы для задачи 2:

 

 

 

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

 

 

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.




Поделиться с друзьями:


Дата добавления: 2014-12-26; Просмотров: 908; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.