русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Float root(указатель_на_функцию, float a, float b, float eps)


Дата добавления: 2013-12-23; просмотров: 1295; Нарушение авторских прав


Int ostatok(int a, int b)

Int delenie(int a, int b)

Int umnoshenie(int a, int b)

Return a - b;

Int vychitanie(int a, int b)

Int sloshenie(int a, int b)

Return 0;

Int x, y, z, nom;

Int main()

Int ostatok(int a, int b);

Int delenie(int a, int b);

Int umnoshenie(int a, int b);

Int vychitanie(int a, int b);

Int sloshenie(int a, int b);

7 6 4 2 1 3 5

R = *f_ptr(a, b);

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

R = *f_ptr;

При этом элементам массива r будут присвоены значения соответствующих элементов массива s.

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

float func(int x, int y); // объявление функции func,

// возвращающей вещественное значение

float (*f_ptr)(); // описание указателя f_ptr

// на любую функцию, возвращающую

// вещественное значение

f_ptr = func; // в указателе – адрес функции func

r = func(a,b); // вызов функции func по ееимени

r = (*f_ptr)(a, b); // вызов функции func по ееадресу

В последнем случае переменной r будет присвоено значение функции, имеющей адрес f_ptr.

При работе с указателями на функции имена этих указателей обязательно заключаются в скобки. Описание:

float *f_ptr();

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



Аналогично:

Переменной r будет присвоено значение, находящееся по адресу, возвращаемому (вычисляемому) функцией f_ptr.

При работе с указателями на функции программисты часто пользуются сложными декларациями (описаниями), которые включают в себя имена, звездочки, круглые и квадратные скобки:

int func (int a, int b); // функция func, возвращающая
// значение целого типа

int (*i_ptr)(); // указатель i_ptr на функцию,
// возвращающую значение целого
// типа

 

int *i_ptr(); // функция i_ptr, возвращающая
// адрес переменной целого типа

int *i_ptr[5]; // массив указателей i_ptr
//
на данные целого типа

int (*i_ptr)[5]; // указатель i_ptr на массив
//
значений целого типа

Для того, чтобы правильно читать сложные декларации, необходимо помнить, что наивысший приоритет имеют круглые скобки, затем – квадратные скобки, и в конце – знак *. Чтение описаний осуществляется по правилу “изнутри наружу”: начать чтение необходимо с имени и проверить, есть ли справа от него открывающая круглая (тогда это функция) или квадратная (тогда это массив) скобка. Затем следует проверить, есть ли слева от имени звездочка – тогда это указатель, указатель на функцию или массив указателей. Потом снова проверяется наличие открывающей скобки справа, и так далее. Если на какой-то стадии чтения справа встретится закрывающая круглая скобка, используемая для изменения порядка интерпретации декларации, то сначала необходимо полностью провести интерпретацию внутри данной пары круглых скобок, а затем продолжать ее справа от закрывающей круглой скобки:

char * ( * ( *c_ptr ) () ) [20];

1c_ptr это

2 – указатель на

3 – функцию, возвращающую

4 – указатель на

5 – массив из 20 элементов, которые являются

6 – указателями на

7 – значения типа char.

Примеры:

int *vect[5]; массив vect указателей на значения целого типа: признак типа массива имеет более высокий приоритет, чем признак типа указателя,

int (*vect)[5]; указатель vect на массив значений целого типа,

float *vect(); функция vect, возвращающая указатель на значения вещественного типа: признак типа функции имеет более высокий приоритет, чем признак типа указателя,

float (*vect)(); указатель vect на функцию, возвращающую значение вещественного типа,

double (*vect())[5]; функция vect, возвращающая указатель на массив из пяти элементов типа double.

Массивы указателей на функции удобно использовать при разработке всевозможных меню или программ, управление которыми осуществляется с помощью меню. Для этого действия, предлагаемые на выбор пользователю, оформляются в виде функций, адреса которых помещаются в массив указателей на функции. Пользователь выбирает из меню нужный ему пункт (в простейшем случае вводом номера выбранного пункта), и по этому номеру, как по индексу, из массива выбирается соответствующий адрес функции. Обращение к функции по этому адресу обеспечивает выполнение требуемых действий:

 

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

{

int (*i_func[5])(); // вектор указателей на функции,
//
возвращающие целые значения

i_func[0]=sloshenie; // заполнение вектора адресамифункций

i_func[1]=vychitanie; // адрес функции – ее имя

i_func[2]=umnoshenie;

i_func[3]=delenie;

i_func[4]=ostatok;

printf("\n first argument =");// ввод аргументовфункций

scanf("%d", &x);

printf("\n second argument =");

scanf("%d", &y);

printf("\n");

puts("|---------------|"); // предлагаемое меню

puts("| Operazii |");

puts("|---------------|");

puts("| 1. sloshenie |");

puts("| 2. vychitanie |");

puts("| 3. umnoshenie |");

puts("| 4. delenie |");

puts("| 5. ostatok |");

puts("|---------------|");

printf("\n vyberite nomer operacii:");

scanf("%d", &nom);

if ((nom<1) || (nom>5)) // защита ввода

{

puts("Error!");

return -1; // аварийное завершениепрограммы

}

z=(*i_func[nom-1])(x,y); // обращение к функции поадресу

printf("\n rezultat =%d", z);

}

{

return a + b;

}

{

}

{

return a * b;

}

{

return a / b;

}

{

return a % b;

}

Работа программы:

first argument =5

second argument =2

|---------------|

| Operazii |

|---------------|

| 1. sloshenie |

| 2. vychitanie |

| 3. umnoshenie |

| 4. delenie |

| 5. ostatok |

|---------------|

vyberite nomer operacii:5

rezultat =1

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

Рассмотрим задачу вычисления корня функции f(x)на заданном интервале [a, b] с заданной точностью eps. Численный метод (метод деления интервала пополам) оформляется в виде функции со следующим заголовком:

Введем указатель на функцию, для которой нужно определить корень:

float (*point_func)();

Определим корень для функции x2 – 1 . Для этого опишем ее в следующем виде: float test_func(float x)

{

return x*x–1.0;

}

Функция, реализующая выбранный численный метод, будет иметь вид:



<== предыдущая лекция | следующая лекция ==>
Указатели и массивы | Указатели и строки


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.006 сек.