- •«Московский государственный технический университет гражданской авиации»
- •Лабораторная работа №5 Разработка программ с использованием функций для обработки массивов арифметических и символьных данных.
- •Цель лабораторной работы
- •1.2. Теоретические сведения Создание динамических массивов
- •Массивы указателей
- •Создание двумерного динамического массива с помощью динамического массива указателей.
- •Определение динамического двумерного массива
- •Указатель на массив. Многомерные массивы динамической памяти.
- •Определение типа массива
- •Определение типа указателя на массив
- •Основные виды обработки массивов.
- •1.3 Задание на выполнение лабораторной работы
- •1.4 Порядок выполнения работы
- •1.5. Пример выполнения лабораторной работы
- •Схемы алгоритмов функций
- •Текст программы
- •1.6. Контрольные вопросы
- •1.7. Варианты заданий лабораторной работы
- •2. Лабораторная работа № 6 Разработка функций рекурсивных и без рекурсии, использующих параметр – функцию и оператор return.
- •2.1 Цель лабораторной работы
- •2.2. Теоретические сведения Рекурсивные функции
- •Указатели на функции
- •Массивы указателей на функции
- •Определение типа указателя на функцию
- •Указатель на функцию - параметр функции
- •2.3 Задание на выполнение лабораторной работы
- •2.4 Порядок выполнения работы
- •2.5 Пример выполнения лабораторной работы
- •Текст программы
- •2.6 Контрольные вопросы
- •2.7. Варианты заданий лабораторной работы
- •3 Лабораторная работа № 7
- •3.1 Цель лабораторной работы
- •3.2 Теоретические сведения Структура как совокупность данных
- •3.3 Задание на выполнение лабораторной работы
- •3.4 Порядок выполнения работы
- •3.5 Пример выполнения лабораторной работы
- •Текст программы
- •3.6 Контрольные вопросы
- •3.7 Варианты заданий лабораторной работы
- •4. Лабораторная работа № 8 Классы и объекты. Создание и разрушение объектов пользовательского класса, статических и динамических.
- •4.1 Цель лабораторной работы
- •4.2. Теоретические сведения Объектно-ориентированный подход к программированию.
- •Понятие класса
- •Объявление функции вне и внутри тела класса
- •Конструктор
- •Массивы объектов статических и динамических
- •Деструктор
- •Указатели на компоненты-функции
- •4.3 Задание на выполнение лабораторной работы
- •4.4 Порядок выполнения работы
- •Методические указания
- •4.5 Контрольные вопросы
- •4.6 Варианты задания
- •5 Список литературы
- •Содержание
- •1. Лабораторная работа № 5
- •1.1. Цель лабораторной работы 3
- •1.2. Теоретические сведения 3
- •4.1. Цель лабораторной работы 38
- •4.2. Теоретические сведения 38
2.5 Пример выполнения лабораторной работы
Задание: Дана функция и ряд для вычисления значения функции:
при
Вычислить значения функции с точностью e =10-5 в диапазоне значений аргумента x = -2 ÷ 2 c шагом 1.
Рекуррентная формула равна:
an+1= - an*x2 / (2*(n+1) *(2*n+3))
На рис. 5 приведена структура программы,
Рисунок 5. Структура программы.
Текст программы
#include <iostream>
#include <iomanip>
#include <cmath>
#include <windows.h>
#include <fstream>
using namespace std;
ofstream fout;
//----------------------------- Вычисление факториала-----------------------
long fact (int n) {
if (n < 0) return 0;
else if (n == 0) return 1;
else return n * fact (n - 1);
}
//--------------------------------Вычисление xn -------------------------------
double stx (double x, int n) {
if (n = = 0) return 1;
if (x = = 0) return 0;
if (n = = 1) return x;
if (n > 0) return (x * stx (x, n - 1));
if (n < 0) return (stx (x, n + 1) / x);
}
//----------------------------------Вычисление (-1) n -------------------------
int st (int n) {
if ((n == 0) || (n % 2 == 0)) return 1;
else return -1;
}
//--------------------- Функция вычисления очередного члена ряда----------
double next (double x, int n) {
return st(n)*stx(x,2*n+1)/fact(2*n+1);}
}
typedef double (*func) (double, int);
//--------Вычисление суммы с помощью while и рекуррентной формулы----
double S1 (int n, double x, double e) {
double a =x, s=0;
while (fabs(a)>e)
{s+=a; a*= (-1* x*x/(2*(n+1) *(2*n+3))); n++;}
return (s+a);
}
//-------Вычисление суммы с помощью do-while и рекуррентной формулы-double S2 (int n, double x, double e) {
double a =x, s=0;
do
{s+=a; a*= (-1* x*x/(2*(n+1) *(2*n+3))); n++;}
while (fabs(a)>e);
return (s+a);
}
//----------Вычисление суммы с помощью while и параметра – функции-----
double S3 (int n, double x, double e, func fn) {
double f = fn (x, n), s=0;
while(fabs(f)>e)
{s+=f; n++; f=fn (x, n);}
return (s+f);
}
//--------Вычисление суммы с помощью do-while и параметра – функции---
double S4 (int n, double x, double e, func fn) {
double f=fn (x, n), s=0;
do
{s+=f; n++; f=fn (x, n);}
while(fabs(f)>e);
return (s+f);
}
//-----С помощью рекурсивного суммирования и параметра – функции-----
double S5 (int n, double x, double e, func fn) {
double f = fn (x, n);
if(fabs(f)<e) return f;
else return (f+ S5(n+1, x, e, fn));
}
//------------------------------------Главная функция-----------------------------------
int main () {
SetConsoleCP (1251);
SetConsoleOutputCP (1251);
double e = 1.e-5;
fout.open ("l6.res");
if (!fout) {
cout << "Ошибка открытия файла результатов";
exit (0);
}
//----------------------------Вывод заголовка и шапки таблицы---------------------
fout << "\t\t\tРезультаты для e = " << e <<'\n'
<< "|-----|----------|----------|----------|----------|----------|----------|" <<'\n'
<< "| x | sin | S1 | S2 | S3 | S4 | S5 |" <<'\n'
<< "|-----|----------|----------|----------|----------|----------|----------|";
//-------------------------------Вывод значений----------------------------------
for (double x=-2; x<=2; x+=1)
{fout<< endl<<'|'<<setw (4) <<x<<setw (2) <<'|'<<setw (10) <<sin (x)<<'|'
<<setw (10) << S1(0, x, e) <<'|'<<setw (10) << S2(0, x, e) << '|' << setw (10)
<< S3(0, x, e, next) << '| << setw (10) << S4(0, x, e, next) << '|' < setw (10) <<
S5(0, x, e, next) << '|';
}
fout<<'\n'<<"|-----|----------|----------|----------|----------|----------|----------|";
fout.close ();
}
На рис.6 представлен файл с результатами.
Рисунок 6. Содержимое файла результатов l6.res
