Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_и_Пр_Бизнес_лекции.doc
Скачиваний:
85
Добавлен:
10.05.2015
Размер:
1.21 Mб
Скачать

8.9. Передача в функцию другой функции

Существует множество алгоритмов, особенно в вычислительной математике, результат которых зависит не только от значений входных данных, но и от вида функции, которую использует алгоритм. Например, в алгоритмах вычисления определенных интегралов или производных алгоритм не зависит от подынтегральной или дифференцируемой функции, а результат зависит от вида этих функции. Таким образом, функцию можно рассматривать как данное, от которого зависит результат другой функции. В С++ для передачи функции в качестве аргумента другой функции используется адрес функции (адрес кода функции). В языке С++ имя функции является ее адресом. Например, если в программе определена функция:

float f1(float x)

{ return x*sin(x); }

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

Синтаксис объявления указателя на функцию:

тип результата функции (*имя указателя)

([список типов формальных параметров функции])

или

тип результата функции (*имя указателя)

([список формальных параметров функции])

Пример объявления указателя f на функцию с одним вещественным параметром, которая возвращает вещественное число:

float(*f) (float x);

Пример прототипа функции вычисления определенного интеграла:

float integ (float a, float b, int n, float (*f)(float x));

В этом объявлении: integ –имя функции вычисления значения интеграла, a и b – пределы интегрирования, n –количество разбиений отрезка интегрирования [a,b], f – указатель на функцию с одним вещественным параметром, которая возвращает значение подынтегральной функции в точке х. f - указатель, через который передается в функцию адрес конкретной подынтегральной функции.

Пример программы вычисления двух интегралов

и методом левых прямоугольников для заданного количества разбиений отрезка интегрирования. Для приближенного вычисления интеграла с пределами интегрирования a и b в программе используется формула левых прямоугольников:

,

где h=(b-a)/n.

#include <iostream.h>

#include <math.h>

#include <conio.h>

float f1(float x); //подынтегральная функция 1 интеграла

float f2(float x); //подынтегральная функция 2 интеграла

//Вычисление интеграла методом левых прямоугольников

float integ(float a,float b,int n, float (*f)(float x));

void main()

{

int n; //количество разбиений

cout<<"n? "; cin>>n;

cout<<"integ1="<<integ(0,M_PI_2,n,f1)<<endl;

cout<<"integ2="<<integ(10.5,1,n,f1);

getch();

}

float integ(float a, float b, int n, float (*f)(float x))

{

float h, x; //длина элементарного отрезка и левая граница отрезка

float s; //сумма

int i; //номер отрезка

h=(b-a)/n;

s=0;

x=a;

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

{

s=s+f(x);

x=x+h;

}

return s*h;

}

float f1(float x)

{

return x*x*cos(x*x);

}

float f1(float x)

{

return log(sqrt(1/x));

}

9. Работа с файлами

Переменные и массивы предназначены для временного хранения данных. Для постоянного хранения данных используются файлы. Файл имеет имя и место хранения. Например, файл с именем a.txt может храниться на диске с в папке user. В этом случае c:\user\a.txt – это полное имя файла.

С файлами можно выполнять операции:

  • чтение;

  • создание;

  • запись в конец, в начало, в середину;

  • исключение части данных;

  • поиск;

  • вывод;

  • изменение данных;

  • копирование;

  • переименование;

  • удаление;

  • другие операции.

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