17119

Використання покажчиків для роботи з функціями

Лабораторная работа

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

Лабораторна робота № 28 Тема: Використання покажчиків для роботи з функціями Ціль роботи: виробити практичні навички в написанні програм з функціями й у використання покажчиків для роботи з функціями. Обладнання: ПКПО Borland C Теоретичні відомості З дозволяє вик

Украинкский

2013-06-29

95.5 KB

1 чел.

Лабораторна робота № 28

Тема: Використання покажчиків для роботи з функціями

Ціль роботи: виробити практичні навички в написанні програм з функціями й у використання покажчиків для роботи з функціями.

Обладнання: ПК,ПО Borland C++

Теоретичні відомості

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

[const ]тип*ім'я покажчика

При оголошенні функції ім'я покажчика як формального параметра може не вказуватися аналогічно іншим видам формальних параметрів.

Ключове слово const охороняє дані від зміни даних у структурі функції, тоді як відсутність ключового слова const дозволяє функції змінювати значення даних, тому що при використанні покажчиків у тілі функції відомі фізичні адреси перемінних.

Приклад використання покажчиків на різні типи даних як параметри функції.

int funct (float*, int*); // передача покажчиків на тип float і на тип int

struct Муst

{

//члени;

};

void loadMy(Myst*pmy); // передача покажчика рmу на тип структур типу Муst.

У прикладі оголошена структура типу Myst і оголошена функція  loadMy() . Функція має формальний параметр-покажчик  pmy на тип Мyst.

Виклик функції funct() і fn():

Float*pf; int*pl;

Int a = funct(pf, pl); fn(pf);

Оголошення покажчика на функцію аналогічно оголошенню функцій, з якими він буде використовуватися. Наприклад

void (* pfunc) (int, int);

Оголошено покажчик pfunc на функцію, що вимагає два параметри типу int і не повертає значення (void). Типи і кількість параметрів, а також тип значення, що повертається, повинні створити. Для використання покажчика оголосимо функцію

void f1 (int, int);

Привласнимо покажчику адреса функції

pfunc= f1;

і здійснимо її виклик

(*pfunc)(2,4);

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

Покажчики широко використовуються при передачі аргументів у функцію і з функції, створюючи двосторонній потік даних між викликуваною і зухвалою функціями.

Для передачі аргументів у функцію використовують:

  •  Покажчики на прості типи даних, як параметри функції.
  •  Покажчики на масиви (передавати за значенням не можна).
  •  Покажчики на переліковані  типи як параметри функції.
  •  Покажчики на структури й об'єднання як параметри функції.
  •  Покажчики на функції (передавати за значенням не можна).

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

