22943

ФУНКЦІЇ ЯК ТИП ДАНИХ

Лекция

Информатика, кибернетика и программирование

Кожен з таких покажчиків має тип який відповідає типам параметрів та типу значення функції. З ними можна працювати як зі звичайними даними: присвоювати організовувати у вигляді масивів передавати у якості параметрів повертати як значення функції і т. ПОКАЖЧИКИ ФУНКЦІЙ ПОВИННІ БУТИ ЯВНО ОПИСАНІ В ПРОГРАМІ Імя та тип покажчика функції задаються її прототипом або описом.

Русский

2013-08-04

49 KB

0 чел.

ТЕМА: ФУНКЦІЇ ЯК ТИП ДАНИХ

Функції в програмах МП високого  подаються  у вигляді покажчиків на них. Кожен з таких покажчиків має тип, який відповідає типам параметрів та типу  значення функції. Покажчики функцій можуть бути константами та змінними. З ними можна працювати як зі звичайними даними: присвоювати, організовувати  у вигляді масивів, передавати у якості параметрів, повертати як значення функції  і т.п.

 ПОКАЖЧИКИ ФУНКЦІЙ  ПОВИННІ  БУТИ ЯВНО ОПИСАНІ В ПРОГРАМІ !!!

Імя та тип покажчика функції задаються її прототипом або описом.

ПРОТОТИП (ОПИС) ФУНКЦІЇ ПОВИННІ ПЕРЕДУВАТИ ПЕРШОМУ ВИКЛИКУ ФУНКЦІЇ В ПРОГРАМІ !!!

В прототипі  константного покажчика функції фіксується  його ім’я, якому відповідає певна фіксованого адреса машинного коду, що реалізує  функцію. Дана адреса не може бути змінена в подальшому в програмі, оскільки рівень доступу до неї, як і до будь-якої іншої константи,   виключно  для читання..  

Нпр.,

1) прототип стандартної функції sin(x)  має вигляд:

                             double sin(double);

Ім’я   покажчика – sin. Його тип  -.

2) прототип стандартної функції gets:

                            char *fgets(char *, int,  FILE *);

Ім’я   покажчика – fgets. Його тип  - 

Прототипи стандартних функцій не потрібно задавати в програмі, вони  знаходяться в бібліотеках загаловочних файлів з розширенням  .h.  (Перший прототип знаходиться в бібліотеці <math.h>,  другий в - <stdio.h>. ) Необхідно просто включити ці файли за допомогою директиви  #include!!!

Загальний вигляд прототипу константного покажчика функції:

<тип_значення>  < iм’я_конст_покажчика_функції>(<параметр>{,<параметр>}) ;

Нпр.,  void sort(double *x, int n);  /* функція не повертає значення */

           long f(void);  /* константний покажчик функції з порожнім списком параметрів, стандарт ANSI */

           long g();  /* функція з порожнім списком параметрів */

Загальний вигляд прототипу покажчика функції:

<тип_значення>  < (*iм’я_покажчика_функції>) (<параметр>{,<параметр>}) ;

Нпр.,   long (*f1)(void);  /* прототип цілої функції  f1  без параметрів */

           long (*f2)(void)=f;  /* прототип  цілої функції  f2 без параметрів p з                                       ініціалізацією */

Виклик функції:

<виклик функції>::=< iм’я_конст_покажчика_функції>(<параметр>{,<параметр>}) || < (*iм’я_покажчика_функції>)(<параметр>{,<параметр>})

Нпр.,

           printf(“%f”, sin(x+y)); /* виклик стандартних функцій printf, sin  */

          f();                                    /* виклик  функції  f */

          (*f2)();                               /* виклик  функції за покажчиком на неї   f2 */

         f2();                        /* прямий виклик  функції за покажчиком на неї   f2 */

Покажчики функцій як параметри функцій

Покажчики функцій можуть використовуватись як параметри інших функцій.

Прикл. Обчислити наближене значення інтеграла

/* прототип функції для обчислення інтеграла методом прямокутників */

double integral ( double (*f)(double), double a, double b, int n);

 

#include <math.h>

#include <stdio.h>

/* опис підінтегральної функції  */

double f1(double x)

{return exp(-x*x);}

main(void)

{ printf(“\n integral=%f”, integral(f1,-1.0,1.0,100));

}

double integral ( double (*f)(double), double a, double b, int n)

  { int i;

     double h,s;

     for ( i=0, h=(b-a)/n, s=0; i<n; i++)  s+=f(a+i*h);

      return s*h;

 }

Покажчики функцій як результати функцій

Прикл. Організація меню. Нехай в програмі потрібно організувати на вибір виконання кількох варіантів дій, кожна з яких представлена певною функцією і вибирається на підставі аналізу вхідної інформації. Подібне меню можна оформити у вигляді функції з порожнім списком параметрів, яка аналізуючи отриману з вхідного потоку інформацію, повертає як результат адресу функції для відповідного варіанту дій. Нехай маємо 2 варіанти дій, які задаються функціями f1 та f2 з прототипами

int f1(void);

int f2(void);

Функція для реалізації меню має прототип:

int (*menu(void))(void);

та опис:

#include <stdio.h>

int f1(void)

{return 1;

}

int f2(void)

{return 2;

}

int (*menu(void))(void)

