Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual_C_console.pdf
Скачиваний:
34
Добавлен:
16.05.2015
Размер:
954.14 Кб
Скачать

115

void _tmain()

{

int i;

cout << "Введите цифру\n"; cin >> i;

if (i >= 0 && i <= 9)

cout << "\nВы ввели цифру " << number[i]; else cout << "\nЭто не цифра";

_getch();

}

Указатели на функции

Указатель на функцию это адрес первой инструкции функции в машинных кодах, с которой должно начинаться ее выполнение. Имя функции может появиться в списке фактических параметров при вызове функции. Возможны два варианта:

Имя функции в качестве фактического параметра применяется для ее вызова, при этом в качестве параметра используется вычисленное этой функцией значение.

В качестве фактического параметра используется указатель на функцию, которая после вызова ничего не возвращает.

Для передачи указателя на функцию в списке фактических параметров достаточно записать в этом списке ее имя без круглых скобок. Пусть имеется функция MySub, в списке параметров которой появляется некоторая функция double MyFunc (). Тогда запись

MySub (MyFunc () );

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

MySub (MyFunc);

Обозначает, что в функцию должен быть передан указатель на функцию MyFunc.

Оформление указателя на функцию в списке формальных параметров будет приведено в примерах ниже.

116

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

Для использования указателя на функцию в списке формальных параметров его надо объявить (отдельно или в прототипе функции). Ниже приведена общая схема использования указателей на функции:

1. Указатель на функцию описывается следующим образом: <тип>(*<имя указателя>) (<список фактических параметров>);

Напpимеp,

double (*ptf) (double*, int, char*);

Описание указателя на функцию должно содержать тип возвращаемого значения и сигнатуру функции (имя указателя и перечень типов параметров)

2.В функции общего решения задачи в списке аргументов вызова этой функции должен быть записан указатель на функцию. Например,

void exp (int x, int y, double (*ptf) (double a[ ], int n, char [ ]);

Имя указателя на функцию действует только внутри программы общего решения и никак не связано с конкретными именами программ, которые будут заданы при вызове этой программы. Указатель на функцию является адресом этой функции в памяти.

3.В функции общего решения указатель на функцию отличается от обычной функции только формой записи. Если функция не воз-

вращает значения через свое имя, то форма вызова имеет вид

(*<имя>)(<список фактических параметров>);

Например,

(*funcptr)(x, n - 2, 'Z');

117

где funcptr - указатель на функцию, а x, n - 2 и 'Z' фактические параметры.

Примечание: В языке С++ допускается и такая форма: funcptr (x, n - 2, 'Z');

4.При использовании указателя на функцию в арифметическом выражении форма вызова принимает вид:

<имя_переменной> = (*<имя>) (<список фактических параметров>);

Например,

y = (*val)(1.5, x + 4, a[i]);

5.При вызове функции общего решения на месте аргумента, соответствующего указателю на функцию, записывают имя той функции, которая используется именно при этом вызове.

6.Функции, на которые ссылается указатель на функции, оформляются, как обычно.

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

Восновной программе после ввода матрицы запрашивается вид обработки. После этого вызывается функция matrix, у которой в списке параметров на месте для указателя на функцию записано имя той функции, которая соответствует введенному числу. Поскольку в функции min и sum передаются адреса соответствующих строк матрицы, то они оформлены для обработки одномерных массивов.

// Программа для демонстрации указателей на функции

#include "stdafx.h" #include <conio.h> #include <iostream> using namespace std;

118

#define ROW 2 #define COL 3

void matrix (double[][COL], double[], double (*ptf) (double *x)); double sum (double*), min(double*);

void _tmain()

{

double a[ROW][COL], b[ROW]; int k, i, j;

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

{

cout <<"Введите строку матрицы " << (i + 1) << endl; for (j = 0; j < COL; j++)

cin >> a[i][j];

}

cout << "Для вычисления минимума введите 0\n"

<< "Для вычисления суммы любое другое число\n"; cin >> k;

if (k == 0)

{

matrix (a, b, min);

cout <<"\nМинимальные значения по строкам" <<

endl;

}

else

{

matrix (a, b, sum);

cout <<"\nСуммы по строкам" << endl;

}

for (i = 0; i < ROW; i++) cout << b[i] << " "; _getch ();

}

119

// Функция обработки строк матрицы

void matrix (double a[ ][COL], double b[ ], double (*ptf) (double *a))

{

for (int i = 0; i < ROW; i++) b[i] = (*ptf) (a[i]);

}

//Функция нахождения минимума одномерного массива double min (double x[ ])

{

double m; m = x[0];

for (int i = 0; i < COL; i++) if(m > x[i]) m = x[i];

return m;

}

//Функция вычисления суммы элементов одномерного массива double sum (double x[ ])

{

double s = 0;

for (int i = 0; i < COL; i++) s += x[i];

return s;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]