рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

МОДУЛЬНЕ ПРОГРАМУВАННЯ

МОДУЛЬНЕ ПРОГРАМУВАННЯ - Конспект, раздел Образование, Конспект лекцій СИСТЕМНЕ ПРОГРАМУВАННЯ Набір Зв'язаних Процедур Разом З Даними, Які Вони Обробляють, Називається Мод...

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

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

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

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

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

5.1 Простори імен

Будь-яка реальна програма складається з деякої кількості окремих частин. Як приклад наведемо просту програму, що видає на екран повідомлення «Добридень, мир!»:

 

#include <iostream>

using namespace std;

int main(int argc, char *argv[])

{

cout << “ Добридень, мир!”;

return 0;

}

 

Навіть ця програма складається з двох частин: коду користувача, що вимагає вивести «Добридень, мир!», та модуля вводу – виводу, що підключається до програми директивою #include <iostream> і безпосередньо здійснює вивід повідомлення.

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

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

Простори імен дозволяють захистити всі ідентифікатори програми від різноманітних колізій.

5.1.1 Інструкція namespace. Оператор розширення області видимості (::)

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

Члени простору імен оголошуються за допомогою інструкції namespace:

 

namespace namespace_name

{

// послідовність оголошень та визначень

}

 

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

Наприклад:

 

namespace MyNameSpace

{

int i, k;

void myfunc(int j){cout << j;}

class myclass

{

int i;

public:

void seti(int x){i = x;}

int geti() {return i;}

};

}

 

Тут імена змінних i та k, функціяmyfunc(), а також клас myclass знаходяться в області видимості, визначеній простором імен MyNameSpace.

До імен, оголошених в просторі імен, всередині цього простору можна звертатися безпосередньо, указуючи тільки ідентифікатор. Наприклад, в просторі імен MyNameSpace в інструкції return i; змінна i задана без вказівки простору імен.

Проте при зверненні ззовні простору імен до об'єктів, оголошених всередині цього простору, потрібно використовувати оператор розширення області видимості (::):

 

namespace_name::member

 

Наприклад, щоб присвоїти значення 10 змінній i в тій частині програми, яка не входить до простору імен MyNameSpace, потрібно використати наступну конструкцію:

 

MyNameSpace::i = 10;

 

Є можливість оголосити в програмі більше ніж один простір імен з тим же ім'ям. Це дозволяє розділяти простір імен одного модуля на декілька файлів або навіть розділити простір імен всередині одного модуля.

Як приклад модуля розглянемо програму, що містить оголошення інтерфейсу і реалізацію стека символів.

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

- надати інтерфейс користувача для стека (наприклад, функції push() і pop(), які поміщають та дістають дані зі стека);

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

- виконати ініціалізацію даних стека до його першого використання.

Як варіант, інтерфейс користувача модуля stack може бути оголошений і використаний так:

 

namespace stack

{

void push(char);

char pop();

}

 

void f()

{

stack:: push(‘c’);

if (stack:: pop() != ‘c’) error(“Таке неможливо!”);

}

 

Оператор розширення області видимості stack:: в реалізації функції f() означає, що імена функцій pop() і push() беруться з простору імен stack. Використання таких же імен в іншому місці не приведе до плутанини.

Визначення (реалізація алгоритмів) стека може бути зроблено в окремо компільованій частині програми:

 

namespace stack

{

const int max_size = 200;

char v[max_size];

int top = 0;

void push(char c)

{

// перевірити на переповнення стека і помістити в стек

}

char pop()

{

// перевірити, чи не порожній стек, і дістати символ із стека

}

}

 

Ключовим тут є те, що інтерфейс користувача відокремлений від способу представлення даних і алгоритмів реалізації функцій stack::push() і stack::pop().

5.1.2 Інструкція using

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

 

using namespace namespace_name;

 

using namespace_name::member;

 

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

 

using namespace std;

 

Ця інструкція робить доступними прямо всі об'єкти стандартної бібліотеки C++, зокрема, стандартні потоки вводу – виводу cin, cout і cerr. Без використання цієї інструкції їх довелося б задавати як std::cin, std::cout і std::cerr, відповідно.

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

 

// друга форма інструкції using

using MyNameSpace::k; // видимою робиться тільки змінна k

k = 10;

// перша форма інструкції using

using namespace MyNameSpace; // видимими робляться всі члени

// простору імен

i = 10;

5.2 Роздільна компіляція

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