{ int choice;

  printf(“Pick the menu item (1 or 2), pls:”);

  scanf(“%d”,&choice);

   switch (choice)

   {  case 1: return f1;

      case 2:  return f2;

       default: return NULL;

}

void main(void)

{ int (*r) (void); /* опис покажчика на цілі функції з порожнім списком параметрів*/

 while (1)

  { r=menu();/* виклик меню  */

     if (!r) {   printf(“ \n The End”);  return;}

     printf(“\t%d”, r());

}

Масив покажчиків на функції.

Пркл.,

 /*Ініціалізований масив покажчиків на функції */

     int (*menu_items[])(void)={f1,f2,…,fn}; 

Функції зі змінною кількістю параметрів:

<тип> <імя_функції> (<список_явних_параметрів>, …)

Кількість і тип явних параметрів фіксовані і відомі до компіляції! Механізми  для визначення кількості неявних параметрів:

  1.  є стопер ( нпр, явно передається їх  кількість (як для динамічного масиву) або відоме унікальне значення останнього параметру);
  2.  передається фактична кількість параметрів (напркл., в printf (….)).

Визначення типу неявних параметрів і перехід від одного до іншого параметру  здійснюється за допомогою покажчиків.

Прикл. 1)  /* знаходження суми своїх параметрів */

 long suma(int n,…)

{ int *p=&n; /* адреса списку  параметрів */

  long total=0;

  for (; k;k--) total+=*(++p);

 return total;

}

main ()

{printf(“\n %ld”, suma(2,4,6));

}

  1.  /* знаходження добутку своїх параметрів, список закінчується 0.0 */

     

 double prod (double arg,…)

{ double prod1=1.0;

double *p=&arg; /* адреса списку  параметрів */

  long total=0;

if (*p==0) return 0.0;

for (; *p; p++)

  prod1*=*p;

 return prod1;

}

main ()

{printf(“\n %f”, prod(1.1, 2.0, 3.3, 5.1,0.0));

}

 Є спеціальні макроси для роботи з функціями зі змінною кількістю параметрів – <stdarg.h>.


 

А также другие работы, которые могут Вас заинтересовать

86020. Эффективность производства и реализации производства льнопродукции 686 KB
  Теоритические основы эффективности производства и реализации льнопродукции Понятие сущность и показатели эффективности производства Основные показатели характеризующие эффективность производства льнопродукции Основные направления повышения производства и реализации льнопродукции...
86021. ОТБОР В ФУТБОЛЬНЫХ КЛУБАХ ПЕРВОЙ И ПРЕМЬЕР ЛИГИ 878 KB
  Проблема спортивного отбора является одной из основных проблем физической культуры и спорта. Развитие теории спортивного отбора влияет на уровень спортивных достижений и на развитие спортивной науки в целом.
86022. Расчет налогового бремени предприятия 230.5 KB
  В настоящее время, тема распределения налогового бремени в обществе особенно актуальна, так как играет особую роль в построении и совершенствовании налоговой системы любого государства – как с развитой экономикой, так и находящегося в переходном периоде.
86023. Ефективність митно-тарифного регулювання зовнішньоекономічної діяльності 1.17 MB
  Зовнішня торгівля є одним із головних стабілізуючих факторів національної економіки. Протягом останніх років, внаслідок зростання експорту, його питома вага у ВВП збільшилася від 17,9 % до понад 40 %, що забезпечило зростання кількості робочих місць і значною мірою сприяло виведенню економіки України з кризи.
86024. Государственное и муниципальное управление на примере оптимизации системы образования 382.5 KB
  Образование в Российской Федерации — единый целенаправленный процесс воспитания и обучения, являющийся общественно значимым благом и осуществляемый в интересах человека, семьи, общества и государства, а также совокупность приобретаемых знаний, умений, навыков, ценностных установок...
86025. Этика государственной и муниципальной службы в Латвии 152 KB
  Профессиональная этика муниципального служащего помогает конкретизировать, реализовать моральные ценности в условиях, подчас весьма сложных, необычных. Профессиональная этика не формирует новые принципы и понятия морального сознания, она как бы «приспосабливает» уже известные принципы...
86026. Проект автоматизированной системы обработки информации компании-оператора по предоставлению услуг IP-телефонии 1.69 MB
  В дипломном проекте спроектирована автоматизированная система обработки информации компании-оператора по предоставлению услуг IP-телефонии, реализована подсистема аутентификации пользователя. В состав системы входят несколько компонентов: виртуальная АТС (ВАТС), центр обработки вызовов...
86027. ПУТИ СОВЕРШЕНСТВОВАНИЯ ФИНАНСОВОГО МЕХАНИЗМА ГОСУДАРСТВЕННОГО РЕГУЛИРОВАНИЯ МАЛЫХ ИННОВАЦИОННЫХ ПРЕДПРИЯТИЙ НА ТЕРРИТОРИИ РЕСПУБЛИКИ ТАТАРСТАН 590 KB
  Большое внимание в данном документе уделяется малому инновационному бизнесу, который способен привлекать в инновационную сферу частный капитал, осуществлять трансфер научных разработок в жизнеспособные продукты и технологии, быстро реагировать на изменение потребностей рынка и в короткие...
86028. АДАПТАЦИИ ОРГАНИЗМА СПОРСМЕНА 65.02 KB
  Проблема адаптации к физическим нагрузкам, или педагогическим значениям «тренированности», с давних пор привлекала внимание исследователей и в настоящее время остается одной из актуальных проблем. Существо ее заключается в раскрытии механизмов, за счет которых нетренированный организм становится тренированным...