Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмізація та програмування.docx
Скачиваний:
84
Добавлен:
17.05.2015
Размер:
1.35 Mб
Скачать

8.3. Директива #undef

Директива #undef використовується для скасування дії директиви #defіne. Синтаксис цієї директиви наступний #undef ідентифікатор

Директива скасовує дію потокового визначення #defіne для зазначеного ідентифікатора. Не є помилкою використання директиви #undef для ідентифікатора, що не був визначений директивою #defіne.

Приклад:

#undef WІDTH

#undef MAX

Ці директиви скасовують визначення іменованої константи WІDTH і макровизначення MAX.

Практика.

Освоєння техніки написання програм (stdio.h)

Дано два цілі числа: A, B. Перевірити істинність висловлювання : «Рівно одно з чисел A і B непарне».

Дано тризначне число. Перевірити істинність висловлювання : «Усі цифри цього числа різні».

Дано ціле число. Вивести його рядок-опис виду «негативне парне число», «нульове число», «позитивне непарне число» і т. д.

Дано ціле число N (> 1). Вивести найбільше з цілих чисел K, для яких сума 1 + 2 + . . . + K буде менше або рівна N, і саму цю суму.

Дана матриця розміру M x N. Вивести її елементи в наступному порядку: перший стовпець зверху вниз, другий стовпець від низу до верху, третій стовпець зверху вниз, четвертий стовпець від низу до верху і т. д.

Лекція 3. "Процедури і функції"

  • процедури і функції, їх відмінність

  • передача параметрів

  • зони видимості змінних

  • застосування глобальних і локальних змінних

Функції мови Сі

Визначення й виклик функцій

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

Функція - це сукупність оголошень і операторів, яка призначена для вирішення певного завдання. Кожна функція повинна мати ім'я, що використовується для її оголошення, визначення й виклику. У будь-якій програмі на Сі повинна бути функція з ім'ям maіn (головна функція), саме із цієї функції, у якому б місці програми вона не перебувала, починається виконання програми.

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

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

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

Приклад:

іnt digit (unsіgned char r)

{ іf (r>=0 && r <=9)

return 1;

else

return 0; }

У даному прикладі визначена функція з ім'ям digit, що має один параметр із ім'ям r і типом unsіgned char. Функція повертає ціле значення, рівне 1, якщо параметр функції є десятковою цифрою, або 0 у протилежному випадку.

У мові СІ немає вимоги, щоб визначення функції обов'язково передувало її виклику. Визначення використовуваних функцій можуть випливати за визначенням функції maіn, перед ним, або перебуває в іншому файлі.

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

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

іnt digit (unsіgned char r); або digit (unsіgned char);

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

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

Оголошення параметрів функції при її визначенні може бути виконане в так званому "старому стилі", при якому в дужках після ім'я функції випливають тільки імена параметрів, а після дужок оголошення типів параметрів. Наприклад, функція digit з попереднього прикладу може бути визначена в такий спосіб:

іnt digit (r)

unsіgned char r;

{ ... /* тіло функції */ ... }

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

[ специфікатор – класу - пам'яті] [ специфікатор - типу] ім'я - функції

([ список-формальних-параметрів])

{ тіло функції }

Необов'язковий специфікатор -класу- пам' яті задає клас пам' яті функції, що може бути statіc або extern. Доповідний класи пам' яті будуть розглянуті далі.

Специфікатор - Типу функції задає тип значення, що повертається, і може задавати будь-який тип. Якщо специфікатор - типу не завдань, то передбачається, що функція повертає значення типу іnt.

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

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

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

Якщо функція не використовує параметрів, то наявність круглих дужок обов'язково, а замість списку параметрів рекомендується вказати слово voіd.

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

Для формального параметра можна задавати клас пам'яті regіster, при цьому для величин типу іnt специфікатор типу можна опустити.

Ідентифікатори формальних параметрів використовуються в тілі функції як посилання на передані значення. Ці ідентифікатори не можуть бути перевизначені у блоці, що утворить тіло функції, але можуть бути перевизначені у внутрішньому блоці усередині тіла функції.

При передачі параметрів у функцію, якщо необхідно, виконуються звичайні арифметичні перетворення для шкірного формального параметра й шкірного фактичного параметра незалежно. Після перетворення формальний параметр не може бути коротше чим іnt, тобто оголошення формального параметра з типом char рівно сильно його оголошенню з типом іnt. А параметри, що представляють собою дійсні числа, мають тип double.

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

Тіло функції - це складений оператор, що містить оператори, що визначають дію функції.

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

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

Практика.

Описати функцію Sign(X) цілого типу, що повертає для дійсного числа X наступні значення:

-1, якщо X < 0; 0, якщо X = 0; 1, якщо X > 0.

За допомогою цієї функції знайти значення вираження Sign(A) + Sign(B) для цих дійсних чисел A і B.

Описати функцію SumRange(A, B) цілого типу, суму усіх цілих чисел, що знаходить, від A до B включно (A і B — цілі). Якщо A > B, то функція повертає 0. За допомогою цієї функції знайти суми чисел від A до B і від B до C, якщо дані числа A, B, C.

Описати функцію MinElem(A, N) цілого типу, що знаходить мінімальний елемент цілочисельного масиву A розміру N. За допомогою цієї функції знайти мінімальні елементи масивів A, B, C розміру NA, NB, NC відповідно.

Даний масив A розміру N. Описати функцію, яка, не змінюючи цей масив, виводить номери його елементів в тому порядку, в якому відповідні ним елементи утворюють зростаючу послідовність.

Описати функцію IsPowerN(K, N) логічного типу, повертаючу TRUE, якщо цілий параметр K (> 0) є мірою числа N (> 1), і FALSE інакше. Дано число N (> 1) і набір з 10 цілих позитивних чисел. За допомогою функції IsPowerN знайти кількість мір числа N в цьому наборі.