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

3 11ЛР инфа

.docx
Скачиваний:
19
Добавлен:
16.04.2021
Размер:
1.26 Mб
Скачать

Лабораторная работа №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)) ;

}

Скриншот контрольного примера выполнения программы

9

Соседние файлы в предмете Основы программирования