Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1 семестр / Отчет прога лаба 3

.docx
Скачиваний:
0
Добавлен:
28.03.2025
Размер:
239.91 Кб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Факультет компьютерных технологий и информатики

Кафедра САПР

ОТЧЁТ

по лабораторной работе № 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

  1. Формулировка задания

Составить программу, вычисляющая на каком минимальном неотрицательном целочисленном шаге N условие |u(i)| < ε (1) будет выполняться, при вводном ε и x, а также вычислить . При этом x2 ≤ 1.

  1. Устранение неточностей

ε должен быть близок к 0.

  1. Математическая постановка задачи

Дано: вещественные числа ε и x.

Найти: значение N, на котором |u(i)| < ε, и S.

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

  1. Контрольный пример

Пусть 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.

  1. Ограничения

Так как x2 ≤ 1, то -1 < x < 1

  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 Вы превысили количество попыток, программа завершает свою работу.

  1. Библиотеки

Библиотека

Функция

Назначение

iostream

cout

Вывод текста

cin

Ввод числа

fstream

open()

Открыть файл

close()

Закрыть файл

iomanip

setprecision()

Установить точность вывода

setw()

Количество символов на вывод числа

left

Перемещает выводимый текст влево

fixed

Полный вывод числа

math.h

fabs()

Модуль вещественного числа

  1. Внутреннее представление данных в программе

Имя

Тип

Назначение

x

float

Вводное значение x

eps

Вводное значение ε

u

Значение u(i)

S

Сумма

q

Текущий коэффициент q

i

unsigned

Текущий шаг

f

fstream

Файл

  1. Алгоритм

  1. Текст программы

/*

Задание:Определить минимальное значение 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();}

  1. Результаты работы программы

При x = 0.6 и ε = 10e-12:

При вводе некорректного eps:

При вводе некорректного х:

  1. Вывод

В ходе выполнения задания были освоены циклы для вычисления последовательности значений в C++.