Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Си.doc
Скачиваний:
31
Добавлен:
04.06.2015
Размер:
2.75 Mб
Скачать

Int sloshenie(int a, int b);

int vychitanie(int a, int b);

int umnoshenie(int a, int b);

int delenie(int a, int b);

int ostatok(int a, int b);

int main()

{

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

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

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

i_func[2]=umnoshenie;

i_func[3]=delenie;

i_func[4]=ostatok;

int x, y, z, nom;

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

}

Int sloshenie(int a, int b)

{

return a + b;

}

int vychitanie(int a, int b)

{

return a - b;

}

int umnoshenie(int a, int b)

{

return a * b;

}

int delenie(int a, int b)

{

return a / b;

}

int ostatok(int a, int 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 root(указатель_на_функцию, float a, float b, float eps)

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

float (*point_func)();

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

{

return x*x–1.0;

}

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

float root(point_func f, float a, float b, float eps)

{

float x, y, c, fx, fy, fc;

fx = (*f)(x);

fy = (*f)(y);

if (fx * fy > 0.0)

{

puts(“Неверный интервал!”);

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

}

do

{

c = (yx)/2.0; // центр интервала

fc = (*f)(c); // значение функции в нем

if (fc * fx > 0.0)

{

x = c;

fx = fc;

}

else

{

y = c;

fy = fc;

}

}

while ((fc!=0.0) && (fabs(y-x) > eps));

return c;

}

Полный вид программы:

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <math.h>

typedef float (*point_func)(float); // новый тип данных - // указатель на функцию

// вещественного типа

float test_func(float x);

float root(point_func f, float a, float b, float eps);

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