
- •1.1 Алгоритм і його властивості
- •1.2 Мови програмування
- •1.3 Системи числення
- •2 Засоби мови с
- •2.1 Алфавiт мови
- •2.2 Константи
- •2.4 Оголошення даних
- •3 Структура програми, директиви препроцесору
- •4 Елементарні алгоритми
- •4.1 Лiнiйна програма
- •4.2 Розгалуження
- •4.3 Цикли
- •6 Вкладені алгоритми
- •7 Складні типи даних
- •9 Процедури
- •9 Файли
- •10 Динамічні конструкції даних
- •11 Сортування
- •12 Пошук
- •13 Класи
3 Структура програми, директиви препроцесору
Програма мовою С складається iз сукупностi функцiй, серед яких одна є головною i називається main(), а решта – пiдпорядкованi, та директив препроцесору. Кожна функція, в т. ч. main(), має блочну структуру, тобто тіло функції охоплюється відкритою і закритою фігурними дужками. Функція main() може мати вхідні параметри, її (exe-файл) можна викликати і запускати на виконання з інших програм, в т. ч. складених іншими мовами, як підпрограму.
Тіло будь-якої функції складається з послідовності операторів. Порівняно з іншими мовами програмування мова С має дещо ширше поняття оператора. Наприклад, воно може включати в себе оголошення даних, оскільки під час оголошення допустима ініціалізація змінних. Зауважимо, що оголошення даних – само по собі не дія. Звернення в програмі до іншої функції теж самостійний оператор, бо дозволяється викликати функцію не тільки, як частину якогось виразу, але й самостійно, автономно без використання значень, які вона повертає.
Препроцесор являє собою програму, яка обробляє початковий модуль до компiляцiї згiдно з вiдповiдними директивами. Директива препроцесору може бути розмiщена в будь-якому мiсцi початкового модуля, а область її дії поширюється на частину програми від того місця, де вона записана, до кінця програми. Директиви препроцесору пишуться спеціально створеною для них мовою. Вiд iнших об’єктiв програми вони вiдрiзняються наявнiстю знака # (дiєз). Найбiльш вживаними з них є такі:
include <iм’я файлу> – під’єднання до програмного модуля файлу, який знаходиться в стандартному системному каталозi;
include "iм’я файлу" – те ж, але в заданому каталозі. Вона працює так: спочатку компілятор шукає ім’я файлу в стандартному каталозі, а якщо він там не знайдений, то в заданому;
define iдентифiкатор текст – замiна в тексті програми iдентифiкатора на текст;
undef iдентифiкатор – вiдмiна дiї поточної директиви # define;
if – умовна компiляцiя, визначення, чи потрiбно пiд’єднувати до програмного модуля певну його частину. Ця директива багато де в чому подібна до умовного оператора if. Вона може містити логічні операції та знаки операцій відношення;
else – альтернатива до директиви #if;
elif – дозволяє розширити комбінацію директив if–else, встановити додаткові умови та відповідні їм дії. Цю директиву можна застосувати лише для деяких найновіших компіляторів;
endif – кінець області дії директиви #if;
error текст – обробка помилок пiд час компiляцiї програми;
– порожня директива, iгнорується компiлятором.
Завдяки наявності директив препроцесору програміст має можливість регулювати довжину програми. Наприклад, якщо в програмі використовуються математичні функції, то слід використати директиву #include<math.h>, тоді компілятор додасть до програми файл math.h з відповідними математичними функціями, і не варто – в протилежному випадку. Додамо, що мова С має порівняно багато різних стандартних (вбудованих) функцій, з яких доцільно під’єднувати до програмного модуля лише потрібні.
Директива #if дозволяє регулювати використання тих або інших функцій залежно від типу комп’ютера та операційної системи, попереджувати повторне під’єднання директивою #include одних і тих же функцій тощо.
Директива #error, як правило, встановлюється всередині директиви #if, тоді вона видає повідомлення про помилку, якщо задовільняється певна задана умова.
Дія директиви #define поширюється не лише на директиви препроцесору, але й на весь програмний блок. Нею програміст може скористатися для заміни в програмі ідентифікатора на константу і таким чином зекономити пам’ять. Але вона невигідна тоді, коли ідентифікатор – ім’я змінної, яка в процесі виконання програми приймає різні значення, бо змінити їх неможливо. Цю директиву називають ще макросом – великою командою.
Ідентифікатор директиви #define може мати параметри, тоді вона працює як функція. Приклад використання директиви #define з параметрами та її переваги і недоліки буде подано в розділі про функції.
Наявнiсть директив препроцесору в програмах необов’язкова.
Необхідно зазначити, що кожний конкретний компілятор може мати свої директиви та способи їх використання. Наприклад, у програмах деяких версій мови С++ ім’я файлу, як параметр директиви #include, пишеться без розширення h.