Вычисление бесконечной суммы осуществляется следующим образом. Так как выражение под знаком суммы
убывает с ростом слагаемых в сумме, то наступает момент, когда очередное слагаемое станет меньше некоторого заранее заданного числа
(грубо говоря, точности вычисления сумм), и остальные слагаемые будут мало влиять на конечный результат. Поэтому, когда абсолютное значение выражения под знаком суммы
будет меньше
, вычисления прекращаются и предполагается, что сумма
найдена с заданной точностью.
В языке Си для циклов с заранее неизвестным числом повторений обычно используются операторы 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 |










