_ОП_ЛР5
.docx
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
-
Федеральное государственное автономное образовательное учреждение высшего образования
«Санкт-Петербургский государственный университет аэрокосмического приборостроения»
КАФЕДРА № 2
Преподаватель
доцент, к.т.н. Куртяник Д.В.
Отчёт
по лабораторной работе №5
по дисциплине Информатика
на тему: « Суммирование рядов»
Работу выполнил
студент гр. 4616 Павлов А.В.
Санкт-Петербург
Цель лабораторной работы: изучение концепций и освоение технологии процедурного программирования, приобретение навыков программирования на языке C/С++ циклических вычислений при решении задач суммирования рядов.
Задание на программирование: используя технологию процедурного программирования разработать программу вычисления суммы ряда с заданной точностью в заданном интервале допустимых значений аргумента.
Программа должна формировать таблицу, содержащую значения аргумента ряда, суммы ряда, количество слагаемых и контрольные значения суммы, полученные с помощью стандартных функций библиотеки.
Порядок выполнения работы:
1) Получить у преподавателя индивидуальное задание. Выполнить постановку задачи: сформулировать условие, определить входные данные и их ограничения, определить вид выходной таблицы значений.
2) Разработать математическую модель:
- вывести рекуррентную формулу для расчета очередного слагаемого;
- описать начальные установки номера слагаемого, слагаемого, суммы;
- описать процесс накопления суммы.
3) Построить схему алгоритма. Обосновать выбор циклических управляющих структур.
4) Составить программу на языке C/С++.
5) Входные данные вводить с клавиатуры по запросу.
6) Выходные данные выводить на экран в форме таблицы с графами:
аргумент, сумма, количество слагаемых, контрольное значение суммы.
7) Использовать форматированный ввод/вывод в стиле языка C.
8) Проверить и продемонстрировать преподавателю работу программы, при этом значение суммы должно совпадать с соответствующим контрольным значением (с заданной точностью). Выходная таблица должна содержать от 5 до 10 строк.
9) Оформить отчет о лабораторной работе в составе: постановка задачи, математическая модель, схема алгоритма решения, текст программы, контрольные примеры.
1-3)
Вариант 10
ex(1+x) = , |x| < 2.4.
Ввод x и проверка на условие x<2.4 дальше ввод точности EPS =>
(y1-y0)>eps => //вычисление y0=y1; y1=y0+step(x,n)*(n+1)/fraktal(n); n++; => Используется прием при котором точность слагаемых понижается после определенного числа, используется чтобы уменьшить время расчета значений.
Текст программы.
/*Вычислить e^x*(1+x)=1+2*x/1!+3*x^2/2!+4*x^3/3!+... , |x|<2.4
Результаты представить в виде таблицы:
аргумент, сумма, количество слагаемых, контрольное значение*/
#include <stdio.h>
#include <locale.h>
#include <math.h>
using namespace std;
int INTMAX=13; //количество слагаемых после которых точность будет ниже
long fraktal(int n);
float riad(float,float,float,int&);
int main(){
setlocale(LC_ALL,"Russian") ;
int var; //вид действия
float x,xk,eps,h,xn,e,rez; //изначальные данные
int i,n;
while(true){
//Выбор вида действия
printf("\nВид действия:\n1 - вывести таблицу значений\n2 - завершения задачи\nвведите вид действия -> ");
scanf("%d",&var);
switch(var){
case 1:
//Ввод исходных данных
printf(" Введите начальное значение степени: ");
scanf("%f", &xn);
printf(" Введите конечное значение степени: ");
scanf("%f", &xk);
if (xk <= xn)
{
printf("\n Ошибка! Значение xk д.б. > xn");
return 1;
}
printf(" Введите шаг изменения степени: ");
scanf("%f", &h);
if (h <= 0)
{
printf("\n Ошибка! Значение д.б. >0");
return 1;
}
printf(" Введите точность вычисления: ");
scanf("%f", &eps);
if (eps <= 0)
{
printf("\n Ошибка! Значение д.б. >0");
return 1 ;
}
//Вывод заголовка
for(i = 0 ; i < 50 ; i++) printf("-") ;
printf("\n|Степень | Сумма |Кол.слаг.|Контрольное значение|\n") ;
for(i = 0 ; i < 50 ; i++) printf("-") ;
x = xn;
do{
n = 0 ;
e=exp(x)*(x+1);
rez = riad(x, e, eps, n);
printf("\n|%6.2f |%8.4f|%6d |%14.4f |\n", x, rez, n, e);
for(i = 0 ; i < 50 ; i++) printf("-");
x += h ;
}while(x <= xk) ;
break;
case 2:return 0;
}//switch
}//while
}
float riad(float x,float e,float eps,int &n)
{
float rez = 0 ;
n = 0 ;
while (fabs(e-rez) > eps)
{
n++;
if(n>=INTMAX){
printf("\nТочность измерения не достигнута");
n--;
return rez;}
rez += n*pow(x,(n-1))/fraktal(n-1);
}
return rez ;
}
long fraktal(int n)
{
long rez=1;
if(n==0||n==1)return rez;
for(int i=2;i<=n;i++)rez*=i;
return rez;
}
Примеры.