1.3. Методи структурування програм
Методи низхідного проектування та модульного програмування регламентують процес побудови архітектури програм на макрорівні. Методи структурування, навпаки, працюють на мікрорівні, регламентуючи процес створення програмного коду. В основу методів структурування програм покладено теорему про структурування, що її у 1965 році сформулював Бом і Джакопіні. Згідно з цією теоремою будь-яку програму можна побудувати з використанням лише трьох керуючих структур: послідовності, вибору та розгалудження.
Метою структурування є перетворення неструктурованої програми на еквівалентну їй структуровану, тобто таку, що складається з обмеженого набору керуючих алгоритмічних структур. Методи структурування ґрунтуються на поняттях функціонального вузла, а також на поняттях простої, елементарної і складеної програм [14].
Функціональним вузлом називається частина алгоритму, що має один вхід та один вихід. Прикладом функціонального вузла є окремий оператор – присвоєння, виклик процедури та інше.
Програма називається простою, якщо вона має один вхід, один вихід і через кожен її функціональний вузол проходить деякий шлях від входу до виходу. Пр0ста програма може містити прості підпрограми. Вся проста програма може розглядатись, як один функціональний вузол.
Елементарна програма – це проста програма, що не містить підпрограм, які складаються більше ніж з одного вузла. Зазначимо, що існує лише обмежена кількість елементарних програм, з яких основними є три програми, які зображені на рис.1.
Якщо функціональний вузол елементарної програми замінити елементарною програмою, утвориться складена програма. Якщо вузол складеної програми замінити елементарною програмою, знову утвориться складена програма. В такий спосіб із будь-якої множини елементарних програм утворюється певний клас складених програм. Так, множина {послідовність, if…else} формує програму без циклів, а множина {if…else, while} приводить до утворення класу програм, які містять цикли. Отже, будь-яка підмножина множини елементарних програм є базисною множиною для певного класу складених програм. Складена програма, побудована з певної множини елементарних програм, називається структурованою.
Позначимо літерою S клас складених програм, базисна множина якого містить елементарні програми, як послідовність (рис. 1.1 а), вибір (if...else, рис. 1.1. б) і цикл з передумовою (while, рис. 1.1 в). Теорема про структурування стверджує, що будь-яку просту програму шляхом покрокового перетворення можливо замінити функціонально еквівалентною структурованою програмою, що належить означеному вище класу S. Згадане покрокове перетворення здійснюється за переліченими нижче правилами.
Правило простоти: створення програми слід починати із простої програми;
Правило пакетування: кожну дію можливо замінити двома послідовими діями;
Правило вкладання: кожну дію можливо замінити будь-якою структурою керування;
Правило 2 і 3 можна застосовувати у будь-якій послідовності необмежену кількість разів.
Принцип застосування правил пакетування та вкладання до простої програми продемонстровано на рис. 1.2.
Для перетворення неструктурованої програми у структуровану використовуються такі методи: дублювання кодів, введення змінної стану і метод булевих ознак [11].
Метод дублювання кодів застосовується для перетворення неструктурованих програм, що не містять циклів, у які можна увійти з декількох точок.
Р
озглянемо
неструктуровану програму, блок-схема
якої зображена на рис. 1.3. Блоки позначені
ідентифікаторами модулів.
Із блок-схеми видно, що модуль М5 не може розпочати своєї роботи доти, доки не стануть відомі результати роботи модулів М2 і М3. Як правило, в модулі М5 міститься фрагмент коду, що активізується під час виклику цього модуля з модуля М2, а також інший фрагмент коду, що активізується під час виклику модуля М5 з модуля М3.
Перетворимо зображену на рис. 1.3. неструктуровану програму, застосовуючи правила пакетування та вкладання. Зобразимо початкову програму як просту, що складається з елементарних програм типу вибору (if...else). Користуючись правилом вкладання, розширимо блоки МХ і МY, замінивши їх елементарними програмами типу if...else. У результаті заміни модуль М5 продублюється (рис. 1.4).
М
етод
введення змінної стану [11] застосовується
до неструктурованих програм, що містять
цикли. Процес перетворення неструктурованої
програми у структуровану складається
з таких кроків:
у програму вводиться змінна стану, що її значення дорівнює номеру блоку, на який буде передане керування після виконання поточних дій;
функціональні блоки неструктурованої програми замінюються функціональними блоками, що виконують такі самі дії та надають змінній стану значення, що ідентифікує номер блоку, на який передається управління.
Розглянемо блок-схему неструктурованої програми, що містить цикли (рис. 1.5). Кожному блоку приписано довільний номер.
У програму вводиться нова змінна і . Цій змінній присвоюється номер блоку, на який потрібно передати керування. Зокрема, якщо істинна умова А, тоцій змінній присвоюється номер блоку В, тобто 2, якщо істинна умова С, то змінній і присвоюється 1 – номер блоку А.
Логічні блоки неструктурованої блок-схеми замінюються елементарними програмами типу if...else, що послідовно перевіряють значення змінної стану. Гілки «Так» програм типу if...else мають містити оператори присвоєння нових значень змінній стану і оператори перевірки певних умов початкової програми.
Б
лок-схему
неструктурованої програми зображено
на рис. 1.5., а блок-схему відповідної
структурованої програми – на рис. 1.6.
Метод булевої ознаки використовується для перетворення неструктурованих програм, що містять цикли. В програму вводиться додаткова змінна, яка набуває значень true чи false. Доки змінна доки змінна ознаки зберігає це значення, виконання циклу триває. Значення змінної ознаки в середині циклу модифікується лише за певних умов.
Р
озглянемо
блок-схему неструктурованого циклу, що
має одну точку входу та дві точки
виходу (рис. 1.7). У програму вводиться
змінна flag, що ініціалізується
нулем (false). Якщо істинною є умова Р або
Q , змінна flag набуває значення 1
(true), що приводить до виходу з циклу. В
такий спосіб неструктурований цикл
із двома виходами перетворюється на
структурований з одним виходом
(рис. 1.8).
