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


 

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

47032. Генетика человека. Малярийный плазмодий 55.3 KB
  Близнецовые данные оказываются полезными для количественной оценки степени генетической детерминированности отдельных признаков в связи с чем близнецовый метод можно считать одним из важных методов количественной генетики. Близнецовый метод позволяет установить наследственный характер признаков и это единственный метод выявляющий соотносительную роль удельный вес генетических наследственных и средовых факторов в формировании признака. Близнецовый метод был предложен Ф.
47033. Восстановление изношенной поверхности методом металлизации, принцип, технология металлизации 46.69 KB
  Процесс металлизации заключается в нанесении расплав ленного металла на специально подготовленную поверхность детали распылением его струей воздуха или газа. Схема электродуговой металлизации Примечание. Ппреимущества электрометаллизации: высокая производительность процесса.
47034. Виды ожогов. Классификация 47 KB
  Требования пожарной безопасности в учебных заведениях. В учебных классах и кабинетах следует размещать только необходимые для обеспечения учебного процесса мебель приборы которые должны храниться в шкафах на стеллажах; Число парт столов в учебных классах и кабинетах не должно превышать количества установленного нормами проектирования; С учащимися и студентами должны быть организованы занятия беседы по изучению правил пожарной безопасности в быту; Противопожарные системы и установки зданий должны постоянно содержаться в исправном...
47035. Проблема предметной деятельности и ее развития в развития в раннем детстве 47 KB
  Основное противоречие возраста: способ действия с предметом образец действия принадлежит взрослому а ребенок в то же время должен выполнять индивидуальное действие. Ведущий тип деятельности: предметная деятельность направленная на усвоение общественно выработанных способов действия с предметами. Цель возникает только в результате осуществления самого предметного действия. только после того как ребенок выпьет из чашки воду у него возникает цель пить из чашки воду Структура предметного действия: Действие состоит из ориентировочной и...
47036. Теория налогообложения 47.36 KB
  Теория Стоимость основных средств безвозмездно полученных от других предприятий налогом на прибыль: облагается не облагается если оборудование получено для разработки нефтяных и газовых месторождений не облагается если основные средства переданы с баланса на баланс предприятий потребительской кооперации по решению собственников не облагаются в любом случае Налоговая база по налогу на прибыль исчисляется: @нарастающим итогом с начала года по итогам каждого квартала по итогам года нарастающим итогом с начала каждого квартала ежемесячно...
47037. Определение адекватности построенной модели регрессии 47.5 KB
  Анализ остаточной компоненты остаточного ряда позволяет оценить качество полученнного уравнения регрессии. Модель считается адекватной исследуемому процессу если: 1 математическое ожидание значений остаточного ряда близко или равно нулю; 2 значения остаточного ряда случайны; 3 независимы; 4 подчинены нормальному закону распределения. Равенство нулю математического ожидания ряда остатков означает выполнение следующего соотношения: Однако в случае применения метода наименьших квадратов такая проверка является излишней поскольку...
47038. Права особи в Україні 47.5 KB
  Особисті права особи в Україні Громадянські та політичні права належать до так званого âпершого поколінняâ прав людини. Саме ці права в першу чергу були проголошені французькою âДекларацією прав людини і громадянинаâ і âБіллем про праваâ який увійшов до складу Конституції США. Особисті громадянські права визначають свободу людини в сфері особистого життя його юридичну захищеність від будьякого незаконного втручання. До громадянських прав відноситься право приватної власності право на охорону сімї материнства і дитинства...