Передача имён функций в качестве параметров



 

Цель лабораторной работы: изучение методов передачи имён функций в качестве параметров других функций; изучение методов нахождения значения определённых интегралов функций на заданном отрезке и с заданной точностью; совершенствование навыков процедурного программирования на языке C/C++ при решении задач с использованием рекурсивных функций.

 

Задание на программирование: используя технологию процедурного программирования реализовать заданный метод нахождения значения определённого интеграла произвольных функций на заданном отрезке и с заданной точностью и применить его для определения площадей областей на плоскости в соответствии с индивидуальным заданием.

 

Порядок выполнения работы:

 

1) Получить у преподавателя индивидуальное задание:

- метод нахождения значения определённого интеграла произвольной функции на заданном интервале интегрирования и с заданной точностью;

- задачу определения места нахождения точки с произвольно заданными координатами на координатной плоскости (вариант и формулировка этой задачи берётся из лабораторной работы №2).

2) Разработать математическую модель:

- привести уравнения линий, ограничивающих выделенные штриховкой области;

- описать условия попадания точки в каждую выделенную область;

- составить аналитические формулы определения площади каждой выделенной области;

- определить аналитический вид функций, графики которых совпадают с видом линий, ограничивающих выделенные штриховкой области;

- определить площадь каждой выделенной области с использованием значений определённых интегралов соответствующих функций на заданном интервале интегрирования и с заданной точностью.

3) Построить схему алгоритма решения задачи.

4) Составить программу на языке C/C++.

5) Входные данные должны вводиться с клавиатуры по запросу.

Выходные данные (сообщения) должны выводиться на экран в развернутой форме.

6) Использовать стандартные потоковые объекты ввода/вывода cin и cout.

7) Проверить и продемонстрировать преподавателю работу программы на полном наборе тестов.

8) Оформить отчет о лабораторной работе в составе: постановка задачи, математическая модель, схема алгоритма решения, текст программы, контрольные примеры.

 

Варианты индивидуальных заданий

 

Методы определения значения определённого интеграла

1.Метод левых прямоугольников.

2.Метод правых прямоугольников.

3.Метод прямоугольных трапеций.

4.Метод криволинейных трапеций.

Виды областей на координатной плоскости

См. варианты заданий для лабораторной работы №2

 

Пример разработки математической модели решения задачи для варианта задания вида:

 

Математическая модель

- условие 1 (принадлежность области М1):

    (x-1)2 + y2 > 1           {вне правой окружности}

    x < 2                         {левее линии x = 2}

    x > 1                         {правее линии x = 1}

    y > 0                         {выше линии y = 0}

    y < 2                         {ниже линии y = 2}

Аналитическое выражение определения площади области М1:

площадь прямоугольника (2 * 1) – площадь четверти круга (πr2 / 4) = 2 – π / 4≈1.2146

Аналитический вид функций, подлежащих интегрированию:

          {верхняя полуокружность правой окружности}

    интервал интегрирования [1, 2]

    y = 2                         {линия y = 2}

    интервал интегрирования [1, 2]

 

- условие 2 (принадлежность области М2):

    (x + 1)2 + y2 > 1        {вне левой окружности}

    x > -2                        {правее линии x = -2}

    y < 1                         {ниже линии y = 1}

    x < -1                        {левее линии x = -1}

    y > 0                         {выше оси x }

Аналитическое выражение определения площади области М2:

площадь квадрата (1 * 1) – площадь четверти круга (πr2 / 4) = 1 – π / 4 ≈0.2146

 

Аналитический вид функций, подлежащих интегрированию:

        

             {верхняя полуокружность левой окружности}

    интервал интегрирования [-2, -1]

    y = 1                         {линия y = 1}

    интервал интегрирования [-2, -1]

 

- условие 3 (принадлежность области М3):

    (x + 1)2 + y2 < 1        {внутри левой окружности}

    x2 + y2 < 1                 {внутри центральной окружности}

    y > 0                         {выше оси x }

 

Аналитическое выражение определения площади области М3:

площадь сектора 1200 (πr2 / 3) – площадь треугольника (  / 2 * 0.5) =

 π / 3 –  / 2 *0.5 = π / 3 –  / 4 =0.6142

 

