Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lektsii_OP / T12.doc
Скачиваний:
96
Добавлен:
17.03.2016
Размер:
272.38 Кб
Скачать

Міжфайлові функції

Підпрограми, виклик яких може здійснюватися з різних файлів багатофайлової програми, називають міжфайловими.

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

Коли компілятор генерує виклик функції, йому не треба знати, в який спосіб вона працює. Все, що потрібно йому знати, – це ім’я функції, тип результату і типи параметрів (аргументів). Усі дані стосовно цього містяться в протопиті (оголошенні) функції. Тому для доступу до функції, яка визначена в одному файлі, а її виклики здійснюються з інших, потрібно лише повторити її прототип у тих файлах, які містять оператори її виклику. Наприклад,

// ----------Файл F1----------

int Аdd(int a, int b) // визначення функції Аdd

{ return a+b;

}

// ----------Файл F2----------

int Аdd(int, int); // прототип функції Аdd

. . .

int answer=Аdd(2, 3); // виклик функції Аdd

Специфікатор extern з функціями не використовується, оскільки усі функціїї мов С/С++ є зовнішніми за умовчанням: компілятор здатен відрізнити оголошення від визначення за наявності чи відсутності тіла функції.

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

// ----------Файл F1----------

static int Аdd(int a, int b) // визначення функції Аdd

{ return a+b;

}

// ----------Файл F2----------

static int Аdd(int a, int b, int с) // Інша функція Аdd

{ return a+b+с;

}

Цей код створює дві різні функції. Жодна з них не є видимою поза файлом, у якому її визначено.

Організація багатофайлових програм

В імперативному програмуванні існує два основних підходи до розробки багатофайлових проектів: багатофайлові програми і так звані бібліотеки визначень (модулі – у Pascal, заголовні файли – у С/С++).

Багатофайлові проекти

Багатофайлові програми характеризуються тим, що включають декілька окремих програмних файлів (cpp-файлів у С/С++), один із яких є головним.

Проілюструємо створення такої програми. Розглянемо програму, яка табулює значення декількох тригонометричних функцій на заданому відрізку. Визначення цих функцій і покажчик на функцію (*func), що розіменовується для доступу до цих функцій, запишемо в файл з ім’ям tabular.cpp, тіло основної програми – у файл aрр.cpp.

//------------------------------------tabular.cpp - файл оголошень і визначень -------------------------------

#include <iostream>

#include <stdio.h>

#include <math.h> // підключення математичної бібліотеки

using namespace std;

float pi=3.14159;

float (*func)(float); //покажчик на функцію

//===== табулювання функції (*func) =====

void Print(float a, float b, float h, float (*func)(float), char s[]) /* a, b - межі відрізка,

h -відстань між точками, s - текстова назва функції*/

{ float x; //значення аргументу функції *func

cout<<"=================="<<endl; //виведення заголовка таблиці

cout<<" x | "<< s <<endl;

cout<<"=================="<<endl;

x=a;

while (x<b) //поки не досягнуто правої межі відрізка

{ printf("%6.2f |", x);

printf("%8.4f \n", (*func)(x)); //обчислити і вивести значення функції

x+=h;

}

}

//--------------------------------------арр.cpp - файл головної функції -----------------------------------------

#include <iostream>

#include <math.h>

using namespace std;

extern float pi;

float lower, upper, step; //межі діапазона, крок

//======== прототипи функцій =========

void Print(float, float, float, float (*)(float), char[]);

//======== головна функція ============

int main()

{ cout<<"Enter lower, upper bounds and step, multiple of pi: ";

cin>>lower>>upper>>step;

lower*=pi; upper*=pi; step*=pi;

Print(lower, upper, step, sin, "sin(x)"); //табулювання стандартної функції sin

Print(lower, upper, step, cos, "cos(x)"); //табулювання стандартної функції cos

system("pause");

}

Результат роботи програми:

Соседние файлы в папке lektsii_OP