Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
L_func(8).doc
Скачиваний:
2
Добавлен:
07.09.2019
Размер:
271.87 Кб
Скачать

8

Міністерство освіти і науки україни Національний університет «Львівська політехніка» Кафедра «Телекомунікації»

Структура програми, функції, аргументи функції та зовнішні змінні.

Методичні вказівки до лабораторної роботи з дисципліни

«Інформатика телекомунікаційних систем та мереж, ч.IІ»

для студентів базового напряму 6.0924

«Телекомунікації»

Затверджено

на засіданні кафедри «Телекомунікації»

Національного університету

«Львівська політехніка»,

протокол №___ від______2006р.

Львів 2006

«Структура програми, функції, аргументи функції та зовнішні змінні.». Методичні вказівки до лабораторної роботи з дисципліни «Інформатика телекомунікаційних систем та мереж, ч.IІ» для студентів базового напряму 6.0924 «Телекомунікації». Львів 2006. 8 с.

Автор: доцент І.Б Чайковський.

.

Рецензент: професор, д.т.н., Б.П.Русин

У лабораторній роботі розглянуто властивості, аргументи та зовнішні змінні фукнкцій мови програмування С.

МЕТА РОБОТИ: дослідити властивості, аргументи та зовнішні змінні функції мови програмування С. Оволодіти механізмом визначення, опису і виклику функцій та написанням рекурсивних функцій

Попередні відомості.

Функція - це сукупність декларацій та операторів, призначених для виконання певної окремої задачі. Кількість функцій в програмі не обмежується. Програма на мові С містить хоча б одну функцію - головну, з іменем main0.

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

Визначенням функції0 називається специфікація імені, формальних параметрів і тіла функції. Може бути специфікований також тип результату (значення, яке повертає функція) і клас пам'яті функції.

Формат специфікації:

[<клас пам'яті>] [<тип результату>] <ім’я> ([<декларації параметрів>])

{ <тіло функції>

}

Тут і надалі квадратні дужки означають необов’язковість присутності даного фрагменту запису, трикутні - місце підстановки ідентифікатора. Приклад:

void far * MK_FP (unsigned seg, unsigned ofs)

{ ... }

У цьому визначенні клас пам’яті не вказаний і вважається за замовчуванням extern (інший - static); тип результату void far * (чотирибайтовий далекий far) вказівник, який складається з сегмента та зміщення); ім'я функції - MK_FP (ця функція формує вказівник за заданими через формальні параметри адресою сегмента (seg) і зміщенню (ofs); формальні параметри – seg i ofs з декларацією їх типу unsigned; тіло функції обмежується фігурними дужками.

Тип результату може бути може бути будь-який, окрім масиву або функції, хоча вказівники на них можуть бути. Якщо тип результату не вказаний, то вважається int. Формальні параметри  - це змінні, які приймають значення, що передані функції при її виклику відповілно порядку розташування їх імен у списку параметрів. Декларації параметрів записуються за правилами декларацій типів і розділяються комами. Якщо декларація відсутня, вважається тип int. Невідповідність типів фактичних аргументів типам формальних параметрів може привести до неправильної інтерпретації. Запобігти цьому може використання опису (декларації) функції із списком аргументів.

Тіло функції є складний оператор, або блок. Він містить оператори, які визначають дії функції, та декларації змінних, які використовуються в цих операторах. Якщо функція повертає значення (результат), то повинен бути виконаний оператор return, який містить вираз. Вираз обчислюється, перетворюється до типу результату функції і є значенням функції; якщо оператор return не вказаний, то значення функції не визначене.

Опис (декларація) функції  задає прототип функції, який містить її ім'я, тип результату, клас пам'яті і типи деяких або всіх параметрів функції.

Формат опису функції:

[<клас пам'яті>] [<тип результату>] <ім'я> ([<список типів

параметрів>]);

Список типів параметрів містить типи параметрів функції, які розділяються комами. Компілятор здійснюї контроль типів параметрів та результату при виклику функції. Тому опис функції повинен бути до виклику цієї функції.

Виклик функції (з зовнішнього фрагменту програми) передає управління та фактичні параметри (якщо вони є) заданій функції. Синтаксис виклику функції:

<ім'я функції> ([<список виразів>])

Список виразів, в якому вирази записані через кому, є списком фактичних арггументів, що передаються функції. Цей список може бути порожнім. При виконанні виклику функції відбувається присвоєння значень фактичних аргументів формальним параметрам. Всі аргументи передаються за значенням, крім масивів, які передаються за адресою.

Викликана функція працюї з копією фактичних аргументів, тому жодна зміна формальних параметрів не відображається на значеннях аргументів, з яких було зроблено копію. Можливість доступу не до копій значень аргументів, а до самих змінних, забезпечують вказівники. Сама функція також може бути викликана через вказівник.

Фактичні аргументи обчислюються та перетворюються таким чином:

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

  2. Якщо прототип відсутній, то відбуваються перетворення типів за замовчуванням.

Визначення функції може бути відсутнє, якщо:

1. ця функція є стандартною функцією мови С, наприклад, printf, getch, sin і т.д.;

- ця функція була раніше відкомпільована та записана в бібліотеку, або об’єктний файл. Уцьому випадку опис функції повинен бути обов’язково до виклику функції. Для стандартних функцій їх описи містяться в header файлах (stdio.h, ctype.h, math.h інш.), які необхідно включити в програму #include <stdio.h> .

2. Опис функції може бути відсутній, якщо в даному файлі визначення функції знаходиться раніше ніж виклик цієї функції. Практика показує, щоб зменшити кількість можливих помилок опис функцій слід вказувати завжди.

Зовнішні змінні.

З вище приведеного можна зробити висновок, що зв'язок за даними між функціями можна організувати через аргументи, які передаються функції, та результат (значення, яке повертає функція). Однак, в мові С передбачено ще третій спосіб - це зовнішні змінні. Якщо певна змінна декларована як зовнішня відносно даної функції  external, ця змінна є видимою в зоні дії функції і в тілі функції виконуються всі операції над нею, тобто значення зовнішньої змінної передається зовнішній програмі і може змінюватися всіма функціями, для яких вона є зовнішньою.

Рекурсивні функції.

Будь-яка функція в програмі може бути викликана рекурсивно, тобто, вона може викликати сама себе. Компілятор не обмежує число рекурсивних викликів однієї функції. При кожному виклику нові комірки пам’яті виділяються для формальних параметрів та локальних змінних класу пам'яті auto i register, так, що ]х значення з попередніх викликів є недоступні і не знищуються.

Для змінних, декларованих на внутрішньому рівні з класом пам'яті static або extern, нові комірки пам'яті не виділяються при кожному рекурсивному виклику. Виділена під них пам'ять зберігається на протязі всього часу виконання програми. Хоча компілятор С не обмежує кількість рекурсивних викликів функції, операційне середовище може накласти практичне обмеження. Оскільки кожен рекурсивний виклик вимагає додаткової стекової пам’яті, то занадто велика кількість рекурсивних викликів може призвести до переповнення стеку.

Особливістю написання рекурсивних функцій є організація виходу (завершення роботи) з функції, що попереджає її від зациклювання. Тобто, в функції необхідно перевіряти вхідні дані і при певних їх значеннях виконати return (вихід).

Наприклад:

/* Функція обчислення факторіалу заданого числа */

int fact (int n)

{ if (n > 1)

return n*fact(n-1);

else

return 1; /* вихід з функції при n=1 */ }

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]