тип_ щоповертається_значення (*ім'я_покажчика_на_функцію) (оголошення_типів_параметрів);

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

Ініціалізація покажчика на функцію:

ім'я_покажчика = ім'я_функції;

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

(*ім'я_покажчика)(список_фактичних_параметрів);

Приклад

int linescarch (int)*pstring  //оголошення функції linesearch (int* )

voild main()

{int a; * pstr = “Hello World!”;  // оголошення перемінної і покажчика pstr на тип int

int (*search)(int*);    // оголошення покажчика на функцію

search= linesearch;   // привласнюємо адреса функції linesearch ()покажчику search

                                   //інші оператори

a = (* search)(pstr);   // виклик функції linesearch ( ) за допомогою покажчика.

}

Приклад

/*    ЗАНЯТТЯ N 16

  Розробив Петров Ю.В.

Оголосити задані функції і покажчик на функцію цього типу,

виконати визначення функцій. Оголосити масиви і покажчики

на них, виконати ініціалізацію відповідно до заданого

залежностями і використанням покажчиків. Для одного з

масивів виділити пам'ять у купі. Вивести значення елементів

масивів на екран. Здійснити виклик функцій із застосуванням

покажчика. Вивести результати роботи функцій на екран.   */

#include <stdio.h>

#include <math.h>

#include <conio.h>

#include <iostream.h>

const int kx = 6, ky = 6, kw = 8, a1 = 3, a2 = 9,

  b1 = 6, b2 = 5, c1 = 6, c2 = 10;

//Обчислює суму негативних елементів масиву

float summa ( int, float* );

//Обчислює добуток позитивних елементів масиву

float prois ( int, float* );

float (*ps)( int, float* ); //Оголошення покажчика на функцію

void main ()

{

int і;

float y[ky+2]; //+2 елементи масиву для збереження

// результатів роботи функцій

float *px=new float [kx+2];//Виділення пам'яті для масиву в "купі"

float *xptr;

clrscr();

printf("Масив x[]\n");

for ( і=0; і<kx; і++)

  { *px = a1*і*і - a2*(5-i); //Ініціалізація динамічного масиву

    printf("x[%d] = %6.2f %p \n",i, *px, px);

    px++;

  }

xptr = y;

gotoxy(25,1);  printf("Масив y[]\n");

for ( і=0; і<ky; і++)

 { *xptr = b1*sin(2*і) + b2*exp(і-5); //Ініціалізація масиву y[]

   gotoxy(30,i+2);

   printf("y[%d] = %6.2f\n",i,*xptr);

   xptr++;

 }

px-=kx;    //Установка покажчика на нульовий елемент масиву

printf("Покажчик на дин. масив містить адреса рх =  %p\n ", px );

ps=summa;  //Зв'язування покажчика з функцією summa()

printf("Покажчик на функцію містить адреса рs =  %p\n ", ps );

printf("Сума: x[%d] = %6.2f   ", kx, (*ps)(kx, px) );

printf("Сума: y[%d] = %6.2f\n ", ky, (*ps)(ky, y) );

ps=prois;  //Зв'язування покажчика з функцією prois()

printf("Покажчик на функцію містить адреса рs =  %p\n ", ps );

printf("Добуток: x[%d] = %8.2f ", kx+1, (*ps)(kx, px) );

printf("Добуток: y[%d] = %8.2f\n ", ky+1, (*ps)(ky, y) );

delete [] px; //Звільнення пам'яті, виділеної в "купі"для масиву

getch();

}

float summa ( int kol, float* Arr )  //Визначення функції

{ float s=0;

  for ( int i=0; i<kol; i++ ) if (Arr[i]<0) s+=Arr[i];

  return s;

}

float prois ( int kol, float* Arr )  //Визначення функції

{ float s=1;

  for ( int i=0; i<kol; i++ ) if (Arr[i]>0) s*=Arr[i];

  return s;

}

  /*

      Масив x[]                Масив y[]

  x[0] = -45.00 0AD0           y[0] =   0.03

  x[1] = -33.00 0AD4           y[1] =   5.55

  x[2] = -15.00 0AD8           y[2] =  -4.29

  x[3] =   9.00 0ADC           y[3] =  -1.00

  x[4] =  39.00 0AE0           y[4] =   7.78

  x[5] =  75.00 0AE4           y[5] =   1.74

Покажчик на дин. масив містить адреса рх =  0AD0

Покажчик на функцію містить адреса     рs =  049C

Сума: x[6] = -93.00    Сума: y[6] =  -5.29

Покажчик на функцію містить адреса     рs =  04F3

Добуток: x[7] = 26325.00 Добуток: y[7] = 2.52  */

Приклад програми на С++

Скласти програму яка використовує виклики функцій за допомогою покажчиків. Індивідуальні завдання приведені в таблиці 16.1.

Варіант

перша
функція

друга
функція

третя
функція

четверта функція

6

char (*func1)
(unsigned int *)

char (*func2)
(int *, float *, double *)

char (*func3)
(void *,…)

int *func4(
char *, int *,…)

#include<iostream.h>

#include<math.h>

void H(char(*func1)(unsigned int*),char(*func2)(int*,float*,double*),char(*func3)(void*));

int*func4(char*be,int*b);

char f1(unsigned int*c);

char f2(int*d,float*e,double*f);

char f3(void*g);

void main()

{int r,*my=&r,y;

char p;

p='w';

y=54;

H(f1,f2,f3);

*my=*func4(&p,&y);

cout<<*my;

}

void H(char(*func1)(unsigned int*),char(*func2)(int*,float*,double*),char(*func3)(void*))

{int a2;

unsigned int a1;

float a4;

double a3;

void *a5;

char z1,z2,z3;

a1=12;

a2=10;

a3=3.5;

a4=8.1;

z1=(*func1)(&a1);

z2=(*func2)(&a2,&a4,&a3);

z3=(*func3)(a5);

cout<<z1<<' '<<z2<<' '<<z3<<'\n';

}

char f1(unsigned int*c)

{if (*c<10) return 'a';

 else return 'b';

}

char f2(int*d,float*e,double*f)

{if((*d>*e)&&(*f>0)) return'a';

 else return 'b';

}

char f3(void*g)

{return 'v';

}

int*func4(char*be,int*b)

{int a,*c=&a;

if(*be=='w') *c=*b;

 else *c=0;

return c;

}

Хід роботи

1.Вивчити теоретичні відомості.

2.Оголосити покажчики на функції. Використовувати покажчики для виклику відповідних функцій. 3.Використовувати оператор switch для вибору варіанта функцій.

4.Розробити і набрати програму на комп'ютері, усунути помилки.

5.Одержати результат.

6.Оформити звіт.

7.Підготуватися до захисту лабораторної роботи, вивчивши контрольні питання.

Індивідуальне завдання

Скласти програму яка використовує виклики функцій за допомогою покажчиків. Індивідуальні завдання приведені в таблиці 16.1.

Таблиця 16.1 - індивідуальні завдання

Варіант

перша
функція

друга
функція

третя
функція

четверта функція

1

int (*func1)
(int *)

int (*func2)
(int *,float *)

int (*func3)
(void *)

char *func4
(char *,…)

2

float (*func1)
(int *, float *, double *)

float (*func2)
(void *,…)

float (*func3)
(int, …)

double (*func4
(double, double))[3]

3

void (*func1)
(void *, int *)

void (*func2)
(int, int *)

void (*func3)
(void)

int (*func4
(void))(int)

4

double (*func1)
(float *, int)

double (*func2)
(double, long int)

double (*func3)
(unsigned int *)

int (*func4(int))
(int)[3][5]

5

long double (*func1)
(int *, float *)

long double (*func2)
(void *, …)

long double (*func3)
(int, …)

char * (*func4
(int *, …))(void *)

6

char (*func1)
(unsigned int *)

char (*func2)
(int *, float *, double *)

char (*func3)
(void *,…)

int *func4(
char *, int *,…)

7

long int (*func1)
(int, int *)

long int (*func2)(double, long int)

long int
(*func3)( void)

float (*func4
(double)(void))
[10]

8

unsigned int (*func1)
(int *)

unsigned int (*func2)
(int, …)

unsigned int (*func3)
(int *,float *)

long int (*func4(int))
(void)

9

float (*func1)
(int *, float *, double *)

float (*func2)
(unsigned int *)

float (*func3)
(void)

void *func4
(int *, int, …)

10

unsigned long int (*func1)
(int, …)

unsigned long int (*func2)
(int *)

unsigned long int (*func3)
(double, long int)

float (*func4(
long int, int))[5]

11

signed int (*func1)
(int *, float *, double *)

signed int (*func2)
(int)

signed int (*func3)
(void *, …)

double (*func4
(char)(int *))[4]

12

double (*func1)
(float *, int)

double (*func2)
(double, long int)

double (*func3)
(unsigned int *)

double (*func4
(double, double))[3]

13

long double (*func1)
(int *, float *)

long double (*func2)
(void *, …)

long double (*func3)
(int, …)

int (*func4
(void))(int)

14

char (*func1)
(unsigned int *)

char (*func2)
(int *, float *, double *)

char (*func3)
(void *,…)

int (*func4(int))
(int)[3][5]

15

long int (*func1)
(int, int *)

long int (*func2)(double, long int)

long int
(*func3)( void)

char * (*func4
(int *, …))(void *)

16

unsigned int (*func1)
(int *)

unsigned int (*func2)
(int, …)

unsigned int (*func3)
(int *,float *)

int *func4(
char *, int *,…)

17

int (*func1)
(int *)

int (*func2)
(int *,float *)

int (*func3)
(void *)

float (*func4
(double)(void))
18[10]

18

float (*func1)
(int *, float *, double *)

float (*func2)
(void *,…)

float (*func3)
(int, …)

long int (*func4(int))
(void)

19

void (*func1)
(void *, int *)

void (*func2)
(int, int *)

void (*func3)
(void)

int *func4(
char *, int *,…)

20

double (*func1)
(float *, int)

double (*func2)
(double, long int)

double (*func3)
(unsigned int *)

float (*func4
(double)(void))
[10]

21

long double (*func1)
(int *, float *)

long double (*func2)
(void *, …)

long double (*func3)
(int, …)

long int (*func4(int))
(void)

22

char (*func1)
(unsigned int *)

char (*func2)
(int *, float *, double *)

char (*func3)
(void *,…)

void *func4
(int *, int, …)

23

unsigned long int (*func1)
(int, …)

unsigned long int (*func2)
(int *)

unsigned long int (*func3)
(double, long int)

float (*func4(
long int, int))[5]

24

signed int (*func1)
(int *, float *, double *)

signed int (*func2)
(int)

signed int (*func3)
(void *, …)

double (*func4
(char)(int *))[4]

25

double (*func1)
(float *, int)

double (*func2)
(double, long int)

double (*func3)
(unsigned int *)

char *func4
(char *,…)

26

long double (*func1)
(int *, float *)

long double (*func2)
(void *, …)

long double (*func3)
(int, …)

double (*func4
(double, double))[3]

27

char (*func1)
(unsigned int *)

char (*func2)
(int *, float *, double *)

char (*func3)
(void *,…)

int (*func4
(void))(int)

28

double (*func1)
(int *, float *, double *)

double (*func2)
(double, long int)

double (*func3)
(unsigned int *)

int (*func4(int))
(int)[3][5]

29

void (*func1)
(void *, int *)

void (*func2)
(int, int *)

void (*func3)
(void)

char * (*func4
(int *, …))(void *)

30

double (*func1)
(float *, int)

double (*func2)
(double, long int)

double (*func3)
(unsigned int *)

int *func4(
char *, int *,…)

Вимоги до змісту звіту приведені в лабораторній   роботі   №1.

Контрольні запитання

 1.Чи можна використовувати покажчики для передачі даних у функції?

2.Які типи даних можна передати у функцію з використанням покажчиків?

 3.Чи можна змінювати значення даних у функції при використанні покажчиків при наявності модифікатора const.

4.Чи можна повертати покажчики з функцій?

5.Як оголосити покажчик на функцію?

6.Чи можна використовувати покажчики для роботи з функціями різного типу?

7.Який тип має ім'я функції?

8.Як зв'язати покажчик з конкретною функцією?

9.Як використовувати покажчики для виклику функції?

10.Як обмежується доступ до членів класу?

11.Як зв'язати і використовувати покажчик на функцію?

12.Як викликати функцію з використанням покажчика?


 

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

76276. Ишемический инсульт 19.56 KB
  Прежде всего на МРТ не визуализируется типичный эффект потери сигнала от сосудов в зоне патологии. В течение первых 3 сут развития инфаркта мозга на МРТ с контрастированием примерно в 30 случаев может наблюдаться усиление сигнала от соседней твердой мозговой оболочки.
76277. Операционные системы 51.7 KB
  Специфика ОС проявляется и в том каким образом она реализует сетевые функции: распознавание и перенаправление в сеть запросов к удаленным ресурсам передача сообщений по сети выполнение удаленных запросов.
76278. Наружная и передняя яремные вены, их корни, притоки и анастомозы 107.04 KB
  Анастомоз с v. jugularis anterior противоположной стороны – arcus venosus juguli (иногда сливаются в v. mediana colli), межсистемный. Анастомозы дуги с vv. thyroideae inferiores и с подкожными венами передней грудной стенки. Входит в spatium interaponeuroticum suprasternale, поворачивает в recessus lateralis, соединяясь с v. jugularis externa или в v. jugularis interna. Реже впадает в v. subclavia или v. brachiocephalica.
76279. Непарная вена 43.26 KB
  zygos начинается в брюшной полости являясь непосредственным продолжением правой восходящей поясничной вены v. Последняя начинается из мелких вен области крестца и поясницы которые анастомозируют с венами наружного позвоночного сплетения и поясничными венами из системы нижней полой вены. Притоки непарной вены: 1. Верхние диафрагмальные вены vv.
76280. Внутренняя яремная вена 66.65 KB
  В области шеи внутренняя яремная вена является самым крупным стволом. Вена располагаетсяв составе сосудистонервного пучка шеи латеральнее общей сонной артерии и блуждающего нерва. В области шеи внутренняя яремная вена получает непостоянные внечерепные притоки.
76281. Внутричерепные притоки внутренней яремной вены 117.6 KB
  Синусы твердой мозговой оболочки: Sinus sgitlis superior Sinus sgitlis inferior Sinus cvernosus Sinus intercvernosi Sinus sphenoprietlis Sinus petrosus superior Sinus petrosus inferior Sinus mrginlis Sinus rectus Sinus occipitlis Sinus trnsversus Sinus sigmoideus Выпускники vv. diploice: Лобная в sinus sgitlis superior Задняя височная sinus sphenoprietlis Передняя височная sinus trnsversus Затылочная sinus trnsversus Вены твердой мозговой оболочки vv.
76282. Нижняя полая вена. Корни. Притоки. Анастамозы с верхней полой и воротной венами 1.36 MB
  V. thoracoepigastrica (приток v. axillaris) (система v. cava superior) - v. epigastrica superficialis (приток v. femoralis) (система v. cava inferior) V. azygos, v. hemiazygos (vv. lumbales ascendens dextra et sinstra) (система v. cava superior) -vv. lumbales dextrae et sinistrae (система v. cava inferior)
76283. Воротная вена. Корни, притоки, анастамозы с полыми венами 440.37 KB
  Спереди, в области пупка, где своими притоками анастомозируют vv. paraumbilicales, идущие в толще lig. teres hepatis к воротной вене, v. epigastrica superior из системы v. cava superior (v. thoracica interna, v. brachiocephalica) и v. epigastrica inferior из системы v. cava inferior (v. iliaca externa, v. iliaca communis), v.thoracoepigastrica (v. subclavia dextra).