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


 

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

41988. ДОСЛІДЖЕННЯ СХЕМ ГЕНЕРАТОРІВ ГАРМОНІЙНИХ КОЛИВАНЬ І ПИЛКОПОДІБНОЇ НАПРУГИ 207.5 KB
  На рис.14.2 показано схема генератора синусоїдальних коливань на БТ з цепочкой R-параллель. Цепочка R-параллель являє собою коло R – C (три звена), обеспечивающая фазовый сдвиг 180о на рабочей частоте (цепь позитивного зворотного зв'язку). Резистори R1 и R2 создают необходимое смещение. Частота генерації примерно равна
41990. ИССЛЕДОВАНИЕ СХЕМ НА ОПЕРАЦИОННЫХ УСИЛИТЕЛЯХ 170 KB
  Интегратор на ОУ Недостатком этой схемы является дрейф выходного напряжения обусловленный напряжением смещения и входными токами ОУ. Выходное напряжение этой схемы при подаче на нее скачка входного напряжения амплитудной Uвх изменяется в соответствии с выражением: Uвых = Uвх[1 exp ]. На начальном интервале переходного процесса при t R2С изменение выходного напряжения Uвых будет достаточно близко к линейному и скорость его изменения может быть вычислена из выражения: . Суммирование постоянного и переменного напряжения.
41991. ИССЛЕДОВАНИЕ ОПЕРАЦИОННЫХ УСИЛИТЕЛЕЙ (ОУ) 202 KB
  Идеальный усилитель имеет следующие свойства: бесконечный коэффициент усиления по напряжению А→ ∞; бесконечное полное входное сопротивление Zвх → ∞; нулевое полное выходное сопротивление Zвых → 0; равенство нулю выходного напряжения Uвых = 0 при равных напряжениях на входах U1 = U2; бесконечная ширина полосы пропускания ∆fпр= ∞. За входным каскадом следуют один или несколько промежуточных; они обеспечивают уменьшение напряжения сдвига на выходе усилителя до близкой к нулю величины и усиление по напряжению и по току....
41992. ИССЛЕДОВАНИЕ БИПОЛЯРНОГО ТРАНЗИСТОРА (БТ) 422 KB
  В БТ ток через кристалл обусловлен движением носителей заряда обоих знаков и электронов и дырок. В полевых транзисторах протекание тока через кристалл обусловлено движением носителей заряда одного знака электронов или дырок. Он имеет структуру состоящую из чередующихся областей с различными типами электропроводности: npn или pnp рис.
41993. ИССЛЕДОВАНИЕ ПАРАМЕТРОВ РАБОЧЕЙ ТОЧКИ БИПОЛЯРНОГО ТРАНЗИСТОРА В СХЕМЕ С ОБЩИМ ЭМИТТЕРОМ 692.5 KB
  Краткие теоретические сведения Задание тока базы с помощью резистора Схема транзисторного каскада с общим эмиттером представлена на рис. В этом режиме ток коллектора максимален и не управляется током базы: DCIб IкIKH 5.1 где IKH ток коллектора насыщения определяется сопротивлением Rк в цепи коллектора и напряжением источника питания Ек: IKHEK RK. Для...
41994. Проектирование и создание отчетов в среде Visual FoxPro 9.0 706.97 KB
  0 Открываем уже созданную ранее базу выбираем вкладку Documents переходим на заголовок Reports и нажимаем New. Выбираем Report Wizrd далее если необходимо создать отчет к связанным формам выбираем One to Mny Report Wizrd а если создать отчет к одинарной форме нашей базы то выбираем Report Wizrd. В нашем случае выбираем Report Wizrd. Затем в левой колонке выбираем таблицу для которой необходимо создать отчет.
41995. Дослідження структури та складових BІOS (Base Іnput Output System) 68.5 KB
  Мета роботи: розглянути складові частини BIOS з допомогою яких створюється парольний захист комп'ютера и визначити методи погроз та атак на паролі BIOS.exe програма для перепрограмування BIOS з можливістю зберігання змісту існуючого у файл.exe програма для розпаковки головного модуля BIOS із файлу створеного з допомогою wdflsh.exe та редагування його змісту в тому числі і інструментального паролю BIOS а також отримати новий двійковий файл для перепрограмування BIOS.