Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.О.П / 3_кол / Лекції / лекция_C++ (1)_у.doc
Скачиваний:
10
Добавлен:
30.05.2020
Размер:
107.52 Кб
Скачать

2. Препроцесор і макрообробка

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

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

Найчастіше використовуються в програмах директиви препроцесора #include і #define. Директива #include дає вказівку компілятору приєднати до програми файл, ім'я якого слідує відразу за цією інструкцією. За допомогою директиви #define відбувається пошук і заміна одного набору символів на іншій. Цю ж директиву препроцесора можна використовувати для визначення макросів. Макрос є частиною програми, яка може виглядати і діяти як функція. Вміст макросу, який задається після #define, підставляється під час роботи препроцесора і створює так званий вбудовуваний код. Макрос – це символічне ім'я деяких операцій. У мові C деякі бібліотечні функції реалізовані як макроси.

Макроси мають велике значення в C, але в C++ вони використовуються значно рідше. Перше правило про макроси: не використовуйте їх, якщо немає необхідності це робити. Практично кожен макрос свідчить про недолік в мові або програмі. Оскільки макроси змінюють код програми до обробки його компілятором, то вони створюють проблеми для багатьох інструментів розробки інтегрованого середовища. Тому при використанні макросів можна чекати гіршої роботи відладчиків, генераторів списків і так далі За допомогою макросів можна створити свою власну мову. Але якщо спробує зробити що-небудь нетривіальне в цьому напрямі, то це або неможливо, або дуже трудомістко.

Більшість компіляторів містять ряд корисних вбудованих макрокоманд, наприклад __DATE__, __TIME__, __LINE__ (дата, час, рядок і т. д.). Кожна така команда оточена двома знакам підкреслення. Зустрівши один з цих макросів, препроцесор робить відповідну заміну. Замість __DATE__ встановлюється дата. Замість __TIME__ – поточний час. Директива __LINE__ замінюється номером рядка вихідного тексту.

У мові C++ багато можливостей директив препроцесора можна замінити директивами мови. Більш того, автор мови Страуструп виражав свій намір звільнити мову від препроцесора.

Завдання для самостійної роботи. Вивчити директиви #define, #line, #if, #else, assert().

3. Етапи вирішення завдань на комп'ютері

Рішення будь-якої задачі на комп'ютері складається з декількох етапів:

  1. постановка завдання

  2. вибір моделі

  3. розробка методу рішення

  4. розробка алгоритму рішення

  5. складання програми

  6. відладка програми

  7. розрахунок завдання за програмою, обробка і аналіз результатів.

Перші два етапи, як правило, виходять за рамки можливостей студентів і вважаються заданими. Фактично формулювання завдання неявно закриває ці етапи. Останні етапи присутні, проте на шостий і сьомий етапи рідко акцентується увага. Для учбових програм ці етапи зводяться до простої перевірки рішення на 1–2 тестових завданнях. Для реальних завдань етапи шість і сім важливі. Що стосується обробки і аналізу результату, то це вимагає від програміста високого рівня кваліфікації, компетенції і глибини знання проблеми. У учбових завданнях студент, як правило, працює в рамках третього, четвертого і п'ятого етапів. Дуже часто виявляється, що третій етап для завдання відомий, а етапи три і чотири за своєю суттю тотожні, тобто вирішення третього етапу тотожне етапу чотири і, навпаки, алгоритм рішення фактично є методом рішення. Розподіл труднощів етапів три і чотири може бути найрізноманітнішим. Тут можливі будь-які комбінації труднощів. Якщо побудувати таблицю розподілу труднощів етапів три і чотири, вона може виглядати так.

Розподіли труднощів етапів 3 і 4

Важливим моментом третього етапу є вибір структури даних для вирішення поставленого завдання, від цього залежатиме метод рішення задачі і алгоритм його реалізації. Структура даних – це внутрішнє питання програми. Формат даних, який прийнятий для вирішення завдання на ПК, зовсім не обов'язково повинен відповідати (або збігатися) вигляду початкової інформації від джерела завдання. Програміст сам вирішує питання про те, в якому вигляді йому треба представити вхідну інформацію. Це не означає, що він повинен вимагати від замовника змінити форму представлення початкових даних. Форма представлення даних повинна мати природний вигляд, що склався. Питання об переформатування початкової інформації до зручного для програми вигляду повинне вирішуватися автоматично в рамках самої програми. Початкуючий програміст навіть для простих завдань, в яких питання про структуру даних не настільки важливе, повинен по можливості завжди продумувати питання про представлення даних. Н. Вірт в книзі «Алгоритми + структури даних = програми» підкреслює важливість питання про структуру даних при проектуванні програми.

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

Контрольні питання:

  1. Критерії оцінки проектуванні мови програмування.

  2. Що таке абстракція і її види.

  3. Критерії надійності програми.

  4. Препроцесор і його директиви.

  5. Перерахувати етапи вирішення завдань на комп'ютері

Література:

  1. Березін Б.І., Березін С.Б. Початковий курс С і C++. — М.: ДІАЛОГ-МІФІ, 1996

  2. Ван Тассел Д. Стиль, розробка, ефективність, відладка і випробування програм. — М.: Світ, 1981.

  3. Подбельський в.в. Мова Си++. — М.: Фінанси і статистика, 1996.

  4. Паппас До., Мюррей У. Программирование на С і C++. — Київ: «Ірина»; BHV, 2000.

6

Соседние файлы в папке Лекції