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

Структура програми

Метою граматики мов програмування високого рівня є програма. Вихідна програма на мові програмування, як правило, складається з наступних частин (вперше ці вимоги були сформульовані в мові Cobol):

    • Розділ ідентифікації - область, яка містить найменування програми, а також додаткову інформацію для програмістів та / або користувачів.

    • Розділ зв'язку - фрагмент тексту, що описує зовнішні змінні, які передаються викликаючою програмою (якщо така є), тобто ту частину вихідних даних, яка обов'язково надходить на вхід програми при її запуску. Ці змінні часто називають параметрами програми.

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

    • Розділ даних - ідентифікація (декларація, оголошення, опис) змінних, що використовуються в програмі, та їх типів. Поняття типу дозволяє здійснювати перевірку даних на сумісність в операціях ще на етапі трансляції програми і відкинути неприпустимі перетворення.

    • Програмна частина, яка містить опис процесів обробки даних. Її елементами є оператори і стандартні функції, що входять до складу відповідної мови програмування.

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

Структура програми на С/C++ має наступну РБНФ:

програма = директиви_препроцесора [зовнішні_оголошення] функції

Однією із основних її структурних одиниць є директиви препроцесора. Препроцесор – це програма, яка аналізує програмний код і готує його для роботи компілятора. Команди, які має обробляти препроцесор, записуються у вигляді директив. Директиви препроцесора записуються в окремих рядках і починаються символом #. Розрізняють наступні директиви препроцесора:

  • #include - директиви підключення ресурсів;

  • #define - макровизначення;

  • #if, #elif, #else, #endif - директиви умовної компіляції тощо.

Директиви підключення ресурсів. Служать для підключення до тексту програми текстів заголовних файлів (мають стандартне розширення .h). Заголовний файл – це файл, що містить описи деяких функцій та оголошення типів даних і констант, які використовуються цими функціями. Список заголовних файлів визначається стандартом мови.

Існують два способи підключення директиви #include:

  1. # include <ім'я> - підключення стандартних заголовних файлів;

  2. # include “ім'я” - підключення заголовних файлів користувача.

Різниця між ними полягає в тому, де препроцесор буде шукати файли-ресурси, які необхідно підключити для повної підготовки коду програми до компіляції: якщо ім’я файла взяте в кутові дужки <…>, то пошук буде вестись в наперед визначених каталогах; якщо ім’я взяте в лапки, то препроцесор шукає його в поточному каталозі, де міститься і основний файл компілювання.

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

#include <iostream> // підключення засобів потокового введення-виведення

#include < stdio.h> // підключення засобів форматованого введення-виведення

Основні заголовні файли, які входять до складу стандартної бібліотеки, подані в табл.7.

Таблиця 7. Основні заголовні файли стандартної бібліотеки С/С++

Заголовний файл

Вміст

<iosream.h>

прототипи для функцій стандартних вхідних і вихідних потоків

<iomanip.h>

прототипи функцій для маніпуляторів, що дозволяють форматувати потоки даних

<math.h>

прототипи функцій математичної бібліотеки

<stddef.h>

загальні визначення типів, що використовуються в С/С++ для виконання деяких обчислень

<stdio.h>

прототипи для функцій вводу/виводу стандартної бібліотеки і інформація, що ними використовується

<stdlib.h>

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

<time.h>

прототипи функцій і типи для функцій управління часом і датою

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

Визначаються макроси директивою препроцесора #define. Формат задання:

#define ім'я_макросу текст_макросу

Перед компіляцією замість імені макроса в програму підставляється його значення.

Наприклад,

#define РІ 3.14159

Дана директива вказує замінити всі появи у тексті програми символьної константи РІ на чисельну константу 3.14159. Символьні константи дозволяють програмісту створювати ім’я для константи і використовувати його в будь-якому місці програмного коду за необхідності. Якщо є необхідність змінити значення константи у всій програмі, то достатньо це зробити в одному місці програми, в директиві #define, і після повторної компіляції програми всі включення константи в програму будуть автоматично замінені.

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

Розглянемо наступне макровизначення з одним аргументом для знаходження площі круга:

#define CIRCLE_AREA (x) ((PI)*(x)*(x))

Кожен раз, коли в програмному коді з’явиться CIRCLE_AREA (x), значення х підставляється замість х в тексті заміни, символьна константа РІ автоматично заміняється її значенням (визначеним раніше), і макрос розширюється в програмі. Наприклад, оператор

area=CIRCLE_AREA (4)

розширюється в

area=((3.14159)*(4)*(4)).

Макроси є спадщиною мови С, і в С++, зазвичай, замінюються більш безпечними можливостями мови, такими, як шаблони, inline-функції, перерахування enum, перевизначення типів typedef.

Символьні константи і макроси можна відмінити, використовуючи директиву препроцесора #undef. Ця директива відміняє визначення символьної константи або імені макроса.

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

