Розділ 1. Основи програмування
1.1. Історія розвитку мови С
Мова програмування С була розроблена у 1972 році працівником компанії AT&T Bell Laboratories, фахівцем із системного програмування Деннісом Рітчі. Спочатку вона розроблялась як мова для операційних систем, зокрема, для Unix, але згодом отримала широке розповсюдження.
У 1978 році опублікована перша специфікація мови програмування С. Широке використання мови С на комп’ютерах різних апаратних платформ призвело до появи різноманітних варіацій цієї мови, що зумовило потребу її стандартизації. У 1983 Американський Інститут Стандартів (ANSI) сформував Технічний Комітет для створення стандарту мови С, у 1989 році вийшов перший стандарт цієї мови, а в 1990 році цей стандарт адаптовано до вимог Міжнародної організації стандартизації ISO. Похідними від мови С є мови програмування C++, C#, а також Java, Scala тощо.
Програмування на мові С, здійснюється шляхом звернення до бібліотечних функцій та написання користувацьких функцій.
Серед основних переваг мови С виділяють такі:
- кросплатформність;
- компактність та універсальність коду;
- швидкість виконання програм;
- гнучкість;
- висока структурованість.
Мова С часто використовується для системного програмування, тобто розробки компіляторів, трансляторів, операційних систем, систем керування базами даних, мікроконтроллерів тощо.
1.2. Структура програми
Отримання виконуваного коду програми на мові Сі здійснюється в декілька етапів: препроцесорна обробка тексту програми, компіляція, редактування зв’язків (компоновка) та виконання. Препроцесорна обробка програми здійснюється за допомогою спеціальної програми-препроцесора CPP.EXE перед компіляцією програми. Задачею препроцесора є перетворення вхідного тексту програми. На виході препроцесора отримується змінений текст програми на мові Сі. Компiлятор мови Turbo С сам викликає препроцесор для обробки тексту програми, але препроцесор може бути запущений також автономно, наприклад:
C:\>cpp iм’я.c
В останньому випадку на диску створюється перетворений препроцесором текстовий файл *.i (з тим самим iменем та розширенням ‘i’). Керування роботою препроцесора здійснюється за допомогою директив. Директиви препроцесора - це команди, якi препроцесор виконує для обробки тексту перед компіляцією програми.Директиви препроцесора не транслюються в машиннi коди i впливають лише на текст програми, що йде пiсля цiєї директиви до кiнця файлу. Директива препроцесора повинна починатися з символа #. Перед символом # та пiсля нього можуть бути пропуски. В одному рядку допускається використання тiльки однiєї директиви. В рядку, де розмiщена директива, не повинно бути iнших операторiв. Пiсля директиви препроцесора крапка з комою не ставиться, але може задаватися коментар. Директиви препроцесора включають команди визначення i замiни iдентифiкаторiв, макроси, включення файлiв та команди умовної компiляцiї.
Структура програми має таку послідовність:
- Коментар про призначення програми.
- Підключення бібліотек.
- Визначення препроцесора.
- Оголошення прототипів функцій.
- Оголошення глобальних змінних.
- Визначення головної функції.
- 1. Оголошення локальних змінних.
- 2. Виклик функцій.
- 3. Оператори.
- Визначення інших функцій.
Коментарі використовуються для пояснень і для тимчасового “вимкнення” певного фрагмента програми під час її відлагодження. Жодних дій вони не виконують, тому що ігноруються компілятором.
Коментарі бувають одно- та багаторядкові. Однорядкові коментарі позначаються символами // зліва перед текстом коментаря:
// Текст після символа // і до кінця рядка є коментарем
// Це також однорядковий коментар
Багаторядкові коментарі записуються між символами /* (початок коментаря) та символами */ (кінець коментаря).
/*
Коментар до програми
може займати
кілька рядків
*/
Основні функції мови С визначаються в системних бібліотеках і описуються в заголовочних файлах (табл. 3.1). Список заголовочних файлів визначений стандартом мови.
Таблиця 3.1.
Основні заголовочні файли
Назва |
Призначення |
conio.h |
функції консольного введення-виведення |
ctype.h |
функції для перевірки літер |
float.h |
константи для розмірів дійсних типів |
math.h |
математичні функції та макроси |
stdarg.h |
засоби перебору аргументів функції, кількість і типи яких наперед невідомі |
stdio.h |
функції введення-виведення, а також типи та макроси |
stdlib.h |
функції перетворення чисел, запиту пам’яті тощо |
string.h |
функції для роботи з рядками символів |
time.h |
типи і функції, пов’язані з датою та часом |
Заголовочні файли мають розширення .h і підключаються директивою #include. Вони містять заголовки (прототипи) функцій, а також оголошення типів, констант та змінних з ключовим словом extern. Перевага заголовочних файлів полягає у тому, що створений заголовочний файл для одного модуля (одного чи декількох c-файлів) програми, можна використати у іншій програмі. Переважно для кожного c-файла створюється власний заголовочний файл з таким самим ім’ям і розширенням h. І, навпаки, для кожного заголовочного файла створюється c-файл з реалізацією функцій, оголошених у h-файлі. При підключенні у програмі заголовочного файла його текст (а з ним і текст відповідного c-файла) автоматично вставляється до програми замість рядка з відповідною директивою #include. При компіляції програми усі підключені заголовочні файли з файлами їхньої реалізації перекомпільовуються, тому підключення надмірної кількості заготовочних файлів сповільнює компіляцію програми. Хоча в заголовочних файлах містяться всі описи стандартних функцій, у код програми включаються лише ті функції, які використовуються у програмі.
Приклад 3.1. Написати програму, що виводить повідомлення на екран.
// перша програма мовою С
#include <stdio.h> /* під’єднання бібліотечного файлу з описами функцій ведення та виведення */
int main()
{
printf("My first C-program!\n");
return 0;
}
Початкова програма, написана на С/С++ у вигляді текстового файла, проходить такі три етапи опрацювання:
- 1) препроцесорне перетворення тексту;
- 2) компіляція;
- 3) компонування (редагування зв’язків або збірка).
(Для ознайомлення з повним текстом статті необхідно залогінитись)