3 11ЛР инфа
.docxЛабораторная работа №11
Передача имён функций в качестве параметров
Цель лабораторной работы: изучение методов передачи имён функций в качестве параметров других функций; изучение методов нахождения значения определённых интегралов функций на заданном отрезке и с заданной точностью; совершенствование навыков процедурного программирования на языке C/C++ при решении задач с использованием рекурсивных функций.
Задание на программирование: используя технологию процедурного программирования реализовать заданный метод нахождения значения определённого интеграла произвольных функций на заданном отрезке и с заданной точностью и применить его для определения площадей областей на плоскости в соответствии с индивидуальным заданием.
Порядок выполнения работы:
1) Получить у преподавателя индивидуальное задание:
- метод нахождения значения определённого интеграла произвольной функции на заданном интервале интегрирования и с заданной точностью;
- задачу определения места нахождения точки с произвольно заданными координатами на координатной плоскости (вариант и формулировка этой задачи берётся из лабораторной работы №2).
2) Разработать математическую модель:
- привести уравнения линий, ограничивающих выделенные штриховкой области;
- описать условия попадания точки в каждую выделенную область;
- составить аналитические формулы определения площади каждой выделенной области;
- определить аналитический вид функций, графики которых совпадают с видом линий, ограничивающих выделенные штриховкой области;
- определить площадь каждой выделенной области с использованием значений определённых интегралов соответствующих функций на заданном интервале интегрирования и с заданной точностью.
3) Построить схему алгоритма решения задачи.
4) Составить программу на языке C/C++.
5) Входные данные должны вводиться с клавиатуры по запросу.
Выходные данные (сообщения) должны выводиться на экран в развернутой форме.
6) Использовать стандартные потоковые объекты ввода/вывода cin и cout.
7) Проверить и продемонстрировать преподавателю работу программы на полном наборе тестов.
8) Оформить отчет о лабораторной работе в составе: постановка задачи, математическая модель, схема алгоритма решения, текст программы, контрольные примеры.
Формулировка задания:
Найти площадь выделенных областей (вариант №2/23).
Метод правых прямоугольников.
Математическая модель (условия принадлежности точек выделенным областям)
- условие 1 (принадлежность области М1):
x < 0 {левее линии x = 0}
x2 + (y – 1)2 < 1 {внутри верхней окружности}
(x + 1)2 + y2 > 1 {вне левой окружности}
Площадь области М1:
площадь квадрата (1 * 1) = 1
Аналитический вид функций, подлежащих интегрированию:
{верхняя полуокружность левой окружности}
интервал интегрирования [-1, 0]
{верхняя полуокружность верхней окружности}
интервал интегрирования [-1, 0]
- условие 2 (принадлежность области М2):
(x – 1)2 + y 2 > 1 {вне правой окружности}
x < 2 {левее линии x = 2}
x > 1 {правее линии x = 1}
y > 0 {выше линии y = 0}
y < 2 {ниже линии y = 2}
Площадь области М2:
площадь прямоугольника (2 * 1) – площадь четверти круга (πr2 / 4) =
= 2 – π / 4 ≈ 1,215
Аналитический вид функций, подлежащих интегрированию:
{верхняя полуокружность правой окружности}
интервал интегрирования [1, 2]
y = 2 {линия y = 2}
интервал интегрирования [1, 2]
- условие 3 (принадлежность области М3):
(x + 1)2 + y2 > 1 {вне левой окружности}
x < -1 {левее линии x = -1}
x > -2 {правее линии x = -2}
y > 0 {выше линии y = 0}
y < 1 {ниже линии y = 1}
Площадь области М3:
площадь квадрата (1 * 1) – площадь четверти круга (πr2 / 4) =
= 1 – π / 4 ≈ 0,2146
Аналитический вид функций, подлежащих интегрированию:
{верхняя полуокружность левой окружности}
интервал интегрирования [-2, -1]
y = 1 {линия y = 1}
интервал интегрирования [-2, -1]
- условие 4 (принадлежность области М4):
(x – 1)2 + y2 < 1 {внутри правой окружности}
x2 + (y + 1)2 < 1 {внутри нижней окружности}
Площадь области М4:
площадь квадрата (1 * 1) – 2 * (площадь квадрата (1 * 1) – площадь четверти круга (πr2 / 4)) = 1 – 2 * (1 – π / 4) ≈ 0,5708
Аналитический вид функций, подлежащих интегрированию:
{верхняя полуокружность нижней окружности}
интервал интегрирования [0, 1]
{нижняя полуокружность правой окружности}
интервал интегрирования [0, 1]
- условие 5 (принадлежность области М5):
(x + 1)2 + y2 < 1 {внутри левой окружности}
x2 + y2 > 1 {вне центральной окружности}
x > -1 {правее линии x = -1}
y < 0 {ниже линии y = 0}
Площадь области М5:
площадь четверти круга (πr2 / 4) - (площадь сектора 1200 (πr2 / 3) – площадь треугольника ( / 2 * 0.5)) = π / 4 – (π / 3 – / 4) ≈ 0,1712
Аналитический вид функций, подлежащих интегрированию:
{нижняя полуокружность левой окружности}
интервал интегрирования [-1, -0,5]
{нижняя полуокружность центральной окружности}
интервал интегрирования [-1, -0,5]
Текст программы
#include <iostream>
using namespace std;
#define _USE_MATH_DEFINES
#include <math.h>
#include <locale.h>
const float P = 3.1415;
typedef double(*Tfun)(double) ;
double integral(double, double, double, double, Tfun, double) ;
double fun1(double x) ;
double fun2(double x) ;
double fun3(double x) ;
double fun4(double x) ;
double fun5(double x) ;
double fun6(double x) ;
double fun7(double x) ;
double fun8(double x) ;
double fun9(double x) ;
int main()
{
int i = 0 ; //номер области
float x, y, //координаты точки
s1, s2, s3, s4, s5 ; //площади областей
float eps = .00001, //точность вычисления
shag= .001, //начальный шаг вычисления
s ; //значение определённого интеграла
setlocale(LC_ALL,"Russian") ;
cout << '\n' << "Введите координаты точки: x,y " ;
cin >> x >> y ;
if(x<0 && x*x+(y-1)*(y-1)<1 && (x+1)*(x+1)+y*y>1)
{cout << "Точка в области M1. " << endl ;
i = 1 ;
}
else if(y>0 && y<2 && x>1 && x<2 && (x-1)*(x-1)+y*y>1)
{cout << "Точка в области М2. " << endl ;
i = 2 ;
}
else if(x>-2 && y<1 && x<-1 && y>0 && (x+1)*(x+1)+y*y>1)
{cout << "Точка в области М3. " << endl ;
i = 3 ;
}
else if((x-1)*(x-1)+y*y<1 && x*x+(y+1)*(y+1)<1)
{cout << "Точка в области М4. " << endl ;
i = 4 ;
}
else if(y<0 && x>-1 && (x+1)*(x+1)+y*y<1 && x*x+y*y>1)
{cout << "Точка в области М5. " << endl ;
i = 5 ;
}
else cout << "Точка вне выделенных областей";
cout.precision(4) ; //число знаков после дес. точки
switch(i)
{case 1: cout << "Формула: S1 = " << (s1 = 1) << endl ;
cout << "Интеграл: S1 = " << (s1 = integral(-1,0,shag,eps,fun5,s)-integral(-1,0,shag,eps,fun4,s)) ;
break ;
case 2: cout << "Формула: S2 = " << (s2 = 2-P/4) << endl ;
cout << "Интеграл: S2 = " << (s2 = integral(1,2,shag,eps,fun1,s)-integral(1,2,shag,eps,fun2,s)) ;
break ;
case 3: cout << "Формула: S3 = " << (s3 = 1-P/4) << endl ;
cout << "Интеграл: S3 = " << (s3 = integral(-2,-1,shag,eps,fun3,s)-integral(-2,-1,shag,eps,fun4,s)) ;
break ;
case 4: cout << "Формула: S4 = " <<(s4 = 1-2*(1-P/4)) << endl ;
cout << "Интеграл: S4 = " << (s4 = integral(0,1,shag,eps,fun6,s)-integral(0,1,shag,eps,fun7,s)) ;
break ;
case 5: cout << "Формула: S5 = " << (s5 = P/4-(P/3-sqrt(3)/4)) << endl ;
cout << "Интеграл: S5 = " << (s5 = integral(-1,-0.5,shag,eps,fun9,s)-integral(-1,-0.5,shag,eps,fun8,s)) ;
}
return 0 ;
}
//нахождение определенного интеграла методом правых прямоугольников
double integral(double a, double b, double h, double eps, Tfun fun, double s1)
{double x, s = 0 ;
int n, i ;
s=(fun(a)+fun(b))/2;
h=(b-a)/n;
for (int i=1; i<=n-1; i++)
{
s+=fun(a+i*h);
}
s=h*s;
if (fabs(s - s1) > eps)
s = integral(a, b, h / 2, eps, fun, s) ;
return s ;
}
//описание вида функции №1: y=2
double fun1(double x)
{return 2 ;
}
//описание вида функции №2: (x-1)^2+y^2=1 (верхняя полуокружность)
double fun2(double x)
{return(sqrt(2*x-x*x)) ;
}
//описание вида функции №3: y=1
double fun3(double x)
{return 1 ;
}
//описание вида функции №4: (x+1)^2+y^2=1 (верхняя полуокружность)
double fun4(double x)
{return(sqrt(-2*x-x*x)) ;
}
//описание вида функции №5: x^2+(y-1)^2=1 (верхняя полуокружность)
double fun5(double x)
{return(sqrt(1-x*x)+1) ;
}
//описание вида функции №6: x^2+(y+1)^2=1 (верхняя полуокружность)
double fun6(double x)
{return(sqrt(1-x*x)-1) ;
}
//описание вида функции №7: (x-1)^2+y^2=1 (нижняя полуокружность)
double fun7(double x)
{return(-sqrt(2*x-x*x)) ;
}
//описание вида функции №8: (x+1)^2+y^2=1 (нижняя полуокружность)
double fun8(double x)
{return(-sqrt(1-(x+1)*(x+1))) ;
}
//описание вида функции №9: x^2+y^2=1 (нижняя полуокружность)
double fun9(double x)
{return(-sqrt(1-x*x)) ;
}
Скриншот контрольного примера выполнения программы