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.Як викликати функцію з використанням покажчика?


 

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

48281. Роздержавлення та приватизація. Особливості приватизації в Україні 42 KB
  Особливості приватизації в Україні. Зміст роздержавлення та приватизації. Власне суть приватизації визначається самою суттю приватної власності. Сенс приватизації власності полягає в відчуженні державної власності на користь юридичних осіб і громадян та формуванні приватної колективної змішаної спільної форм власності.
48284. ИНФОРМАЦИОННЫЕ СИСТЕМЫ В АСУТП 295.5 KB
  Общие понятия и структура SCDсистем Определение и общая структура SCD Функциональная структура SCD Особенности SCD как процесса управления
48285. ПРЕДМЕТ И МЕТОД ИСТОРИИ ПОЛИТИЧЕСКИХ И ПРАВОВЫХ УЧЕНИЙ 763.5 KB
  История политической и правовой мысли позволяет понять как в борьбе и столкновениях различных воззрений и позиций одновременно развивалось познание природы государства и права углублялись представления о свободе справедливости и праве законе и законности о надлежащем общественном и государственном устройстве о правах и свободах человека формах и принципах взаимоотношений личности и власти и т. Плюрализм же не затрагивая собственные внутренние убеждения личности требует от неё лишь одного: уважения и чужих мнений признания и за...
48286. ІСТОРІЯ ЕКОНОМІКИ ТА ЕКОНОМІЧНОЇ ДУМКИ 1.32 MB
  Історія економіки та економічної думки. доцент кафедри економічної теорії Дніпропетровської державної фінансової академії С. доцент кафедри економічної теорії Дніпропетровської державної фінансової академії П.