Користувачі, що використовують стек і, можливо, інтерфейси інших програм, повинні включити їх заголовні файли в свої програми за допомогою директиви препроцесора #include:

 

#include “stack.h”

void f()

{

// …

}

 

Фрагменти програм, що містять виконавчі інструкції, поміщаються у файли реалізації з розширенням .c (для програм на мові C) або .cpp (для програм на мові C++). Код програми, наведеної вище, можна помістити, наприклад, у файл user.cpp.

Програма, що реалізує алгоритми інтерфейсу stack, також повинна містити в собі інструкцію включення заголовного файлу з інтерфейсом:

 

#include “stack.h”

namespace stack

{

// …

}

 

Інструкції цієї програми повинні бути поміщені у файл з ім'ям stack.cpp.

Графічно згадані фрагменти програми та їх зв'язки можна представити таким чином:

 

 
 

Малюнок 5.1 Зв'язки між роздільно компільованими частинами програми

 

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

5.2.1 Директива #include

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

Синтаксис використання директиви один з наступних:

 

#include “header_name”

 

#include <header_name>

 

В якості аргументу header_name інструкції має бути задано ім'я файлу з розширенням .h (або .hpp) або, відповідно до стандарту на мову C++, ідентифікатор заголовка, по якому компілятор знайде необхідний файл.

Якщо у складі імені заголовного файлу заданий шлях до файлу, компілятор, використовуючи вказаний шлях, знаходить файл, відкриває його і включає вміст файлу замість директиви #include.

Якщо шлях до файлу не заданий, а задано тільки просте ім'я файлу з розширенням, тоді перша і друга форма синтаксису розрізняються алгоритмом пошуку заголовного файлу по довідниках файлів.

Форма з аргументом “header_name”, в якій ім'я заголовного файлу задається в подвійних лапках, змушує компілятор шукати заголовний файл спочатку в довіднику поточного файлу, тобто файлу, який містить директиву #include, потім в довідниках файлів по ієрархії, які включають (#include) поточний файл. Якщо заголовний файл у вказаних довідниках не був знайдений, файл шукається в довіднику include компілятора (для Visual C++ 7.1 – це довідник “диск:Program FilesMicrosoft Visual Studio .NET 2003Vc7include”). Як тільки заголовний файл знайдений, його вміст заміщає директиву #include.

Наприклад:

 

#include “defs.h”

 

Форма <header_name>, в якій ім'я заголовного файлу задається в кутових| дужках, має на увазі, що треба включити в програму бібліотечний заголовний файл, і примушує компілятор шукати файл відразу в довіднику include компілятора (довідник “диск:Program FilesMicrosoft Visual Studio .NET 2003Vc7include” для Visual C++ 7.1). Якщо заголовний файл знайдений, його вміст поміщається замість директиви #include.

Наприклад:

 

#include <stdio.h>

 

Відповідно до стандарту на мову C++ в директиві #include в кутових |дужках замість імені реально існуючих бібліотечних заголовних файлів потрібно задавати стандартні ідентифікатори, по яких компілятор знаходить необхідні файли. Нові заголовки є абстракціями, що гарантують оголошення потрібних в програмах прототипів і визначень мови Standard C++. Оскільки нові заголовки не є іменами файлів, їх потрібно задавати в кутових| дужках без розширення .h або .cpp. Нижче представлені приклади таких заголовків:

 

#include <iostream>

#include <fstream>

#include <vector>

#include <string>

 

6 МАКРОЗАСОБИ. ПРОГРАМУВАННЯ НА АСЕМБЛЕРІ

У мові системного програмування важко, якщо взагалі можливо, обійтися без макрозасобів – засобів програмування за допомогою макросів. Макроси включаються в програму за допомогою особливих конструкцій мови - директив, і обробляються спеціальним препроцесором на текстовому рівні перед запуском в роботу компілятора мови C++.

– Конец работы –

Эта тема принадлежит разделу:

Конспект лекцій СИСТЕМНЕ ПРОГРАМУВАННЯ

Конспект лекцій... по дисциплiні СИСТЕМНЕ ПРОГРАМУВАННЯ...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: МОДУЛЬНЕ ПРОГРАМУВАННЯ

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

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

Оголошення
В мові С++ кожне ім'я (ідентифікатор) слід оголосити перш, ніж воно буде використовуватися в програмі. Це означає, що потрібно вказати його тип, щоб компілятор знав, до якого виду об'єктів має відн

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

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

Типи даних користувача
Описані раніше вбудовані типи даних мови C++ можуть бути доповнені новими типами даних, визначеними самим користувачем. Типи даних користувача діляться на три групи: переліки, структури й об'єднанн

