- •1. Історія структурного програмування
- •2. Основи структурного програмування
- •Способи декомпозиції:
- •3. Методики процедурного програмування
- •Етапи розв’язування складної задачі х зверху вниз
- •4. Плюси і мінуси методик програмування
- •5. Інші проблеми структурного програмування
- •6. Основні блоки структурованої програми
- •7. Особливості структурного програмування
2. Основи структурного програмування
Декомпозиція завдань
Як тільки розмір програми виявляється більше одного екрану, ми прагнемо розбити її на набір підпрограм. Дійсно, набагато простіше створити і відлагодити підпрограмку з пари десятків операторів, чим болісно відловлювати помилки в послідовності з декількох тисяч рядків.
Декомпозицією завдання називається розбиття її на ряд підзадач.
При цьому:
кожну підзадачу можна вирішити незалежно від інших;
підзадачі можна об'єднати, отримуючи розв’язок початкової задачі.
Способи декомпозиції:
Тип даних складається з набору об'єктів і набору операцій, що визначають поведінку цих об'єктів. Створення нових типів розглядається об'єктно-орієнтованим програмуванням.
Підпрограма - закінчений блок програми, який набуває значень аргументів, реалізує алгоритм їх обробки і повертає, якщо необхідно, результати. Розбиттям завдання на підпрограми ми займаємося в процедурному або лінійному програмуванні.
3. Методики процедурного програмування
Драйвер - механізм, що імітує завантажувальну частину великої програми для самостійно відлагоджуваної процедури або функції.
Він повинен:
створити і ініціалізувати глобальні змінні, які використовує підпрограма;
викликати відладжувану підпрограму з потрібними параметрами. Ці параметри беруться з файлу даних або вбудовуються в драйвер;
зберегти результати і перевірити їх на правильність.
Заглушка - механізм, яка імітує підпрограму, що викликається з відладжуваної.
Вона повинна:
перевіряти правильність глобальних параметрів, використовуваних у відладжуваній програмі;
перевіряти достовірність переданих підпрограмі аргументів;
модифікувати аргументи підпрограми, глобальні змінні і повертати значення так, щоб програма, що викликає, могла продовжити свою роботу.
При програмуванні складних завдань використовуються дві основні методики:
висхідне програмування (або програмування від низу до верху);
низхідне програмування (або програмування зверху вниз).
Найчастіше ми звертаємося до низхідного варіанту. При цьому складне завдання розбивається на ряд простіших, для кожної з яких задається ім'я, список параметрів і набір результатів. Потім кожна з цих підзадач теж ділиться на дрібніші, і так до найпростіших неподільних підпрограм.
Етапи розв’язування складної задачі х зверху вниз
Розбиваємо завдання Х на декілька функціональних підзадач Х1, Х2, Х3 і т.д.
Припускаємо, що згодом кожну з цих підзадач ми вирішимо, а поки обдумаємо їх специфікації:
вид підпрограми (процедура або функція);
її ім'я;
імена і типи формальних аргументів, їх порядок;
для функції визначимо тип значення, що повертається;
коментарі, що описують призначення підпрограми.
Напишемо програму рішення задачі Х, замінивши кожну з підпрограм Х1, Х2, Х3... заглушками, і відладимо її у такому вигляді.
Паралельно працюватимемо з кожною з підпрограм Х1, Х2, Х3..., при необхідності так само розбиваючи кожну з них на підзадачі ще нижчого рівня, тобто використовуючи методику починаючи з п.1.
Проводитимемо комплексну відладку, поступово, по одній замінюючи заглушки на самостійно відладжені підпрограми.
Повернемося до розмови про методики програмування.
Висхідний тип програмування (від низу до верху) реалізується навпаки:
Спочатку ми створюємо і відладжуємо самі елементарні підпрограми (швидше за все вони вже будуть реалізовані нами раніше і зібрані в модулі-бібліотеки). При відладці таких блоків використовуватимемо драйвер на місці зухвалої підпрограми.
Об'єднуємо декілька таких підпрограм і замінюємо драйвер нижнього рівня на підпрограму, вирішальну частину нашого загального завдання.
Повторюємо попередній пункт до тих пір, поки не реалізуємо все завдання.
Для попереднього прикладу ми, очевидно, спочатку створили б (а вірніше узяли б вже готові) процедури PrintMatrix, MaxMatrixStr, ChangeVectorElem, ChangeMatrixStr. До завдань, що часто зустрічаються, можна віднести і введення матриці. Ну а потім залишається тільки зібрати процедури CreateTmpVector, SortMatrixStrMin і дописати основну програму.
