Структурированная запись алгоритма 23 .1 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Структурированная запись алгоритма 23 .1



1. Sum = 0.

2. n = 1.

3. Eps = 10-5

4. Повторять:

4.1 Вывести сообщение: «Введите значение x (0< x <1)».

4.2 Ввести значение x.

Завершить повторение, если 0< x <1.

5. y = x / (x+1).

6. a = y.

7. Повторять, пока | a| ≥ Eps:

7.1. Sum = Sum + a.

7.2. n = n+1.

7.3. a = a * y * (n-1) / n.

8. Вывести сообщение «Сумма ряда:» и значение переменной Sum

9. Вывести сообщение «Количество учтенных членов в сумме ряда:» и значение выражения n–1

Однако данный алгоритм не учитывает возможность ввода пользователем такого x, при котором уже самый первый член ряда будет меньше Eps и в такой ситуации будет выводить в результате «Сумма ряда: 0 Количество учтенных членов в сумме ряда: 0», что неверно, поскольку сумма вообще не определена. Для коррекции такого поведения необходимо действия с 8 по 9 выполнять только после проверки «Если n >1, то», а в альтернативной ветви этого условия выводить сообщение «Сумма ряда не определена – ни один член ряда не удовлетворяет условию».

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

Структурированная запись алгоритма 23.2

1. Sum = 0.

2. n = 1.

3. Eps = 10-5

4. Повторять:

4.1 Вывести сообщение: «Введите значение x (0< x <1)».

4.2 Ввести значение x.

Завершить повторение, если 0< x <1.

5. y = x / (x+1).

6. a = y.

7. Повторять, пока |a| ≥ Eps:

7.1. Sum:= Sum + a.

7.2. a = a * y * n.

7.3. n = n+1.

7.4. a = a / n.

8. Если n > 1, то:

8.1. Вывести сообщение «Сумма ряда:» и значение переменной Sum

8.2. Вывести сообщение «Количество учтенных членов в сумме ряда:» и значение выражения n –1.

Иначе вывести сообщение «Сумма ряда не определена – ни одно слагаемое не удовлетворяет условию»

Однако данный алгоритм все еще обладает тем недостатком, что в нем при вычислении каждого слагаемого сначала происходит умножение на n, а затем деление на n +1. Для уменьшения числа трудоемких действий (к которым относится умножение и деление) можно использовать частично-рекуррентные вычисления, когда каждое слагаемое вычисляется как произведение 1/ n на рекуррентно вычисленное значение (x/(x+1))n. Если заменить второе выражение переменной ap,  тогда  очередное слагаемое an = (1/ n)apn = apn / n, где apn = apn -1 ∙ (x/(x+1)), а начальное значение a 1 = ap 1 = (x/(x+1)). Воспользовавшись ранее введенной переменной y для обозначения вычисленного сразу после ввода переменной x выражения x/ (x+1), запишем модификацию алгоритма с частично-рекуррентным вычислением слагаемых.

Структурированная запись алгоритма 23. 3

1. Sum = 0.

2. n = 1.

3. Eps = 10-5

4. Повторять:

4.1 Вывести сообщение: «Введите значение x (0< x <1)».

4.2 Ввести значение x.

Завершить повторение, если 0< x <1.

5. y = x / (x+1).

6. ap = y

7. a = ap.

8. Повторять, пока |a| ≥ Eps:

8.1. Sum = Sum + a.

8.2. n = n+1.

8.3. ap = ap * y

8.4. a = (1 / n)*ap.

9. Если n > 1, то:

9.1. Вывести сообщение «Сумма ряда:» и значение переменной Sum

9.2. Вывести сообщение «Количество учтенных членов в сумме ряда:» и значение выражения n –1.

Иначе вывести сообщение «Сумма ряда не определена – ни одно слагаемое не удовлетворяет условию»

Схема алгоритма

 

 

Программа на языке Си

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#define Eps 1e-5

int main(void)

{

unsigned int n=1;

double x, y, a, ap, Sum = 0;

do{

printf("Введите x (0 < x < 1):");

scanf("%lf",&x);

}while(!(0<x && x<1));

y = x / (x+1);

ap = y;

a = ap;

while(fabs(a)>= Eps){

Sum = Sum + a;

n= n+1;

ap = ap*y;

a=ap/n;

}

if(n > 1)

{

printf("Сумма ряда: %lf\n", Sum);

printf("Количество учтенных членов");

printf(" в сумме ряда: %u", n-1);

}

else

{

printf("Сумма ряда не определена -- ");

printf("ни одно слагаемое ");

printf("не удовлетворяет условию\n");

}

system("pause");

return 0;

}

Программа на языке Паскаль

program Pr_23_3;

const

Eps = 1e-5;

var

Sum, x, y, ap, a: Real;

n: Integer;

begin

Sum:= 0;

n:= 1;

repeat

writeln(' Введите x (0 < x < 1): ');

readln(x);

until (0 < x) and (x < 1);

y:= x / (x+1);

ap:= y;

a:= ap;

while abs(a) >= Eps do

begin

Sum:= Sum + a;

n:= n + 1;

ap:= ap * y;

a:= ap/n;

end;

if n > 1 then

begin

writeln(' Сумма ряда: ', Sum);

write(' Количество учтенных членов ');

writeln(' в сумме ряда: ', n-1);

end

else

begin

write(' Сумма ряда не определена -- ');

write(' ни одно слагаемое ');

writeln(' не удовлетворяет условию ');

end;

end.

Программа на языке Фортран

Program Pr_23_3

Implicit none

integer n

real Sum,Eps,x,a,ap,y

n=1

Sum = 0

Eps=1e-5

x=0

do while (.not.(x>0.and.x<1))

print*,'Введите x (0<x<1):'

read*,x

enddo

y = x / (x+1)

ap = y

a = ap

do while (abs(a)>= Eps)

Sum = Sum + a

n= n+1

ap = ap*y

a=ap/n

enddo

if(n > 1) then

print '(1x,A,F6.4)','Сумма ряда:', Sum

print*,'Количество учтенных членов'

print '(1x,A,I5)',' в сумме ряда:', n-1

else

print*,' Сумма ряда не определена -- '

print*,'ни одно слагаемое  '

print*,' не удовлетворяет условию'

endif

end

Программа на языке Python

Sum = 0

n = 1

Eps = 1e-5

x = 2

while not 0 < x < 1:

print("Введите x (0 < x < 1): ")

x = float(input())

y = x / (x + 1)

ap = y

a = ap

while(abs(a) >= 1e-5):

Sum = Sum + a

n = n + 1

ap = ap * y

a = ap / n

if n > 1:

print("Сумма ряда: ")

print(Sum)

print("Количество учтенных членов: ")

print(n - 1)

else:

print("Сумма ряда не определена")

Программа в системе Матлаб

n=1;

Sum = 0;

Eps=1e-5;

x=0;

while ~(x>0 && x<1)

x=input('Введите x (0<x<1):');

end

y = x / (x+1);

ap = y;

a = ap;

while abs(a)>= Eps

Sum = Sum + a;

n= n+1;

ap = ap*y;

a=ap/n;

end

if(n > 1)

disp(sprintf('Сумма ряда: %f', Sum))

disp(sprintf('Количество учтенных членов'))

disp(sprintf(' в сумме ряда: %d', n-1))

else

disp('Сумма ряда не определена -- ')

disp('ни одно слагаемое ');

disp('не удовлетворяет условию');

end

 



Поделиться:


Последнее изменение этой страницы: 2021-04-12; просмотров: 84; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.143.168.172 (0.04 с.)