Структури мови C
Масив є сукупністю елементів одного типу, а структура є сукупністю елементів різних типів. Оголошення структури має наступний формат:   struct struct_name {

Оголошення typedef
Оголошення, що починається з ключового слова typedef, вводить нове ім'я (синонім) для типу, а не оголошує нову змінну цього типу. Формат оголошення typedef наступний:   typed

Масиви як аргументи
Якщо в якості аргументу функції задається масив, то передається вказівник на його перший елемент. Наприклад:   int strlen(const char*); void f() {

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

Макрос WINAPI
Оскільки компілятор Visual C++ більше не підтримує ключових слів __pascal, __fortran та __syscall, їх дію рекомендується емулювати за допомогою описаних вище ключових слів __cdecl, __stdcall або __

ПРОГРАМУВАННЯ ВИКЛЮЧЕНЬ
Виключною ситуацією, або виключенням (exception), називається переривання нормального потоку виконання програми у відповідь на непередбачену або аварійну подію. Події, що приводять до викл

Виключення Win32
Разом з програмними викликами виключень за допомогою інструкції throw, виключення генеруються системними програмами Win32 API у відповідь на збій апаратного або програмного забезпечення. Такі виклю

Обробка виключень Win32
Існує декілька способів обробки виключень Win32. Найбільш простий з них полягає в використанні блоку catch з трьома крапками:   try { // … // генер

Директиви препроцесора
Існує 14 стандартних директив препроцесора:   #include #define #undef #if #ifdef #ifndef #elif #else #

Макроси
Директива #define для оголошення макросів має дві синтаксичні форми:   #define ідентифікатор макроозначення #define ідентифікатор (список параметрів) макроозначення

Конструктори
Раніше наведене оголошення класу CFrame дозволяє ініціалізувати змінні-члени об'єктів класу шляхом виклику програмою користувача функції-члена класу SetCoord(). В якості іншого, стандартно

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

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

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

Переваги спадкування
Як випливає з приведених вище простих прикладів, спадкування дозволяє повторно використовувати створені раніше фрагменти програм і структури даних. Це дозволяє уникнути непотрібного дублювання прог

Конструктори приведення
Конструктор приведення класу — це конструктор з єдиним аргументом, тип якого відрізняється від типу класу. Такий конструктор звичайно ініціалізує новий об'єкт, використовуючи літерали, або дані змі

УЗАГАЛЬНЕНЕ ПРОГРАМУВАННЯ
Узагальнене програмування з використанням шаблонів мови C++ полегшує генерацію сімейств функцій або класів, що оперують множинами даних різних типів. При цьому не виникає необхідності створювати ок

Клас string
У мові C++ для представлення і обробки рядків є дві можливості. По-перше, можна використовувати символьний масив, що закінчується нулем і є рядком в стилі мови C, як це й робилося практичн

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

Потоки вводу - виводу
Як вже мовилося раніше, якщо програма на мові C починає виконуватися, автоматично відкриваються три потоки: stdin, stdout і stderr.Щось схоже має місце при завантаженні програми, написаної на мові

Класи потокового вводу - виводу
У C++ ввід - вивід забезпечується підключенням до програми заголовного файлу <iostream>. Саме в цьому файлі оголошені класи, що підтримують операції вводу – виводу. Система вводу – в

Прапори формату
Кожен потік вводу - виводу пов'язаний з набором прапорів формату (format flags), які управляють способом форматування інформації і є бітовими масками. Ці маски оголошені в класі ios як дані перелік

Закриття файлу
Для закриття файлу використовується функція-член| close(). Наприклад, щоб закрити файл, пов'язаний з потоком mystream, необхідна наступна інструкція:   mystream.close ();

Контроль стану вводу - виводу
В системі вводу - виводу C++ підтримується інформація про стан після кожної операції вводу - виводу. Поточний стан потоку вводу - виводу, який зберігається в об'єкті типу iostate, є переліком, визн

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

Мова програмування Visual Basic .NET
Хоча мови програмування керований C++, С# та Visual Basic .NET (VB) семантично мають практично однакові можливості, оскільки всі вони базуються на загальній специфікації мов програмування .NET (CLS

Цикл For
В мові С++ цикл for має дещо інший синтаксис, ніж цикл For в мові VB, але концепція залишається тою ж самою, якщо не зважати на те, що операція, яка виконується в кінці кожної ітерації, має бути вк

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги