
1 семестр / Отчет прога лаба 3
.docxМИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Факультет компьютерных технологий и информатики
Кафедра САПР
ОТЧЁТ
по лабораторной работе № 3
по дисциплине «Программирование»
Тема: Реализация программы с циклами для вычисления последовательности значений
Студент группы 4353: |
|
|
Преподаватель: |
|
Калмычков В.А. |
Санкт-Петербург
2024
Оглавление:
1. Формулировка задания 3
2. Устранение неточностей 3
3. Математическая постановка задачи 3
4. Контрольный пример 3
5. Ограничения 3
6. Разработка интерфейса пользователя 3
7. Библиотеки 4
8. Разработка интерфейса пользователя 4
9. Алгоритм 5
10. Текст программы 6
11. Результаты работы программы 8
12. Вывод 9
Формулировка задания
Составить программу,
вычисляющая на каком минимальном
неотрицательном целочисленном шаге N
условие |u(i)|
< ε (1) будет выполняться, при вводном
ε и x, а также вычислить
.
При этом x2 ≤ 1.
Устранение неточностей
ε должен быть близок к 0.
Математическая постановка задачи
Дано: вещественные числа ε и x.
Найти: значение N, на котором |u(i)| < ε, и S.
Способ
решения: так как вычислять мы будем
вычислять каждый следующий целочисленный
неотрицательный шаг, то вычислим
:
Контрольный пример
Пусть x = 0,6 ; ε = 1e-11:
8,12E-05
6,57E-06
1,96E-06
5,95E-07
1,84E-07
5,77E-08
1,83E-08
5,87E-09
1,9E-09
6,18E-10
2,03E-10
6,67E-11
2,21E-11
7,35E-12
<1e-20
N = 14.
Ограничения
Так как x2 ≤ 1, то -1 < x < 1
Разработка интерфейса пользователя
O1: Задание: Определить минимальное значение n>0, для которого очередное слагаемое по модулю не превышает eps > 0 при нахождении результата согласно данной формуле:
__inf
f(x)= \ u(i)
/
--i=0
u(i) = (2i)! * x^(2i + 1) / 2^(2*i) / (i!)^2 / (2i + 1)
Автор:
Группа:
Версия программы: 3.2.19
Дата начала: 5.11.24
Завершения : 11.11.24
О2: Введите eps [0; 1e-10)
I1: ±ddd.ddd или ±0.ddde±dd
O3: Введите x[-1;1]:
I2: ±0.ddd или ±0.ddde±dd
O4: i |U(i)| S
O5: ±ddd | ±ddd.ddd или ±0.ddde±dd | ±ddd.ddd или ±0.ddde±dd
O6: Минимальное значение n, для которого очередное слагаемое по модулю превышает eps, равно ddd
O7: |U(i)| не достигает eps при N = 1000
O8: Неверное значение x
O9: Введено неправильное значение eps
O10:Введено неправильное значение eps Вы превысили количество попыток, программа завершает свою работу.
Библиотеки
-
Библиотека
Функция
Назначение
iostream
cout
Вывод текста
cin
Ввод числа
fstream
open()
Открыть файл
close()
Закрыть файл
iomanip
setprecision()
Установить точность вывода
setw()
Количество символов на вывод числа
left
Перемещает выводимый текст влево
fixed
Полный вывод числа
math.h
fabs()
Модуль вещественного числа
Внутреннее представление данных в программе
-
Имя
Тип
Назначение
x
float
Вводное значение x
eps
Вводное значение ε
u
Значение u(i)
S
Сумма
q
Текущий коэффициент q
i
unsigned
Текущий шаг
f
fstream
Файл
Алгоритм
Текст программы
/*
Задание:Определить минимальное значение n>0, для которого очередное слагаемое по модулю не превышает eps > 0 при нахождении результата согласно данной формуле:
__inf
f(x)= \ u(i)
/
——i=0
u(i) = (2i)! * x^(2i + 1) / 2^(2*i) / (i!)^2 / (2i + 1)
Автор: Группа: Версия программы: 3.1.19
Дата начала: 5.11.24 Завершения: 11.11.24
*/
#include <iostream>
#include <iomanip>
#include <fstream>
#include <locale>
#include <math.h>
using namespace std;
int main(void)
{
setlocale(LC_ALL, "russian");
float x, eps, u, s;
unsigned i;
fstream f;
f.open("results.txt", ios::out);
if (!f.is_open())
cout << "Файл не открыт";
else
{
cout << "Задание:Определить минимальное значение n>0, для которого очередное слагаемое по модулю не превышает eps > 0 при нахождении результата согласно данной формуле:\n"
" __inf\n"
"f(x)= \\ u(i)\n"
" /\n"
" ——i=0\n"
"u(i) = (2i)! * x^(2i + 1) / 2^(2*i) / (i!)^2 / (2i + 1)\n";
cout << "Автор: \nГруппа: \nВерсия программы: 3.2.19\nДата начала: 17.10.24\nЗавершения : \n";
f << "Задание:Определить минимальное значение n>0, для которого очередное слагаемое по модулю не превышает eps > 0 при нахождении результата согласно данной формуле:\n"
" __inf\n"
"f(x)= \\ u(i)\n"
" /\n"
" ——i=0\n"
"u(i) = (2i)! * x^(2i + 1) / 2^(2*i) / (i!)^2 / (2i + 1)\n";
f << "Автор: \nГруппа: Версия программы: 3.1.19\nДата начала : 5.11.24\nЗавершения : 11.11.24\n";
i = 0;
do
{
if (i == 0)
{
cout << "Введите eps [0; 1e-10)\n";
f << "Введите eps [0; 1e-10)\n";
cin >> eps;
f << eps << '\n';
i++;
}
else
{
cout << "Введено неправильное значение eps:" << eps << "\nПопытка номер:" << i << "\n";
cout << "Повторно введите eps (0;1e-10)\n";
f << "Введено неправильное значение eps:" << eps << "\nПопытка номер:" << i << "\n";
f << "Повторно введите eps (0;1e-10)\n";
cin >> eps;
f << eps << '\n';
i++;
}
} while (((eps <= 0) || (eps >= 1e-10)) && (i < 3));
if ((i >= 3) && ((eps <= 0) || (eps >= 1e-10)))
{
cout << "Введено неправильное значение eps:" << eps << "\nВы превысили колличество попыток, программа завершает свою работу.\n";
f << "Введено неправильное значение eps:" << eps << "\nВы превысили колличество попыток, программа завершает свою работу.\n";
}
else
{
i = 0;
cout << "Введите х\n";
f << "Введите х\n";
cin >> x;
f << x << '\n';
u = x; // U(0)
s = u;
cout << "|" << setw(4) << "i" << "|";
cout << setw(12) << "|u|" << "|";
cout << setw(12) << "s" << "|\n";
cout << "---------------------------------\n";
cout << "|" << noshowpoint << left << setw(4) << i << "|";
cout << showpoint << scientific << setw(12) << setprecision(6) << u << "|";
cout << showpoint << scientific << setw(12) << setprecision(6) << s << "|\n";
f << "|" << setw(4) << "i" << "|";
f << setw(12) << "|u|" << "|";
f << setw(12) << "s" << "|\n";
f << "---------------------------------\n";
f << "|" << noshowpoint << left << setw(4) << i << "|";
f << showpoint << scientific << setw(12) << setprecision(6) << u << "|";
f << showpoint << scientific << setw(12) << setprecision(6) << s << "|\n";
while ((u > eps) && (i <= 1000))
{
u = u * fabs((2 * i + 1.0) * (2 * i + 2.0) * x * x * (2 * i + 1.0) / (4 * (2 * i + 3.0) * (i + 1.0) * (i + 1.0))); // U(i+1) = U(i) * q; q - переходной коэфицент
s = s + u;
i++;
cout << "|" << noshowpoint << left << setw(4) << i << "|";
cout << showpoint << scientific << setw(12) << setprecision(6) << u << "|";
cout << showpoint << scientific << setw(12) << setprecision(6) << s << "|\n";
f << "|" << noshowpoint << left << setw(4) << i << "|";
f << showpoint << scientific << setw(12) << setprecision(6) << u << "|";
f << showpoint << scientific << setw(12) << setprecision(6) << s << "|\n";
}
cout << "Минимальное значение n, для которого очередное слагаемое по модулю превышает eps, равно " << setw(4) << noshowpoint << i << "\n";
f << "Минимальное значение n, для которого очередное слагаемое по модулю превышает eps, равно " << setw(4) << noshowpoint << i << "\n";
}
}
f.close();}
Результаты работы программы
При x = 0.6 и ε = 10e-12:
При вводе некорректного eps:
При вводе некорректного х:
Вывод
В ходе выполнения задания были освоены циклы для вычисления последовательности значений в C++.