1 семестр Калмычков / Отчёт Л3
.docxМинобрнауки РФ
Санкт-Петербургский государственный электротехнический университет
им. В.И. Ульянова (Ленина) «ЛЭТИ»
(СПбГЭТУ)
Факультет компьютерных технологий и информатики
Кафедра САПР
ОТЧЁТ
По лабораторной работе №3
«Использование итерационных алгоритмов»
Преподаватель: ______________________ Калмычков В. А.
Студент гр. 8309: ______________________ Янтиков Д. А.
Санкт-Петербург
2018
Оглавление
Формулировка задания 3
Цель работы 3
Анализ задания и контрольный пример 3
Математическая постановка задачи 3
Блок – схема 4
Текст программы 5
Примеры работы программы 6
Вывод 8
Формулировка задания
Написать программу, определяющую минимально значение n > 0, для которого очередное слагаемое по модулю не превышает Eps > 0 при нахождении результата согласно формуле:
Цель работы
Изучение библиотеки “fstream”, использование её для записи информации в файл, а также обучение работы с оператором цикла while.
Анализ задания и контрольный пример
-
Eps = e^0.0000000000000001
-
a1 = 5.00000e+00
-
a2 = 6.25000e+00
-
a3 = 4.16667e+00
…
-
a22 = 2.31865e-17
-
S22 = a1 + a2 + a3 + … + a22 =
= 18.105428403911520973679216695018112659454345703125000
-
n = 22
Математическая постановка задачи
Дано: Уравнение суммы и Eps > 0 (бесконечно малое число).
Найти: Значение n > 0, для которого очередное слагаемое по модулю не превышает Eps.
Способ решения: Производить вычисления до того момента, пока не станет меньше Eps, т.к. функция уравнения является уменьшающейся и стремящейся к 0, но никогда не достигающей её. Результаты записывать в файл output.txt.
Организация диалога с пользователем: После запуска программа выводит приветствие и условие задания. Затем предлагает пользователю ввести значение Eps. Сразу после ввода программа просчитывает значения согласно формуле при каждом значении n, сумму последовательности всех просчитанных a, и записывает их в текстовый файл, пока a не станет меньше значения Epsilon. Затем пользователю предлагается перейти в файл вывода, чтобы посмотреть результат работы программы.
Определение внутреннего формата представления данных:
Переменные S, Eps, ix, а также временные переменные для совершения действий (a, a1, a2, a3, b) – переменные типа long double. Переменной i присвоен тип int.
Описание алгоритма: Вывод в консоль приветствия и формулировки задания. Ввод пользователем с клавиатуры значения Eps. Проверка на корректность введенного значения Eps (5 попыток). Открытие файла вывода. Выполнения действий согласно формуле из условия и запись необходимых результатов в файл.
Блок – схема
Текст программы
#include "pch.h"
#include "iostream"
#include "iomanip"
#include "fstream"
using namespace std;
int main()
{
ofstream out;
setlocale(LC_ALL, "Russian");
long double s, eps, a, a1, a2, a3, b, ix;
int i;
cout << "Iantikov Daniil, 8309." << endl << "Version 3.1.1 " << endl << "(25.09.2018 - 01.10.2018)" << endl << endl;
cout << "Определить минимальное значение n > 0, для которогоочередное слагаемое по модулю не превышает eps > 0 при нахождении результата согласно формуле:" << endl << endl;
cout << " n \n";
cout << " ------- i\n";
cout << " \\ 5 *(i+1)!\n";
cout << " \\ ________________\n";
cout << " / \n";
cout << " / (2 * i)!\n";
cout << " -------\n";
cout << " i=1\n \n";
i = 0;
do
{
cout << "Пожалуйста, введите eps(>0): ";
cin >> eps;
if (eps > 0 && eps < 0.0001) break;
{
cout << "Ошибка ввода eps, пожалуйста введите подходящее значение.\n";
i =+ 1;
}
}
while (i < 5);
if (i >= 5)
cout << "Превышен лимит попыток.";
else
{
out.open("C:\\Users\\danii\\source\\repos\\Proga 3\\output.txt");
i = 1;
a = 5.000000000000000000000000000000000000000000000000000000000000000;// значение первой итерации
s = a;
a1 = 5.0;
a2 = 2.0;
a3 = 2.0;
b = 6.0;
out << " i ai si \n";
out << "-----------------------------------------------------------------------------------------\n";
out << "| " << left << scientific << setw(4) << i << " | " << setw(13) << setprecision(5) << a << " | " << setw(61) << setprecision(60) << fixed << s << endl;
while (abs(a) >= eps && i < 1000)
{
i += 1;
ix = i * 2;//4 6 8
b = b * ix;//24 720 40320
a1 = a1 * 5;
a2 = a2 * (i + 1);
a = (a1 * a2) / b;
b = b * (ix + 1);//120 5040 362880
s += a;
out << "| " << left << scientific << setw(4) << i << " | " << setw(13) << setprecision(5) << a << " | " << setw(61) << setprecision(60) << fixed << s << endl;
}
out << "-----------------------------------------------------------------------------------------\n";
}
out << "n = " << i;
out.close();
}
Примеры работы программы
-
Программа выдает ошибку из-за некорректности введенного значения Eps и исчерпания пользователем попыток его ввода:
Консоль:
-
Успешное выполнение программы при Eps = 0.00000000001:
Консоль:
Файл output.txt:
Вывод
В ходе выполнения задания была освоена библиотека “fstream”, изучены основные действия с циклическими операторами while и do while на языке С++, а также получены практические навыки использования языка для решения задач.