ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 08.09.2024
Просмотров: 18
Скачиваний: 0
Лабораторна робота № 7
Тема: Функції користувача.
Мета: познайомитися з механізмом складання і організації взаємодії користувацьких функцій, скласти і відлагодити програму
7 .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);
7.2 Приклад виконання завдання
Написати програму обчислення вибраної функції, вид якої у свою чергу передається в якості параметра у функцію виводу (Out_Rez).
7.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));
}
7.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));
}
Результат виконання програми :
7.3 Індивідуальні завдання
За завданням лабораторної роботи №4 написати програму розрахунку функції Y(x) та S(x), вид якої у свою чергу передається в якості параметра у функцію виводу (Out_Rez).
Аналогічним чином виконати завдання з додатку до лабораторної роботи №4.
Контрольні питання
-
Дайте визначення підпрограми.
-
Перерахуйте відомі вам різновиди підпрограм та поясніть відмінності.
-
Що таке прототип функції та в чому полягає його призначення?
-
З яких частин складається прототип функції? Опишіть кожну з частин.
-
Чим визначається тип значення, яке повертає фугкція?
-
Який ідентифікатор може мати функція? Якій ідтифікатор функції не можна призначати? Поясніть, чому.
-
Скільки аргументів може мати функція? Від чого це залежить?
-
Що таке зона дії змінних?
-
Які різновиди змінних, в залежності від зони дії, ви можете назвати? В чому особливості їх роботи?
-
Що в вашому розумінні клас памяті? Перерахуйте та охарактеризуйте відомі вам класи памяті.