Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Л07_Теорія і методи структурного програмування.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
144 Кб
Скачать
☆

2. Основи структурного програмування

Декомпозиція завдань

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

Декомпозицією завдання називається розбиття її на ряд підзадач.

При цьому:

  • кожну підзадачу можна вирішити незалежно від інших;

  • підзадачі можна об'єднати, отримуючи розв’язок початкової задачі.

Способи декомпозиції:

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

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

3. Методики процедурного програмування

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

Він повинен:

  • створити і ініціалізувати глобальні змінні, які використовує підпрограма;

  • викликати відладжувану підпрограму з потрібними параметрами. Ці параметри беруться з файлу даних або вбудовуються в драйвер;

  • зберегти результати і перевірити їх на правильність.

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

Вона повинна:

  • перевіряти правильність глобальних параметрів, використовуваних у відладжуваній програмі;

  • перевіряти достовірність переданих підпрограмі аргументів;

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

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

  • висхідне програмування (або програмування від низу до верху);

  • низхідне програмування (або програмування зверху вниз).

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

Етапи розв’язування складної задачі х зверху вниз

  1. Розбиваємо завдання Х на декілька функціональних підзадач Х1, Х2, Х3 і т.д.

  2. Припускаємо, що згодом кожну з цих підзадач ми вирішимо, а поки обдумаємо їх специфікації:

  • вид підпрограми (процедура або функція);

  • її ім'я;

  • імена і типи формальних аргументів, їх порядок;

  • для функції визначимо тип значення, що повертається;

  • коментарі, що описують призначення підпрограми.

  1. Напишемо програму рішення задачі Х, замінивши кожну з підпрограм Х1, Х2, Х3... заглушками, і відладимо її у такому вигляді.

  2. Паралельно працюватимемо з кожною з підпрограм Х1, Х2, Х3..., при необхідності так само розбиваючи кожну з них на підзадачі ще нижчого рівня, тобто використовуючи методику починаючи з п.1.

  3. Проводитимемо комплексну відладку, поступово, по одній замінюючи заглушки на самостійно відладжені підпрограми.

Повернемося до розмови про методики програмування.

Висхідний тип програмування (від низу до верху) реалізується навпаки:

  • Спочатку ми створюємо і відладжуємо самі елементарні підпрограми (швидше за все вони вже будуть реалізовані нами раніше і зібрані в модулі-бібліотеки). При відладці таких блоків використовуватимемо драйвер на місці зухвалої підпрограми.

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

  • Повторюємо попередній пункт до тих пір, поки не реалізуємо все завдання.

Для попереднього прикладу ми, очевидно, спочатку створили б (а вірніше узяли б вже готові) процедури PrintMatrix, MaxMatrixStr, ChangeVectorElem, ChangeMatrixStr. До завдань, що часто зустрічаються, можна віднести і введення матриці. Ну а потім залишається тільки зібрати процедури CreateTmpVector, SortMatrixStrMin і дописати основну програму.