Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4 основи програмування книга.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.77 Mб
Скачать

1.11. Блок - схеми

У старі добрі часи (50-60 роки ХХ століття), коли комп'ютери були великими і повільними, а мови програмування тільки починали формуватися, для представлення алгоритмів застосовували блок-схеми, а для реалізації алгоритмів у виді комп'ютерних програм – систему команд комп'ютера (машинний код).

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

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

Команди, що описують обчислення (наприклад, команда присвоєння) зображуються у виді прямокутника

Рис 1.3. Блок Обчислення

Команда перевірки умови виглядає як ромб:

так

Рис 1.4. Блок Умова.

Початок і кінець алгоритму зображують у виді овалів:

Рис 1.5. Блоки Початок і Кінець.

Команди введення і виведення даних ми зобразимо так:

Рис 1.6. Блоки Введення і Виведення.

Існують і інші типи блоків, але ми ними користуватися не будемо.

1.12. Допоміжні алгоритми

Зобразимо зараз блок-схему алгоритму 1.1, а поруч – блок-схему алгоритму Евкліда 1.3.

Блоки, розташовані між блок-схемами алгоритму приклада 1.1 і алгоритму Евкліда, зображують “настроювання” алгоритму Евкліда на роботу з величинами алгоритму додавання дробів. Алгоритм додавання дробів відіграє роль основного алгоритму, а алгоритм Евкліда - допоміжного.

Рис 1.7 Основний алгоритм додавання дробів і допоміжний алгоритм Евкліда.

Вхідні величини допоміжного алгоритму перед тим, як він почне виконуватися, мають прийняти правильні значення. Після того, як допоміжний алгоритм обчислить значення вихідних величин, ці величини мають бути передані (повернуті) основному алгоритмові.

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

Передачу параметрів у допоміжний алгоритм бере на себе Виконавець. Справа програміста – правильно указати фактичні значення цих параметрів в основному алгоритмі.

Ми показуємо блок-схемою зміст (тобто семантику) процесу взаємодії основного і допоміжного алгоритмів. У цьому і полягає головна перевага блок-схем: вони дозволяють представити процес виконання алгоритму в геометричних образах, істотно полегшуючи тим самим розуміння семантики алгоритму.

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

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

Команда Блок-схема

Поки < Умова >

вконати <Команда>

Рис 1.8 Семантика команд управління

Блок-схема команди пояснює її виконання краще, ніж будь-який словесний опис.

Уявіть собі, однак, що Вам пропонують розглянути алгоритм, блок-схема якого зображена на рис 1.9.

Рис 1.9. Блок-схема алгоритму типу «спагетті».

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

Чи легко Вам буде розібратися в лабіринті переходів між блоками, і перевірити логіку обчислень? Звичайно, ні. Кожна послідовність дій тут так вплетена в інші можливі послідовності, що все це разом узяте нагадує ретельно перемішані спагетті.

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

Розглянемо алгоритм рішення наступної задачі:

Приклад 1.6. Алгоритм наближеного розв’язання рівняння f(x) = 0 методом поділу відрізка навпіл.

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

Дано:

Числовий відрізок [a, b].

Функція f(x), неперервна на відрізку і має на цьому відрізку єдиний корінь x0.

t – задана точність.

Знайти:

Корінь x0

а

c

b

Метод:

Відрізок [a, b] розділимо навпіл точкою с. Визначимо, на якій з половин відрізка - [a, с] або [с, b] знаходиться шуканий корінь. (Оскільки функція f(x) неперервна і корінь x0 єдиний, на кінцях відрізка, що містить x0, функція f(x) приймає протилежні за знаком значення.) Поділ відрізка навпіл будемо продовжувати доти, поки його довжина не стане менше, ніж задана точність t. Тоді наближеним значенням x0 можна вибрати середню точку цього відрізка.

Розробляючи алгоритм, спочатку визначимо його вхід і вихід:

Алгоритм Рівняння;

Вхід

a, b, t: ДІЙСН;

Вихід

X0: ДІЙСН;

Початок

< послідовність команд алгоритму >

Кінець.

Ми уточнили імена вхідних і вихідних величин і визначили їх типи. Поставимо перед собою питання: який спосіб управління обчисленнями є головним? Виявляється, що це – послідовне виконання двох дій:

Початок

<Зменшити довжину відрізка до величини, меншої t>;

<Обчислити х0 як середину відрізка [a, b]>

Кінець.

Друга дія – це команда присвоєння x0 := (a+b)/2. Як можна уточнити першу дію? Це дія – повторення процедури поділу відрізка і вибору однієї з його половин. Цей спосіб описується командою повторення Поки <Умова> виконувати <Команда>. Тому потрібно визначити Умову і Команду.

Алгоритм Рівняння;

Вхід

a, b, t: ДІЙСН;

Вихід

X0: ДІЙСН;

Початок

Поки <довжина відрізка [a, b] більша або дорівнює t> виконати

(

<Знайти середину с відрізка [a, b];>

<Вибрати в якості відрізка [a, b] ту половину,

на якій розташований корінь>

);

x0 := (a+b)/2

Кінець.

Уточнюємо Умову і команду обчислення середини відрізка. Вводимо допоміжну величину с:

Алгоритм Рівняння;

Вхід

a, b, t: ДІЙСН;

Вихід

X0: ДІЙСН;

Доп

С: ДІЙСН;

Початок

Поки b –a >= t виконувати

(

с := (a+b)/2;

<Вибрати ту половину, на якій розташований корінь>

);

x0 := (a+b)/2

Кінець.

Уточнюємо дію вибору потрібної половини відрізку:

Алгоритм Рівняння;

Вхід

a, b, t: ДІЙСН;

Вихід

X0: ДІЙСН;

Доп

С: ДІЙСН;

Початок

Поки b –a >= t виконувати

(

с := (a+b)/2;

Якщо <f(a) і f(c) приймає протилежні за знаком значення>

то b := c

інакше a := c

);

x0 := (a+b)/2

Кінець.

Залишилося уточнити Умову:

Алгоритм Рівняння;

Вхід

a, b, t: ДІЙСН;

Вихід

X0: ДІЙСН;

Доп

С: ДІЙСН;

Початок

Поки b –a >= t виконувати

(

с := (a+b)/2;

Якщо f(a)*f(c)< 0

то b := c

інакше a := c

);

x0 := (a+b)/2

Кінець.

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

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

Справді, ми почали з відповіді на таке питання: що дано і що потрібно знайти. Уточнення входу і виходу у виді описів величин – один з найважливіших етапів розробки алгоритмів.

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

Який спосіб управління потрібно зараз застосувати?

Чи можна реалізувати дію однією командою виконавця?

Як сформулювати умову?

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