
- •Програмування
- •1. Алгоритми 12
- •2. Комп’ютери і програми 47
- •3. Мова програмування паскаль 56
- •4. Прості типи даних. Лінійні програми 61
- •5. Процедурне програмування 73
- •6. Програмування розгалужень 79
- •7. Оператори повторення з параметром. Масиви 99
- •7.13. Задачі і вправи 114
- •8. Ітераційні цикли 116
- •8.6. Задачі і вправи 124
- •9. Рекурсія 126
- •9.4. Задачі і вправи 135
- •10. Швидкі алгоритми сортування і пошуку 137
- •10.8. Задачі і вправи 148
- •11. Складні типи даних: записи і файли 150
- •11.11. Задачі і вправи 169
- •12. Множини 172
- •12.5. Задачі і вправи 175
- •13. Динамічні структури даних 176
- •14. Методологія структурного програмування: підсумки 192
- •1. Алгоритми
- •1.1. Змістовне поняття алгоритму
- •1.2. Виконавець алгоритмів і його система команд
- •1.3. Основні властивості алгоритмів
- •1.4. Величини
- •1.5. Типи величин
- •1.6. Цілі числа
- •1.7. Дійсні числа
- •1.8. Рядкові величини
- •У слові w знайти слово p і замінити його словом q.
- •1.9. Форми запису алгоритмів
- •1:Кінець.
- •X2 присвоїти значення x1
- •1:Кінець.
- •1.10. Команди управління
- •1.11. Блок - схеми
- •1.12. Допоміжні алгоритми
- •1.13. Базові структури управління
- •1.14. Абстракція даних
- •Приклад 1.7. Атд Планіметрія (виконавець Геометр)
- •1.15. Структурне програмування
- •1.16. Парадигма процедурного програмування
- •2. Комп’ютери і програми
- •2.1. Комп’ютер як універсальний Виконавець
- •2.1.1. Зовнішні пристрої комп’ютера
- •2.1.2. Центральні пристрої комп’ютера
- •2.1.3. Поняття про машинну мову
- •2.2. Мови програмування високого рівня
- •2.2.1. Коротка історія розвитку мов програмування
- •2.2.2. Про історію розвитку методів проектування програм
- •2.3. Основні етапи проектування програми
- •2.4. Технологія трансляції програм
- •2.5. Поняття про систему програмування
- •3. Мова програмування паскаль
- •3.1. Алфавіт мови
- •3.2. Концепція даних
- •3.3. Імена та їх застосування
- •3.4. Структура Pascal-програми
- •3.5. Поняття про лексику, прагматику, синтаксис і семантику мови програмування
- •3.6. Синтаксичні діаграми як засіб визначення мови програмування
- •4. Прості типи даних. Лінійні програми
- •4.1. Заголовок програми
- •4.2. Константи і їх використання. Розділ констант
- •4.3. Змінні програми. Розділ змінних
- •4.4. Стандартні прості типи даних
- •4.5. Тип даних Integer
- •4.6. Тип даних Real
- •4.7. Тип даних Сhar
- •4.8. Поняття виразу. Значення виразу. Тип виразу
- •4.9. Розділ операторів. Оператор присвоювання
- •4.10. Оператори введення - виведення
- •4.11. Приклад лінійної програми
- •4.12. Поняття складності виразу. Оптимізація обчислень
- •4.13. Оптимізація лінійних програм
- •4.14. Задачі і вправи
- •5. Процедурне програмування
- •5.1. Опис процедури
- •5.2. Формальні параметри. Локальні і глобальні об’єкти
- •5.3. Оператор процедури. Фактичні параметри
- •5.4. Функції
- •5.5. Приклади
- •6. Програмування розгалужень
- •6.1. Поняття умови. Тип даних Boolean (логічний)
- •6.2. Складений оператор
- •6.3. Оператори вибору: умовний оператор
- •6.4. Приклади
- •6.5. Задачі вибору й упорядкування
- •6.5.1. Задачі вибору
- •6.5.2. Дерево розв’язувань задачі вибору
- •6.5.3. Задачі на зважування
- •6.5.4. Ефективність алгоритму як кількість його кроків
- •6.5.5. Вибір даного елемента
- •6.6. Задачі упорядкування
- •6.6.1. Упорядкування елементів
- •6.6.2. Порівняння, перестановки і пересилання
- •6.7. Оптимізація розгалужень
- •6.8. Розділ типів. Перелічуваний тип
- •6.9. Оператори вибору: оператор варіанта
- •6.10. Вправи
- •7. Оператори повторення з параметром. Масиви
- •7.1. Оператор циклу з параметром
- •7.2. Циклічні програми. Складність циклічної програми. Оптимізація циклічних програм
- •7.3. Обмежені типи
- •7.4. Складні (складені) типи
- •7.5. Регулярний тип. Масиви
- •7.6. Пошук елемента в масиві
- •7.7. Ефективність алгоритму за часом
- •7.8. Мітки. Оператор переходу. Застосування оператора переходу для дострокового виходу з циклу
- •7.9. Постановка задачі сортування
- •7.10. Сортування масивів
- •7.10.1. Прості алгоритми сортування
- •7.11 Сортування обмінами
- •7.12. Сортування вибором
- •7.13. Задачі і вправи
- •8. Ітераційні цикли
- •8.1. Оператори повторення While і Repeat
- •8.2. Алгоритми пошуку і сортування. Лінійний пошук у масиві
- •8.3. Поліпшений алгоритм сортування обмінами
- •8.4. Бінарний пошук в упорядкованому масиві
- •8.5. Алгоритми сортування масивів (продовження). Сортування вставками
- •8.5.1 * Ефективність алгоритму
- •8.6. Задачі і вправи
- •9. Рекурсія
- •9.1. Рекурсивно-визначені процедури і функції
- •9.2. Приклади рекурсивних описів процедур і функцій
- •I стержень j стержень 6-I-j стержень
- •I стержень j стержень 6-I-j стержень
- •I стержень j стержень 6-I-j стержень
- •9.3. Переваги і недоліки рекурсивних алгоритмів
- •9.4. Задачі і вправи
- •10. Швидкі алгоритми сортування і пошуку
- •10.1. Нижня оцінка часу задачі сортування масиву за числом порівнянь
- •10.2. Швидкі алгоритми сортування: Сортування деревом
- •10.2.1. *Аналіз складності алгоритму
- •10.3. Пірамідальне сортування
- •10.3.1.*Аналіз складності алгоритму
- •10.4. Швидке сортування Хоара
- •10.5. Пошук k-того в масиві. Пошук медіани масиву
- •10.6.* Метод “розділяй і володій”
- •10.7.* Метод цифрового сортування
- •10.8. Задачі і вправи
- •11. Складні типи даних: записи і файли
- •11.1. Складні типи даних у мові Pascal
- •11.2. Записи
- •11.3. Записи з варіантами
- •11.4. Оператор приєднання
- •11.5. Рядки і засоби їх обробки
- •Процедури і функції типу String.
- •11.7. Файли. Управління файлами
- •11.8. Основні задачі обробки файлів
- •11.9. Сортування файлів
- •11.9.1. Алгоритм сортування злиттям
- •11.9.2. Аналіз складності алгоритму
- •11.10. Задача корегування файла
- •11.11. Задачі і вправи
- •12. Множини
- •12.1. Множинний тип
- •12.2. Конструктор множини
- •12.3. Операції і відношення над множинами
- •12.4. Застосування множин у програмуванні
- •12.5. Задачі і вправи
- •13. Динамічні структури даних
- •13.1. Стандартні динамічні структури
- •13.2. Посилальний тип даних. Посилання
- •13.3. Програмування динамічних структур даних
- •13.4. Стеки, списки, черги
- •13.5. Задачі
- •13.6. Дерева
- •13.7. Бінарні дерева
- •13.8. Задачі
- •14. Методологія структурного програмування: підсумки
- •14.1. Основні структури управління
- •14.2. Основні структури даних
- •14.3. Методологія програмування “зверху-вниз”
- •14.4. Приклад: Система лінійних рівнянь
- •14.5. Проектування модулів. Модуль rat
- •14.6. Реалізація модуля
- •14.7. Висновки (модульне програмування)
- •14.8. Заключне зауваження: переходимо до об’єктів
1. Алгоритми
1.1. Змістовне поняття алгоритму
Уявіть собі, що Вам необхідно пояснити учневі 6-го класу, як додавати дроби. Оскільки викладати математичну теорію питання не хочеться, Ви вирішуєте представити метод розв’язання задачі у виді послідовності дій над числами, які він повинен виконувати, не вникаючи в суть справи. Це і є алгоритм рішення задачі.
Термін «алгоритм» уперше був використаний середньовічними вченими, що переводили на латинь твори узбецького вченого Аль Хорезми. Алгоритмами вони називали правила арифметичних дій над багаторозрядними числами.
Такий метод викладення способу рішення задач широко розповсюджений. У виді алгоритмів викладають кулінарні рецепти, правила користування побутовими приладами, службові інструкції і т.д. В інформатиці алгоритми використовуються для опису способу рішення задач по перетворенню інформації.
Точне математичне визначення алгоритму і вивчення цього поняття - предмет спеціальної математичної дисципліни - теорії алгоритмів, що, у свою чергу, спирається на апарат математичної логіки.
Зараз ми розглянемо на змістовному (неформальному) рівні характерні основні риси цього поняття.
А
лгоритм
–
це деяке правило перетворення інформації,
застосування якого до заданої (вихідної)
інформації приводить до результату –
нової інформації.
Так, наприклад, застосування правила додавання дробів до 1/2 і 2/3 приводить до результату 7/6.
Особливу увагу в теорії і практиці алгоритмізації приділяють методам завдання (опису, конструювання) алгоритмів. Один з основних підходів до опису алгоритмів – так званий імперативний підхід полягає в уточненні способу опису алгоритму як послідовності кроків, на кожному з яких виконується одна з команд (інструкцій, операторів).
Алгоритм – це скінчена послідовність інструкцій (команд), виконання яких приводить до результату. Кожна команда алгоритму містить точний опис деякої елементарної дії (операції), а також, у явному або неявному виді, вказівку на команду, яку необхідно виконати наступною.
Н
а
рис. 1.2 зображена послідовність команд
C1,
C2,
…, Ck
по перетворенню інформації, з яких
складено алгоритм.
Згадаємо стародавню задачу-головоломку про вовка, козу і капусту, які на чолі з людиною вийшли до річки і мають переправитися на інший берег. У розпорядженні цієї веселої компанії є човен, що вміщує разом з людиною ще тільки одного її члена – або вовка, або козу, або капусту. Якщо вовк виявиться наодинці з козою, він її з'їсть. Якщо коза виявиться наодинці з капустою, вона її (капусту) з'їсть. Потрібно скласти такий план перевезень, при якому наша компанія перебереться на інший берег у цілості і схоронності. Цей план і є алгоритм. Опишемо його:
Алгоритм Перевезення:
Перевезти козу.
Повернутися.
Перевезти вовка.
Перевезти козу.
Перевезти капусту.
Повернутися.
Перевезти козу.
Зверніть увагу на наступні обставини. Для того, щоб знайти цей план-алгоритм, потрібно трохи подумати (на те вона і головоломка). Потрібно також обґрунтувати правильність цього плану, інакше кого-небудь з'їдять. Нарешті, потрібно так оформити рішення, щоб його зміг зрозуміти і виконати перевізник – тобто виконавець алгоритму.
Це і є ті основні проблеми, з якими постійно має справу програміст, розробляючи програми для комп'ютерів.
Алгоритм додавання дробів можна задати наступною послідовністю команд:
Приклад 1.1 Алгоритм додавання дробів.
Алгоритм Сума;
Вихідна інформація A, B, C, D; {скласти A/B і C/D}
Результат E,F; {E/F = A/B + C/D}
1. Обчислити Y = B*D; {Перейти до наступної команди}
2. Обчислити X1 = A*D; {Перейти до наступної команди}
3. Обчислити X2 = B*C; {Перейти до наступної команди}
4. Обчислити X = X1+X2; {Перейти до наступної команди}
5. Обчислити Z = НОД(X,Y); {Перейти до наступної команди}
6. Обчислити Е = X div Z; {Перейти до наступної команди}
7. Обчислити F = Y div Z. {Закінчити роботу}.
Вихідна інформація цього алгоритму представлена чотирма цілими числами A, B, C, D. Це – чисельники і знаменники доданків. Результат роботи алгоритму – числа E і F – чисельник і знаменник суми.
Інформацію, вихідну для алгоритму, прийнято називати його входом, а результат виконання – виходом.
Знати, яку саме задачу вирішує алгоритм, необхідно тільки тому, хто хоче використовувати цей алгоритм для своїх цілей. Таким чином, перші два рядки приклада 1 містять інформацію, необхідну користувачеві алгоритму. Виконавець алгоритму нічого не знає і не повинен знати про те, яку саме задачу він вирішує. У цьому і полягає властивість формальності виконання алгоритму.
Власне алгоритм складається з 7-ми команд, кожна з яких містить команду – виконати одну з арифметичних дій над цілими числами: додавання, множення, обчислення НОД і div (обчислення неповної частки). Крім виконання арифметичної дії, кожна команда запам'ятовує результат як значення величини, зазначеної в лівій частині рівності, що входить у команду. Нарешті, кожна команда (у неявному виді) містить указівку на наступну виконувану команду – перейти до виконання команди з наступним номером.
Таким чином, алгоритм описує деталізований по кроках процес перетворення інформації. Виконавець алгоритму не тільки виконує дії, але і запам'ятовує їхні результати. Для відображення цього факту в записі алгоритму ми використовуємо літерні позначення даних. Ці позначення називають іменами, а самі дані – величинами.
Для позначення величин в алгоритмах використовуються імена.
Послідовний порядок виконання команд необхідний тільки для того, щоб результати виконання попередніх команд можна було б використовувати як вихідні дані у виконуваній команді.
У нашому прикладі команди 1, 2, 3 обчислення величин X1, Х2, Y можна виконувати або паралельно (у три руки), або змінювати порядок їхнього виконання. Від цього результат алгоритму не зміниться. Це ж можна сказати про команди 6 і 7. Відповідь на питання про те, чи представляють ці варіанти запису алгоритму той самий алгоритм, чи ні, залежить від точного визначення поняття алгоритму. Істотною є та обставина, що дві форми запису можуть представляти алгоритми, що дають той самий результат.
Відзначимо ще одну важливу властивість алгоритму – він розрахований на виконавця, який розуміє і уміє виконувати команди алгоритму.
Учень 6-го класу, швидше за все, уміє складати, множити і ділити куточком цілі числа. Однак не всі діти вміють знаходити НСД – найбільший спільний дільник двох цілих чисел. Це означає, що вони не зможуть виконати Ваш алгоритм.
Рівень деталізації опису алгоритму визначається набором допустимих команд. Цей набір називають набором команд Виконавця або Інтерпретатора.