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


 

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

10350. Элективные курсы в профильном обучении, психолого-педагогические условия эффективного использования элективных курсов в различных классах по предмету 55.5 KB
  Элективные курсы в профильном обучении психологопедагогические условия эффективного использования элективных курсов в различных классах по предмету. Современные подходы к образованию предусматривают реализацию принципа вариативности путей форм средств его полу
10351. Понятие о методах, приемах, средствах обучения. Различные подходы к классификации методов обучения 75.5 KB
  Понятие о методах приемах средствах обучения. Различные подходы к классификации методов обучения. Характеристика познавательной деятельности. Социальные и познавательные мотивы учебной деятельности школьников. Особенности формирования познавательных интересов уча...
10352. Методы обучения, активизирующие познавательную деятельность учащихся. Технология организации дидактических игр, групповых дискуссий, учебных диспутов 57.5 KB
  Методы обучения активизирующие познавательную деятельность учащихся. Технология организации дидактических игр групповых дискуссий учебных диспутов. Психологопедагогические снования выбора учителем методов обучения. Под активизацией учебной деятельности понимае...
10353. Методы организации и осуществления учебно-познавательной деятельности учащихся. Словесные, наглядные, практические методы, педагогические требования к ним 71 KB
  Методы организации и осуществления учебнопо-знавательной деятельности учащихся. Словесные наглядные практические методы педагогические требования к ним. Техника общения коммуникативные ошибки в деятельности учителя. Метод обучения способ совместной деятельност...
10354. Сущность, функции, методы и средства контроля и самоконтроля в обучении. Теория П.Я. Гальперина о поэтапном формировании умственных действий 69.5 KB
  Сущность функции методы и средства контроля и самоконтроля в обучении. Теория П.Я. Гальперина о поэтапном формировании умственных действий. Учет и оценка знаний умений и навыков школьников. Технология организации нетрадиционных форм контроля: педагогический мониторин
10355. Понятие о средствах обучения, типология и функции средств обучения. Психологическое обоснование выбора учителем средств обучения 36 KB
  Понятие о средствах обучения типология и функции средств обучения. Психологическое обоснование выбора учителем средств обучения. Средство обучения это материальный или идеальный объект который использован учителем и учащимися для усвоения новых знаний. Основ
10356. Индивидуальная, групповая, фронтальная формы организации обучения предмету, условия их оптимального сочетания 37.5 KB
  Индивидуальная групповая фронтальная формы организации обучения предмету условия их оптимального сочетания. Психологические основы создания гомогенных и гетерогенных групп. Технология организации групповой работы на уроках. Индивидуальная ФОО предполагает чт
10357. Типология и структура урока. Различные формы проведения урока в современной школе 36.5 KB
  Типология и структура урока. Различные формы проведения урока в современной школе. Проектирование урока по предмету как педагогическая задача. Технология подготовки и проведения урока. Существует несколько подходов к классификации уроков каждый из которых отличает...
10358. Дополнительное образование в условиях современной школы. Внеурочная деятельность учителя по предмету, ее цели, задачи, функции, основные формы и виды 39.5 KB
  Дополнительное образование в условиях современной школы. Внеурочная деятельность учителя по предмету ее цели задачи функции основные формы и виды. Учреждения дополнительного образования. Развитие интересов и способностей ученика в процессе дополнительного образова