Professional Documents
Culture Documents
1. АЛГОРИТМИ ТА МОВИ ПРОГРАМУВАННЯ
1. АЛГОРИТМИ ТА МОВИ ПРОГРАМУВАННЯ
Алгоритм знаходження найбільшого спільного дільника (НСД) двох натуральних чисел вперше описав
Евклід:
1. Порівняй числа а і b.
2. Якщо а = b , то а найбільший спільний дільник.
3. Якщо а > b , то замінити а на a – b.
4. Якщо а < b , то замінити b на b – a.
5. Перейти до п. 1.
Алгоритми застосовується не тільки в математиці, але й у багатьох сферах людської діяльності.
Виконавцем алгоритмів може бути людина або машина.
2
Для людини це звичайні правила, рецепти, інструкції (як перейти вулицю, як спекти торт, як
користуватися магнітофоном). Ці правила передаються усно або записуються на папері у вигляді тексту,
креслень і малюнків. Машині для роботи потрібен опис дій на її «машинній» мові, який записується на
магнітну стрічку або диск, лазерний диск тощо.
До розробки алгоритмів звертаються тоді, коли потрібно «доручити» автоматичному приладу роботу,
яку виконувала людина. Саме тут виникає необхідність точного опису послідовності простих дій для
виконання певної роботи. Машині не скажеш: «Візьми ту штуку і стукай по цій штуці!»
Саме після розробки відповідних алгоритмів створювалися пральні і швейні машини, м'ясорубки,
трактори, газові плити, авторучки, екскаватори, друкарські машини тощо.
В інформатиці використовують більш спеціалізоване поняття «алгоритму», яке ґрунтується на
поняттях «команда» і «виконавець».
Ми будемо вчитися розробляти алгоритми для того, щоб за їх допомогою писати програми для
комп'ютера. За програмою-алгоритмом комп'ютер буде дуже швидко розв'язувати складні задачі, на які
людина потратила б багато часу і зусиль.
Питання для самоконтролю:
1. Як виникло слово «алгоритм»?
2. Який алгоритм називається числовим? Наведіть приклад.
3. Хто може бути виконавцем алгоритмів?
4. Для чого вивчають алгоритми?
Відсутність хоча б однієї з цих властивостей робить неможливим виконання алгоритму машиною або
пристроєм, тому що їх робота стане помилковою.
Таких властивостей часто не мають вказівки, які дають люди один одному. Наприклад, у мультфільмі
«Вовка у тридев'ятому царстві» хлопчик дає наказ двом молодцям зі скриньки: «Нарубати і замісити!». І
перший молодець почав рубати тісто, а другий місити дрова.
Інший приклад: в одному німецькому місті бургомістр вночі зіштовхнувся з перехожим і набив собі гулю.
Вранці він написав наказ: «Всім мешканцям міста вночі ходити з ліхтарями». Ввечері він пішов перевірити, як
виконується його наказ. І знову набив гулю. «Чому ти без ліхтаря?» — «Ось він». — «Чому він без свічки?» —
«Наказу не було».
Наступного дня з'явився наказ: «У ліхтарях повинна бути свічка». Знову бургомістр пішов перевіряти
виконання свого наказу і знову набив гулю. «Чому без ліхтаря?» — «Ось він». — «Чому ліхтар без свічки?»
— «Ось вона». — «Чому вона не запалена?» — «Не було наказу».
І тільки на третій день вийшов вичерпний наказ: перехожі в темну пору доби повинні ходити з
ліхтарями, у ліхтарях повинна бути свічка, свічка повинна бути запалена.
Будь-який алгоритм повинен бути розбитий на послідовність окремих кроків, мати властивість
дискретності.
Алгоритм має властивості дискретності,
якщо всі його команди чітко відокремлені одна від одної.
Наприклад, наведений в підрозділі 1.1 алгоритм знаходження НСД двох чисел можна застосувати до
будь-яких цілих чисел.
Алгоритм містить помилки, якщо при виконанні він не завершиться взагалі або отримані результати
виявляться неправильними.
Синтаксичні помилки — це порушення правил запису алгоритму: пропущені дужки, коми, помилки в
написанні команд тощо.
Наприклад: A++B; X=Y∗(Z–;
Відсутність синтаксичних помилок не гарантує правильної роботи алгоритму. Є більш складні і
«замасковані» помилки алгоритму, знайти і виправити які значно важче.
Блок-схема зображає алгоритм у більш наглядній формі, ніж словесний запис алгоритму.
Усередині символу записуються значення, які вводяться у програму або виводяться з неї.
У блок «введення-виведення» може входити тільки одна лінія і виходити лише одна лінія в будь-якому
із чотирьох напрямків.
У лінійному алгоритмі не може бути команди, яка б передбачала різну послідовність виконання
алгоритму.
Приклад лінійного алгоритму «Як перевезти по одному через річку без втрат вовка, козу і капусту»:
1. Переправити на той берег козу, вовка залишити з капустою;
2. Повернутись, взяти вовка, переправитись з ним до кози;
3. Забрати козу і повернутись назад до капусти;
4. Залишити козу, забрати і перевезти капусту до вовка;
5. Повернутись і забрати козу.
У цьому прикладі дії алгоритму виконуються послідовно одна за одною до закінчення алгоритму.
Наведемо приклад побудови блок-схеми лінійного алгоритму «Обчислити шлях за
швидкістю і часом руху» (див. рис.). Початок
Словесний запис алгоритму задачі буде таким:
Введення
1. Ввести швидкість v і час руху t.
v, t
2. Обчислити шлях за формулою S = v·t.
3. Вивести шлях S. Обчислення
Ще один приклад: S = v· t
Алгоритм «Обчислити площу трикутника за трьома сторонами».
Словесний запис алгоритму:
1. Ввести сторони трикутника а, b, с. Виведення S
2. Обчислити півпериметр трикутника
p = 0.5 ⋅ ( a + b + c ) .
Кінець
3. Обчислити площу S за формулою Герона
s = p ⋅ ( p − a )( p − b)( p − c )
4. Вивести площу трикутника S.
Запис алгоритму у вигляді блок-схеми буде таким:
Початок Кінець
Реальні алгоритми, як правило, включають усі три типи алгоритмів у різноманітних комбінаціях.
Структурний підхід до конструювання (розробки) алгоритмів полягає в тому, що спочатку
продумується і фіксується загальна структура алгоритму без деталізації окремих його частин. Блоки, що
потребують подальшої деталізації, позначаються пунктиром. На наступних кроках ці блоки уточнюються.
Коли завершено деталізацію всіх блоків, одержимо алгоритм розв’язку задачі в цілому. Це простіше, ніж
відразу розробляти детально весь алгоритм.
Такий підхід до конструювання алгоритмів ще називають розробкою «зверху вниз».
Структурний підхід до конструювання алгоритмів забезпечує легкість розуміння алгоритму, простоту
його перевірки і редагування.
Питання для самоконтролю:
1. Які різновиди алгоритмів ви знаєте?
2. Які алгоритми називаються лінійними?
3. Які базові структури алгоритмів ви знаєте?
4. Яка основна властивість базових структур алгоритмів?
5. У чому полягає структурний підхід до конструювання алгоритмів?
6. Що дає структурний підхід до конструювання алгоритмів?
7
Кожного разу після виконання тіла циклу робиться перевірка умови виходу з циклу за допомогою
блоку «Умова». Вихід з циклу відбувається після досягнення лічильником циклів заданого значення або
після виконання заданої умови.
Блоки «Початкові надання», «Тіло циклу» та «Умова» є
складовими частинами циклу.
Дії всередині тіла циклу можуть бути досить складними. Це може бути велика послідовність команд
або ще один алгоритм, зокрема циклічний.
Цикли бувають двох видів:
• цикл «До» (з післяумовою);
• цикл «Поки» (з передумовою);
Цикл «До». Застосовується при необхідності виконати «Тіло циклу»
кілька разів до виконання заданої «Умови». Особливість цього циклу Вхід
полягає в тому, що він виконується хоча б один раз. Початкові
Цикл «Поки». Застосовується при необхідності спочатку перевірити надання
«Умову» і, можливо, потім виконати «Тіло циклу». Якщо при першій пере-
вірці «Умови» виконається умова виходу з циклу, то «Тіло циклу» не
виконається ні разу. Тіло
циклу
Вхід При логічних помилках в циклічних
алгоритмах може виникнути ситуація, коли
Початкові
надання тіло циклу виконується раз за разом, а Вихід Умова
умова припинення циклу не настає. Така Ні Так
ситуація називається «зациклювання».
Вихід Роботу таких програм доводиться припиняти і шукати помилку.
Умова
Так Розглянемо блок-схему циклічного алгоритму для обчислення виразу У
Ні = X ^ N (X у степені N, де N — натуральне число. Очевидно, що для
Тіло обчислення заданої функції слід послідовно N разів перемножити значення
циклу Х.
Для організації циклу необхідно передбачити лічильник K. З кожним
проходженням циклу лічильник збільшується на 1. Коли лічильник стає
більшим за N, цикл завершується.
За початкове значення Y беремо одиницю.
Команди K = 1 і Y = 1 виконуються в блоці «Початкові надання».
Основні дії, а саме Y = Y ∗ X і K = K + 1, які виконуються у тілі циклу, будуть повторюватися з
кожним проходженням циклу.
І, нарешті, у логічному блоці «Умова» слід записати К > N?.
Побудуємо блок-схему
алгоритму Евкліда для
знаходження найбільшого Введення K=1 Y=YX
Початок X, N K=K+1
спільного дільника двох чисел Y=1
(словесний запис алгоритму
Евкліда дивись у п. 1.1.): Ні K > N?
Так
a = b? Взяти a Кінець
як відповідь
Ні
Замінити Замінити
a на a–b a > b? b на b–a
Так Ні
Вибір методу розв'язування задачі залежить як від самої задачі, так і від можливостей комп’ютера:
швидкодії, об'єму пам'яті, наявності розроблених раніше програм.
При побудові алгоритму бажано розглянути і проаналізувати кілька варіантів перед тим, як зробити
остаточний вибір. Алгоритм більшою мірою визначається методом, хоч один і той же метод, у свою чергу,
може бути реалізований за допомогою різних алгоритмів.
Для цього потрібні аркуш паперу з зображеним на ньому алгоритмом. У клітинках записуються під їх
позначеннями всі змінні і їх початкові значення. Поступово рухаючись за алгоритмом, виконуємо записані в
ньому операції, проміжні результати записуємо у відповідні колонки.
І так до закінчення алгоритму та одержання результатів розв'язування задачі.
Дані треба підбирати так, щоб перевірити всі розгалуження алгоритму. Якщо отримані результати
відповідають дійсності, можна сподіватись, що алгоритм правильний. Але це можна встановити остаточно
лише налагодивши і протестувавши програму.
У програмі, складеній вперше, як правило, містяться помилки. Помилки можуть бути синтаксичні і
логічні. Якщо при записі програми допущені синтаксичні помилки (порушені правила запису команд і
даних), то такі помилки знайде транслятор. Логічні помилки у виборі формул, розгалужень, логічних
висновків тощо трансляторами не виявляються. Ці помилки повинен знайти та усунути програміст.
Для виконання тестування необхідно підготувати тести.
Тест — це спеціально підібрані вхідні дані разом з результатами, які повинні бути отримані за цими
даними.
При тестуванні перевіряється чи отримуються програмою ті самі результати, які вказано в тесті.
Після налагодження програми здійснюється перевірка її роботи при різних вхідних даних. Цей етап є
підсумком виконання всіх попередніх етапів і служить підтвердженням (або запереченням) їх правильності.
Після цього етапу інколи доводиться переглянути сам підхід до розв'язування задачі та повернутися до
першого етапу для повторного виконання всіх етапів з оглядом на набутий досвід. Упевнившись, що в
заданому діапазоні вхідних даних програма функціонує правильно, програміст передає розроблену ним
програму для експлуатації.