Лекція 2. Основи алгоритмізації


Table of Contents

2.1. Поняття та характеристики алгоритмів

Слово алгоритм походить від імені перського вченого, астронома та математика Аль-Хорезмі. Близько 825 до н. е. він написав трактат, в якому описав придуману в Індії позиційну десяткову систему числення. В першій половині XII століття книжка потрапила до Європи в перекладі латинською мовою під назвою Algoritmi de numero Indorum. Вважається, що перше слово в перекладі відповідає невдалій латинізації імені Аль-Хорезмі, а назва перекладу звучить як «Алгорітмі про індійську лічбу».

Перший алгоритм, призначений для виконання на автоматичному обчислювальному пристрої (комп’ютері), описала Ада Лавлейс в 1843 році. Алгоритм мав обчислювати числа Бернуллі й працювати на аналітичній машині Беббіджа. Цей алгоритм вважається першою комп’ютерною програмою, а його розробниця, Ада Лавлейс — першим програмістом.

Рис. 2.1. Баронеса Ада Лавлейс, яку вважають першим програмістом. Джерело: Wikipedia

Розглянемо визначення поняття алгоритм.

Алгоритм являє собою послідовність розпоряджень виконавцю. Виконавець повинен неухильно виконувати ці розпорядження. Число таких розпоряджень не є обов’язковим: воно може складати кілька тисяч, мільйонів і навіть трильйонів, але воно не може бути нескінченним. І коли виконавець виконає всі розпорядження, задача, для якої був створений алгоритм, буде вирішена.

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

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

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

Алгоритми мають ряд важливих властивостей:

  • Скінченність. Алгоритм має завжди завершуватись після виконання скінченної кількості кроків. Процедуру, яка має решту характеристик алгоритму, без, можливо, скінченності, називають методом обчислень.
  • Дискретність. Процес, що визначається алгоритмом, можна розчленувати (розділити) на окремі елементарні етапи (кроки), кожен з яких називається кроком алгоритмічного процесу чи алгоритму.
  • Визначеність. Кожен крок алгоритму має бути точно визначений. Дії, які необхідно здійснити, повинні бути чітко та недвозначно визначені для кожного можливого випадку.
  • Вхідні дані. Алгоритм має деяку кількість (можливо, нульову) вхідних даних, тобто, величин, заданих до початку його роботи або значення яких визначають під час роботи алгоритму.
  • Вихідні дані. Алгоритм має одне або декілька вихідних даних, тобто, величин, що мають досить визначений зв’язок із вхідними даними.
  • Ефективність. Алгоритм вважають ефективним, якщо всі його оператори досить прості для того, аби їх можна було точно виконати за скінченний проміжок часу з допомогою олівця та аркушу паперу.

Виділяють наступні основні способи запису алгоритмів:

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

Розглянемо приклад розв’язання задачі.

Задача 1. Скласти алгоритм ров’язання квадратного рівняння на комп’ютері та записати його вербальним способом (описати словами). Нагадаємо, квадратне рівняння має вигляд: $ {ax^2 + bx + c = 0} $.

Етапи розв’язання задачі:

  1. Вводимо значення $ a $, $ b $, $ c $.
  2. Обчислюємо дискримінант за фрмулою $ d = b^2 - 4ac $.
  3. Якщо $ d > 0 $ обчислити корені $ x_1 $, $ x_2 $ за формулою $ x=\frac {b ± \sqrt{d}}{2a} $ та вивести їх значення на екран. Інакше, якщо $ d = 0 $ – обчислити $ x_1=-\frac{b}{2a} $ і вивести на екран. Інакше вивести на екран «Коренів немає».
  4. Вийти з програми.

Ця ж задача на мові програмування C# має вигляд (символьний запис):

Лістинг 2.1. Розв’язання квадратного рівняння.

static void Main(string[] args)
{
    //Оголошуємо змінні
    double a, b, c, d, x1, x2;

    //Вводимо значення змінних з клавіатури
    Console.WriteLine("Введіть a:");
    a = Convert.ToDouble(Console.ReadLine());
    Console.WriteLine("Введіть b:");
    b = Convert.ToDouble(Console.ReadLine());
    Console.WriteLine("Введіть c:");
    c = Convert.ToDouble(Console.ReadLine());

    //Знаходимо дискримінант
    d = b * b - 4 * a * c;

    if (d > 0)
    {
        x1 = (-b + Math.Sqrt(d)) / (2 * a);
        x2 = (-b - Math.Sqrt(d)) / (2 * a);
        Console.WriteLine("x1 = {0}, x2 = {1}", x1, x2);
    }
    else if (d == 0)
    {
        x1 = -b / (2 * a);
        Console.WriteLine("x = {0}", x1);
    }
    else
        Console.WriteLine("Коренів не існує.");
    //Вихід з програми
}

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