Аналитический вид функций, подлежащих интегрированию:

        

             {верхняя полуокружность левой окружности}

    интервал интегрирования [-0.5, 0]

        

                  {верхняя полуокружность центральной окружности}

    интервал интегрирования [-1, -0.5]

 

- условие 4 (принадлежность области М4):

    x2 + y2 > 1                 {вне центральной окружности}

    (x – 1)2 + y2 < 1        {внутри правой окружности}

    x2 + (y + 1)2 > 1        {вне нижней окружности}

Аналитическое выражение определения площади области М4:

площадь квадрата (1 * 1) - четверть площади круга (πr2 / 4) – 2*(площадь прямоугольника (1 * (1 -  /2)) – площадь сектора 600 (πr2 / 6) + площадь треугольника (  / 2 * 0.5)) = 1 - π / 4 – 2 * (1 -  / 4 - π / 6) =  / 2 + π / 3 - π / 4 – 1 ≈ 0.1278

 

Аналитический вид функций, подлежащих интегрированию:

       {нижняя полуокружность правой окружности}

              интервал интегрирования [0.5, 1]

        

                {нижняя полуокружность центральной окружности}

    интервал интегрирования [0.5,  / 2]

        

            {верхняя полуокружность нижней окружности}

    интервал интегрирования [  / 2, 1]

 

- условие 5 (принадлежность области М5):

    x2 + (y+1)2 > 1          {вне нижней окружности}

    y > -2                        {выше линии y = -2}

    y < -1                        {ниже линии y = -1}

    x > -1                        {правее линии x = -1}

    x < 0                         {левее оси y}

Аналитическое выражение определения площади области М5:

площадь квадрата (1 * 1) – площадь четверти круга (πr2 / 4) = 1 – π / 4 ≈ 0.2146

 

Аналитический вид функций, подлежащих интегрированию:

        

         {нижняя полуокружность нижней окружности}

    интервал интегрирования [-1, 0]

    y = -2                        {линия y = -2}

    интервал интегрирования [-1, 0]

 

Текст программы

 

//Определение области на плоскости, в которую попадает точка,

//и площади этой области аналитическим и программным способом

//методом криволинейных трапеций (средних прямоугольников).

//Рекурсия. Передача имен функций в качестве параметров.

#include<iostream.h>

#include<math.h>

#include<locale.h>

//using namespace std ;

 

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) ;

double fun10(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(y > 0 && y < 2 && x > 1 && x < 2 && (x – 1) * (x – 1) + y * y >1)

 {cout << "Точка в области M1. " << endl ;

i = 1 ;

 }

 else if(x > -2 && y < 1 && x < -1 && y > 0 &&

(x + 1) * (x + 1) + y * y > 1 )

{cout << "Точка в области М2. " << endl ;

  i = 2 ;

}

else if((x+1) * (x+1) + y * y < 1 && x * x + y * y < 1 && y > 0)

{cout << "Точка в области М3. " << endl ;

  i = 3 ;

}

else if(x * x + y * y > 1 && (x - 1) * (x - 1) + y * y < 1 &&

       x * x + (y + 1) * (y + 1) < 1)

       {cout << "Точка в области М4. " << endl ;

       i = 4 ;

       }

       else if(y < -1 && y > -2 && x < 0 && x > -1 &&

             x * x + (y + 1) * (y + 1) > 1)

       {cout << "Точка в области М5. " << endl ;

       i = 5 ;

       }

       else cout << "Точка вне выделенных областей";

 cout.precision(4) ;    //число знаков после дес. точки

 switch(i)

  {case 1: cout << "Formula: S1 = " << (s1 = 2 - M_PI / 4) << endl ;

cout << "Integral:S1 = " << (s1 = integral(1, 2, shag, eps, fun4, s)

       - integral(1, 2, shag, eps, fun2, s)) ;

break ;

case 2: cout << "Formula: S2 = " << (s2 = 1 - M_PI / 4) << endl ;

cout << "Integral:S2 = " << (s2 = integral(-2, -1, shag, eps, fun7, s)

       - integral(-2, -1, shag, eps, fun3, s)) ;

break ;

case 3: cout << "Formula: S3 = " << (s3 = M_PI / 3 - sqrt(3) / 4) << endl ;

cout << "Integral:S3 = " << (s3 = integral(-1, -.5, shag, eps, fun1, s)

       + integral(-.5, 0, shag, eps, fun3, s)) ;

break ;

case 4: cout << "Formula: S4 = " <<(s4 = sqrt(3)/2+M_PI/3-M_PI/4-1) << endl ;

cout << "Integral:S4 = " <<(s4 = fabs(integral(.5,1,shag,eps,fun10, s))

       - fabs(integral(.5, sqrt(3) / 2, shag, eps, fun9, s))

       - fabs(integral(sqrt(3) / 2, 1, shag, eps, fun6, s))) ;

break ;

case 5: cout << "Formula: S5 = " << (s5 = 1 - M_PI / 4) << endl ;

cout << "Integral:S5 = " << (s5 = fabs(integral(-1,0,shag,eps,fun8, s))

       - fabs(integral(-1, 0, shag, eps, fun5, s))) ;

}

 return 0 ;

}

 

