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>.


 

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

12507. Настройка доступа к сети Интернет из локальной сети 7.1 MB
  Лабораторная работа №78 Настройка доступа к сети Интернет из локальной сети. Цель работы: Рассмотреть различные варианты подключения к сети Интернет локальной сети использую различные программные средства. Дано: Имеется локальная сеть Workstantion 1 – Workstantion 2 предст
12508. Тұрақты токта физикалық шамаларды өлшеу (өлшеу аспабымен танысу – мультиметрмен) 102.75 KB
  1 Лабораториялық жұмыс. Тұрақты токта физикалық шамаларды өлшеу өлшеу аспабымен танысу – мультиметрмен 3.1 Жұмыстың мақсаты: Тұрақты токтағы электрлік кернеу ток қуат кедергіні өлшеу принципін тәсілдерін және әдістерін оқып үйрену метрологиялық өңдеу әдістерін
12509. Формулалар бойынша есептеулер 76 KB
  №2 лабораториялық жұмыс Тақырыбы: Формулалар бойынша есептеулер. 1.Берілгені: Берілген n – бүтін және x – нақты сандары үшін берілген өрнекті есептеу алгоритмінің блоксхемасын және программасын құру. Өрнектердің мәні циклдік операторлар көмегімен есептеледі. Пр...
12510. Лабораториялық жұмыс. Кернеу мен токты бөлгіштер 34.84 KB
  2 Лабораториялық жұмыс. Кернеу мен токты бөлгіштер 1 Жұмыстың мақсаты: Кернеу мен токты бөлгіштердің жұмыс істеу принципімен танысу. Кернеу мен токты бөлу шарттарын қолданып кернеудің мәнін есептеу және өлшеу арқылы кернеуді бөлудің шартын принцип дәлелдеу. Кернеу ме...
12511. Бұрамды бәсеңдеткіштер классификациясымен, кинематикалық сұлбасымен, байланыстары мен бөлшектерімен танысу 1.31 MB
  №15 Зертханалық жұмыс Бұрамды бәсеңдеткіштер классификациясымен кинематикалық сұлбасымен байланыстары мен бөлшектерімен танысу. Жұмыстың мақсаты: Барлық бөлшектердің қызметін анықтау Ілініс параметрлерін анықтау Бәсеңдеткішті жинау барысында байл...
12512. Өрістік транзистор негізіндегі кең жолақты күшейткіштің резисторлы каскадын зерттеу 34.34 KB
  Лабораториялық жұмыс Тақырыбы: Өрістік транзистор негізіндегі кең жолақты күшейткіштің резисторлы каскадын зерттеу. Жұмыстың мақсаты: Жалпы бастау бойынша жалғанған өрістік транзистор негізіндегі кең жолақты күшейткіш каскады элементтерінің схема көрсеткіштеріне...
12513. Изучение движения тела под действием силы тяжести и силы упругости 245.24 KB
  Практическая работа № 9 Тема работы: Изучение движения тела под действием силы тяжести и силы упругости Тема для изучения: Закон сохранения механической энергии для системы тел в которой действуют потенциальные силы. Цель: сравнить максимальное изменение потен
12514. Программно-целевое планирование и его использование в сфере услуг 50 KB
  Программно-целевое планирование – это один из видов планирования, в основе которого лежит ориентация деятельности на достижение поставленных целей. По сути, любой метод планирования направлен на достижение каких-либо конкретных целей. Но в данном случае в основе самого процесса планирования лежит определение и постановка целей и лишь затем подбираются пути их достижения.
12515. ИССЛЕДОВАНИЕ ЧАСТОТНО УПРАВЛЯЕМОГО ЭЛЕКТРОПРИВОДА С АВТОНОМНЫМ ИНВЕРТОРОМ 3.21 MB
  ИССЛЕДОВАНИЕ ЧАСТОТНО УПРАВЛЯЕМОГО ЭЛЕКТРОПРИВОДА С АВТОНОМНЫМ ИНВЕРТОРОМ Методические указания к учебноисследовательской лабораторной работе по курсу Автоматизированный электропривод для студентов горнонефтяного факультета специальности 180400 ЭАПУ Лаборат