Для зображення алгоритмів використовуватимемо блок-схеми, що формуються з типових блоків:

Рис. 2.2. Типові блоки для формування блок-схем алгоритмів.
Усі блок-схеми створено у draw.io.
Файли можна знайти у github репозиторії курсу.

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

Рис. 2.3. Основні алгоритмічні структури

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

Структура “розгалуження” передбачає виконання однієї з двох груп дій залежно від виконання умови у блоці розгалуження. На рис. 3 знаком “+” показано виконання умови, а знаком “-” - його невиконання. Часто використовується неповна команда розгалуження, коли один з блоків дії відсутній.

Структура “цикл” має декілька різновидів. На рис. 3 показаний цикл типу “доки” (while) з передумовою. Дії всередині цього циклу повторюються доки виконується умова у блоці розгалуження, причому спочатку перевіряється умова, а потім виконується дія. Досить часто використовуються інші типи циклу, показані на рис. 2.4.

Рис. 2.4. Зображення циклів за допомогою блок-схем

У циклі з після умовою перевірка умови виходу з циклу виконується після чергової дії. Цикл “для (for)” є модифікацією циклу “доки (while)” для ситуації, коли заздалегідь відома кількість повторень деяких дій. Запис у блоці заголовка циклу на рис.3 показує приклад опису заголовка циклу, в якому дії повторюються стільки раз, скільки цілих значень набуває параметра циклу i від свого початкового значення 1 до кінцевого N з кроком 1. Зазвичай крок не вказується, якщо він дорівнює 1.

Тепер запишемо алгоритм розв’язання задачі 1 у графічному вигляді.

Рис. 2.5. Блок-схема алгоритму знаходження коренів квадратного рівняння до задачі №1

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


Задача 2. Побудувати блок-схему алгоритму перевірки введеного числа на невід’ємність.

Розвязання задачі графічним способом:

Рис. 2.6. Блок-схема алгоритму знаходження коренів квадратного рівняння до задачі №2

Задача 3. Побудувати блок-схему алгоритму зходження периметра та площі трикутника за формулою Герона.

Розвязання задачі графічним способом:

Рис. 2.7. Блок-схема алгоритму до задачі №3

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

Розвязання задачі графічним способом:

Рис. 2.8. Блок-схема до задачі №4

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

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

Введемо позначення: $ n $ – кількість елементів масиву, $ sum $ – змінна, що визначає суму, $ x_i $ – $ і $-й елемент масиву.

Розвязання задачі графічним способом:

Рис. 2.9. Блок-схема до задачі №5

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

Ця задача відрізнється від попередньої лише появою нової змінної $ avg $ – середнє значення.

Розвязання задачі графічним способом:

Рис. 2.10. Блок-схема до задачі №6

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

Введемо позначення: $ max $ – максимальний елемент, $ n $ - кількість елементів у масиві, $ x_i $ – $ і $-й елемент масиву. Припускаємо що масив уже заповнений і наперед відомо кількість елементів у масиві.

Розвязання задачі графічним способом:

Рис. 2.11. Блок-схема до задачі №7

2.3. Ствоерення блок-схем з використанням Diagramm Designer

Diagramm Designer - програмне забезпечення для побудови блок-схем, UML-діаграм, та інших зображень на основі векторної графіки. Завантажити актуальну версію DiagramDesigner можна тут.

Перелік базових функцій Diagramm Designer:

  • Налаштовувана палітра шаблонів.
  • Перевірка правопису.
  • Імпорт / експорт зображень WMF, EMF, BMP, JPEG, PNG, MNG, ICO, GIF та PCX.
  • Переглядач слайд-шоу.
  • Зручний графічний редактор для відображення математичних виразів.
  • Калькулятор для розв’язання рівнянь.
  • Інтеграція з MeeSoft Image Analyzer для редагування растрових зображень.
  • Мінімізація розміру файлів.

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

Рис. 2.12. Головне вікно програми Diagramm Designer 1.23

Для створення діаграм використовуєть технологія Drag&Drop, тобто елементи можна перетягувати на робочу область. Приклад створення діаграми можна переглянути на відео (у онлайн версії лекції).

