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

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

При вычислении суммы должен вычисляться факториал по формуле:

,

где — знак произведения, например . Факториал 0 равен 1 ().

В программе факториал можно вычислить отдельным циклом for, а можно и непосредственно в цикле вычисления суммы, воспользовавшись итерационным выражением . Для этого вводится дополнительная переменная , начальное значение которой равно 1. Затем в каждом цикле она умножается на текущее значение индекса суммы .

В языке Си под переменные типа int выделяется два или четыре байта. Для двухбайтовых целых чисел допустимые значения находятся в диапазоне от –32 768 до 32 767. Поэтому число 10!, реально равное 3 628 800, в этом случае из-за переполнения будет представлено в памяти компьютера как 24 320. Для четырехбайтовых целых переполнение происходит для значения Таким образом, при использовании целых типов для переменной факториала выражение под знаком суммы может никогда и не стать меньше заданной точности. Поэтому для работы с большими числами рекомендуется использовать вещественные типы float с диапазоном представления от 8,4×10–37 до 3,4×10+38 или double с диапазоном от 2,2×10–308 до 1,9×10+308.

НЕ нашли? Не то? Что вы ищете?

Листинг 21 — Лабораторная работа №6

/* lab6.c - лабораторная работа №6. */

#include <stdio. h>

#include <locale. h>

#include <conio. h>

#include <math. h>

#define e 1e-3 /* точность */

int main()

{

double s = 0, s_k; /* для вычисления суммы */

const double x = 0.81;

double fact = 1; /* для вычисления факториала */

int k = 1;

setlocale(LC_ALL, “”);

/* заголовок таблицы */

printf(“------------------------------\n”);

printf(“| Шаг | Факториал | Значение |\n”);

printf(“------------------------------\n”);

/* вычисление суммы при помощи цикла do-while */

do {

fact *= k;

s_k = (k + x) / fact * exp(x / k);

printf(“| %3d | %9.0f | %8.4f |\n”, k, fact, s_k);

s += s_k;

k++;

} while (fabs(s_k) > e);

printf(“------------------------------\n”);

/* вывод результатов */

printf(“Значение суммы: %f”, s);

getch();

return 0;

}

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

Рисунок 49 — Составление блок-схемы программы lab6.c

Рисунок 50 — Результат выполнения lab6.c

Задание

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

Таблица 14 — Варианты заданий к лабораторной работе №6

№ вар.

Вычислить

Точность

1

0,149

10–5

2

5,99

10–3

3

3,1

2·10–4

4

1,91

5·10–5

5

1,42

10–3

6

0,99

3·10–4

7

1,51

2·10–5

8

3,48

10–3

9

7,55

4·10–4

10

2,15

5·10–5

11

0,47

10–4

12

1,21

3·10–5

13

3,06

10–3

14

0,72

2·10–4

15

2,34

5·10–5

16

1,85

10–3

17

2,09

10–4

18

0,56

5·10–5

19

1,17

10–3

20

2,88

2·10–4

21

0,61

4·10–5

22

4,17

10–3

23

1,28

2·10–4

24

2,35

5·10–5

25

3,82

10–4

Вопросы для отчета

1.  Опишите принцип вычисления бесконечной суммы с заданной точностью.

2.  Какой вид цикла лучше всего подходит для вычисления такой суммы на языке Си? Почему?

3.  Опишите итерационный способ вычисления факториала. Объясните выбор типа переменной для представления факториала в программе.

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

5.  Перечислите переменные, необходимые для решения задачи. Опишите их имя, назначение и тип данных.

6.  Запишите выражение под знаком суммы на языке Си. Опишите используемые математические функции. Какой заголовочный файл необходимо подключить для использования их в программе?

7.  Опишите при помощи каких операций языка Си будет осуществляться накопление суммы и изменение переменной цикла.

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

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

Из за большого объема этот материал размещен на нескольких страницах:
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