Директиви умовної компіляції. Умовна компіляція дозволяє управляти виконанням директив препроцесора і компіляцією програмного коду.

Директиви умовної компіляції: #if, #elif, #else та #endif. Кожна конструкція #if закінчується #endif. Умовні конструкції препроцесора, що перевіряють декілька варіантів, реалізуються за допомогою #elif (еквіваленту else if структури if) і #else (еквіваленту else структури if).

Порядок використання директив умовної компіляції наступний:

#if константний_вираз_1

#elif константний_вираз_2

#elif константний_вираз_3

#else

#endif

Кожна із умовних директив препроцесора оцінює значення цілочисельного виразу. Якщо цілий константний вираз у директиві #if має ненульове значення (TRUE), то при компіляції включаються всі наступні рядки до #elif або #endif або #else (elif діє як гілка else-if). Наприклад, змінюючи константу VERSION, можна керувати включенням файлів:

#define VERSION 3

#if VERSION == 1

#define INCLUDE_FILE "file_1.h"

#elif VERSION == 2

#define INCLUDE_FILE "file_2.h"

#else

#define INCLUDE_FILE "file_3.h"

#endif

#include INCLUDE_FILE

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

Рис. 2. Ідентифікатор змінної та його асоціація з коміркою пам'яті

Станам об’єкта, зображуваного змінною, відповідають її значення (числові та інші), що належать певному типу. Тип змінної та її ім’я задаються в інструкції оголошення імені змінної. В мові С/С++ відповідне оголошення представляється наступною РБНФ-нотацією:

оголошення_змінної = тип ім'я{, ім'я}.

Наприклад,

char c;

int a, b;

Інструкція оголошення імені змінної одночасно задає і ділянку пам’яті, на яку вказує ім’я змінної.

Імена змінних та інших об’єктів слід обирати так, щоб вони відображали їх зміст, наприклад, temperature, radius, circleLength. Завдяки таким змістовним іменам текст програми стає більш зрозумілим. Ім’ям змінної не може бути зарезервоване слово. Імена, означені в бібліотеках системи програмування, використовувати як імена змінних можна, але краще цього не робити. Також бажано дотримуватися таких угод:

  1. ім’я змінної починається з малої букви;

  2. якщо ім’я змінної утворено з кількох слів, то всі слова, окрім першого, записуються з великої букви, наприклад, circleLentgh;

  3. якщо потрібна невелика й відома наперед кількість змінних, що позначають однотипні сутності, то в кінці імені можна дописати номер, наприклад, radius1, radius2;

  4. імена i, j, k, m, n даються змінним цілих типів, які, зазвичай, позначають індекси (номери) або кількості.

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

Визначення змінної, окрім оголошення, задає її початкове значення (явно або неявно). Всі змінні повинні бути описані до їх використання. РБНФ-нотація визначення змінної у С/С++:

визначення_змінної = тип ім'я”=”значення {, ім'я “=” значення}

Наприклад,

int a=3, b=с=5;

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

Функція – це частина програми, що виконує логічно завершений набір дій. В C/С++ вона є єдиним способом представлення підпрограм. Формат оголошення функції:

тип_результату ім'я([параметри]) // заголовок функції

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

Тіло функції може містити описи констант, змінних і оператори мови, які відокремлюються символом «;». Описи даних можуть зустрічатися в будь-якому місці функції, але до першого звертання до змінної. Якщо параметри у функції відсутні, то в заголовку все рівно записуються круглі дужки.

Одна з функцій програми на мові C/С++ повинна мати ім'я main. Саме з неї починається виконання програми. Функція main визначає дії, що виконуються програмою, і викликає інші функції. Якщо програма містить тільки одну функцію, то вона і є головною (має ім'я main).

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

Розглянемо найпростіший приклад програми на C/С++ :

#include <iostream> // директива препроцесора

using namespace std; // простір імен

int main() // головна функція

{ cout << "Hello,world\n"; // виведення повідомлення на екран

system("pause"); // пауза

return 0; // повернення результату (вихід із функції)

}

Рядок #include (включити) означає, що препроцесор перед компіляцією програми має включити в неї вміст заголовного файлу iostream.h. У цьому файлі оголошено засоби потокового введення та виведення. Без включення цього файлу ім’я cout буде невизначеним і компілятор повідомить про цю помилку.

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

Частина програми

int main()

{ ...

}

визначає головну функцію main.

Операція << ("помістити в") пише свій перший аргумент у другий (рядок "Hello,world\n" у стандартний потік виведення cout). У даному рядку символ “\n“ є управляючим символом переходу на новий рядок.

За інструкцією system("pause"); виконання програми призупиняється і на екрані з’являється повідомлення, що треба натиснути будь-яку клавішу. Після її натискання програма завершується. Завдяки використанню управляючого символа “\n“, повідомлення виводиться в новому рядку. Якби його не було, повідомлення з’являлося б відразу після слів Hello, world!.

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