Документ DiagrammDesigner може мати кілька сторінок, переключення між сторінками за допомогою меню Diagram - Rearrange pages (рис. 2.13).

Рис. 2.13. Вибір сторінки у програмі Diagramm Designer

Для форматування тексту у межах графічних блоків (фігур) використовують наступні теги:

Рис. 2.14. Редагування тексту у блоці Diagramm Designer.

Таблиця 2.1. Теги для форматування тексту у графічних блоках DiagrammDesigner

Код Стиль
\B…\b Напівжирний
\U…\u Підкреслений
\I…\i Курсив
\O…\o Закреслений
\\ \
\H…\h Припіднятий до верху
\S…\s Символьний шрифт
\p Номер сторінки
\L…\l Опущений до низу
\C###### Колір у HTML
\P Загловок сторінки
\c Кількість сторінок
\_ Горизонтальний розділювач
\n Новий рядок
\N Підказка

Таблиця 2.2. Приклади форматування тексту у графічних блоках DiagrammDesigner

Код з тегами Текст
\B\ID=b\H2\h-4ac $ D=b^2-4ac $
Вводимо значення \Ba, b, c Вводимо значення $ a $, $ b $, $ c $
\ID > 0 $ D > 0 $
Вводимо \B\Ix\Li\i Вводимо $ x_i $

З іншими можливостями програмного подукту Diagramm Designer можна ознайомитися використовуючи вбудовану довідку програми.

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

2.4. Ствоерення блок-схем з використанням draw.io

Варто звернути увагу, що усі діаграми для лекцій створені саме у draw.io і можете завантажити їх у публічному репозиторії курсу на github.

На даний момент проект є безкоштовним і розміщується за адресою http://diagrams.net/.

Досить зручною функцією є інтеграція сервісами для зберігання файлів діаграм:

  • Google Drive.
  • OneDrive.
  • Dropbox.
  • GitHub.
  • GitLab.
Рис. 2.15. Вибір джерела для збереження draw.io

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

Рис. 2.16. UI головного вікна програми draw.io для Windows

Досить зручною є функція збереження діаграм для публікації у веб або на паперових носіях формати файлів (png, jpeg, svg, pdf, html, xml), а також вбудовування їх у різні типи документів, що надають сервіси Google та Microsoft.

Для початку ознайомлення з сервісом draw.io рекомендую переглянути коротке відео:

Джерело: youtube канал draw.io


Контрольні запитання

  1. Дати визначення поняття «алгоритм»?
  2. Перелічіть властивості алгоритмів.
  3. Якими способами можна представити алгоритм?
  4. Які типові блоки для формування блок-схем алгоритмів ви знаєте? Як вони зображуються графічно?

Список використаних джерел

  1. Ada Lovelace on Wikipedia. Url: https://en.wikipedia.org/wiki/Ada_Lovelace

  2. DiagramDesigner. Url: https://logicnet.dk/DiagramDesigner/

  3. Draw.IO. Url: https://www.diagrams.net/

  4. Albahari, J., & Albahari, B. (2012). C# 5.0 in a Nutshell, Fifth Edition. 1005 Gravenstein Highway North, Sebastopol, USA: O’Reilly Media, Inc.

  5. Cardelli, L., & Wegner, P. (December 1985 p.). On Understanding Types, Data Abstraction, and Polymorphism. ACM Computing 1. Surveys, 17(4), сс. 149-154. Отримано з http://lucacardelli.name/Papers/OnUnderstanding.A4.pdf

  6. Kort, W. d. (2013). Exam Ref 70-483: Programming in C#. Sebastopol, California 95472: O’Reilly Media, Inc.

  7. MSDN. (без дати). Отримано з Microsoft Developer Network: http://msdn.microsoft.com/

  8. Биллиг, А. (2005). Основы программирования на C#. Москва, Россия: НОУ ИНТУИТ.

  9. Нейгел, К. И. (2011). С# 4.0 и платформа .NET 4 для профессионалов. Москва, Россия: ООО “И.Д. Вильямс”.

  10. Павловская, Т. (2009). С#. Программирование на языке высокого уровня. Учебник для вузов. СПб, Россия: Питер.


Додаткові матеріали для завнатаження

  1. Лекція у форматі DOCX Завантажити (у розробці)
  2. Лекція у форматі PDF Завантажити (у розробці)
  3. Діаграми до лекції у форматі draw.io на github Перейти

Дорогі друзі, якщо Ви помітили, що для написання матеріалів використані джерела, які я не вказав - прошу надіслати мені інформацію на пошту. Дякую.
Previous
Next