//нахождение определенного интеграла методом трапеции

double integral(double a, double b, double h, double eps, Tfun fun, double s1)

{double x, s = 0 ;

 int n, i ;

 n = (b - a) / h ;

 for (i = 0; i < n; i++)

 {x = a + i * h + h / 2 ;

s += fun(x) ;

 }

 s *= h ;

 if (fabs(s - s1) > eps)

 s = integral(a, b, h / 2, eps, fun, s) ;

 return s ;

}

 

 

//описание вида функции №1: x^2+y^2=1 (верхняя полуокружность)

double fun1(double x)

{return(sqrt(1 - x * x)) ;

}

 

//описание вида функции №2: (x-1)^2+y^2=1 (верхняя полуокружность)

double fun2(double x)

{return(sqrt(2 * x - x * x)) ;

}

 

//описание вида функции №3: (x+1)^2+y^2=1 (верхняя полуокружность)

double fun3(double x)

{return(sqrt(-2 * x - x * x)) ;

}

 

//описание вида функции №4: y=2

double fun4(double x)

{return 2 ;

}

//описание вида функции №5: x^2+(y+1)^2=1 (нижняя полуокружность)

double fun5(double x)

{return(-1 - sqrt(1 - x * x)) ;

}

 

//описание вида функции №5: x^2+(y+1)^2=1 (верхняя полуокружность)

double fun6(double x)

{return(sqrt(1 - x * x) - 1) ;

}

 

//описание вида функции №7: y=1

double fun7(double x)

{return 1 ;

}

 

 

//описание вида функции №8: y=-2

double fun8(double x)

{return -2 ;

}

 

//описание вида функции №1: x^2+y^2=1 (нижняя полуокружность)

double fun9(double x)

{return(-sqrt(1 - x * x)) ;

}

 

//описание вида функции №2: (x-1)^2+y^2=1 (нижняя полуокружность)

double fun10(double x)

{return(-sqrt(2 * x - x * x)) ;

}

 


Лабораторная работа №12

Строки и текстовые файлы

 

Цель лабораторной работы: изучение структурной организации, способов доступа к элементам и других особенностей текстовых файлов; изучение стандартных средств языка C/C++ для работы со строками и текстовыми файлами; совершенствование навыков процедурного программирования на языке C/C++ при решении задач редактирования текстовых файлов.

 

Задание на программирование: используя технологию процедурного программирования разработать программу обработки текстовых файлов с числом строк не менее пяти, каждая из которых содержит не более 80 символов, в соответствии с индивидуальным заданием.

 

Порядок выполнения работы:

 

1) Получить у преподавателя индивидуальное задание на обработку строк текстового файла.

2) Построить схему алгоритма решения задачи с использованием функций обработки строки, функции создания, просмотра и редактирования текстового файла.

3) Составить спецификации функций.

4) Составить программу на языке C/C++.

5) Проверить и продемонстрировать преподавателю работу программы на полном наборе тестов. Обеспечить одновременный показ на экране исходного и отредактированного файлов.

8) Оформить отчет о лабораторной работе в составе: постановка задачи, математическая модель, схема алгоритма решения, спецификации функций, текст программы, контрольные примеры.

 


Дата добавления: 2018-04-05; просмотров: 1447; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!