Скачиваний:
13
Добавлен:
30.05.2020
Размер:
70.66 Кб
Скачать

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

Тема: Функції користувача.

Мета: познайомитися з механізмом складання і організації взаємодії користувацьких функцій, скласти і відлагодити програму

5.1 Теоретична частина.

Підпрограма - це іменована і певним чином оформлена група операторів, що викликається в міру необхідності.

У мові С++ в якості підпрограм використовують функції, які мають декларуватися до їх першого використання. Попередній опис функції називається прототипом, який зазвичай розміщується на початку програми (*.cpp) або в заголовному файлі (*.h) і повідомляє компілятор про те, що далі в програмі буде приведений її повний текст, тобто реалізація.

Опис прототипу має наступний вигляд:

тип_результату ID_функції (список типів параметрів);

а визначення функції має наступну структуру:

тип_результату ID_функції (список параметрів)

{

код функції

return результат;

}

Результат повертається з функції в точку виклику за допомогою оператора return і перетвориться до типу, вказаного в заголовку функції. Якщо тип функції не вказаний, то за умовчанням встановлюється тип int, якщо ж функція не повертає результату, то слід вказати порожній тип void. Список параметрів складається з переліку типів і ID параметрів, розділених комами.

З функції можна передати тільки одне значення, при необхідності повернути декілька - в списку параметрів використовують покажчики (вказівники).

Приклад реалізації функції, визначальної найменше з двох цілих чисел:

int Min_x_y(int x, int y){

return (x<y)? x: y;

}

Виклик функції має наступний формат:

ID_функції(список аргументів);

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

Виклик попередньої функції може мати вигляд: min = Min_x_y(a, b);

Зона дії змінних

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

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

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

У мові С кожна змінна належить одному з чотирьох класів пам'яті - автоматичною (auto), зовнішньою (extern), статичною (static) і регістровою (register). Тип пам'яті вказується перед специфікацією типу, наприклад, register int a; чи static double b; За умовчанням встановлюється клас auto і змінні розміщуються в стеку.

Покажчик на функцію

Функції можуть бути використані в якості формальних параметрів, для цього використовується покажчик на функцію. Наприклад, покажчик р на функцію, що повертає результат типу double і має два параметри doublet і int, оголошується таким чином:

double(double, int);

Використовуючи операцію typedef, тип такого покажчика може бути оголошений так

typedef double(double, int);

5.2 Приклад виконання завдання

Написати програму обчислення вибраної функції, вид якої у свою чергу передається в якості параметра у функцію виводу (Out_Rez).

5.2.1 Створення віконного застосування

Панель діалогу з отриманими результатами представлена на мал. 4.1, а текст програми може мати наступний вигляд:

. . .

#include "math.h"

//------------ Декларація типу покажчика на функції -------------------------

typedef double(double);

//------------Декларації прототипів функцій Користувача ---------------

double fun1(double);

double fun2(double);

void Out_Rez(TFun, double, double, double, TMemo*);

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)

{

Edit1 ->Text="0, 1"; Edit2 ->Text="3"; Edit3 ->Text="0, 3";

Memo1 ->Clear(); Memo2 ->Clear();

RadioGroup1 ->ItemIndex=0;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

double a, b, h;

a = StrToFloat(Edit1 ->Text);

b = StrToFloat(Edit2 ->Text);

h = StrToFloat(Edit3 ->Text);

switch(RadioGroup1 ->ItemIndex){

case 0: Out_Rez (fun1, a, b, h, Memo1); break;

case 1: Out_Rez (fun2, a, b, h, Memo2); break;

}

}

Мал. 1

//---------- Реалізації функцій Користувача ---------------------------------

double fun1( double r){

return 2*exp(r*r);

}

double fun2(double r){

return pow(sin(r), 2);

}

void Out_Rez (TFun f, double xn, double xk, double h, TMemo *mem){

for(double x=xn; x<=xk; x+=h)

mem ->Lines ->Add(" x = "+FloatToStrF(x, ffFixed, 8,2)+

" y = "+FloatToStrF(f(x), ffFixed, 8,4));

}

5.2.2 Створення консольного застосування

Текст програми може виглядати таким чином:

. . .

typedef double(double); // Декларація типу покажчика на функцію

double fun1(double); // Декларації прототипів функцій

double fun2(double);

void Out_Rez (TFun, double, double, double);

void main()

{

double a, b, h;

puts("Input a, b, h");

scanf("%lf%lf%lf", &a, &b, &h);

puts("\n\t Function - 2*exp(x)"); Out_Rez (fun1, a, b, h);

puts("\n\t Function - sin(x)*sin(x)"); Out_Rez (fun2, a, b, h);

puts("\n Press any key ... ");

getch();

}

//---------- Реалізації функцій користувача ---------------------------------

double fun1( double r){

return 2*exp(r*r);

}

double fun2(double r){

return pow(sin(r), 2);

}

void Out_Rez (TFun f, double xn, double xk, double h){

for(double x=xn; x<=xk; x+=h)

printf(" x = %5.2lf, y = %8.4lf\n", x, f(x));

}


Результат виконання програми :

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

За завданням лабораторної роботи №4 написати програму розрахунку функції Y(x) та S(x), вид якої у свою чергу передається в якості параметра у функцію виводу (Out_Rez).

Аналогічним чином виконати завдання з додатку до лабораторної роботи №4.

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

  1. Дайте визначення підпрограми.

  2. Перерахуйте відомі вам різновиди підпрограм та поясніть відмінності.

  3. Що таке прототип функції та в чому полягає його призначення?

  4. З яких частин складається прототип функції? Опишіть кожну з частин.

  5. Чим визначається тип значення, яке повертає фугкція?

  6. Який ідентифікатор може мати функція? Якій ідтифікатор функції не можна призначати? Поясніть, чому.

  7. Скільки аргументів може мати функція? Від чого це залежить?

  8. Що таке зона дії змінних?

  9. Які різновиди змінних, в залежності від зони дії, ви можете назвати? В чому особливості їх роботи?

  10. Що в вашому розумінні клас памяті? Перерахуйте та охарактеризуйте відомі вам класи памяті.