
- •Програмування
- •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.6. Цілі числа
Величини, представлені цілими числами, використовуються практично в кожному алгоритмі. Тому ми розглянемо зараз ті операції з цілими числами, які прийнято вважати елементарними.
Арифметичні операції:
a + b – операція додавання
a - b – операція віднімання,
- b – операція «мінус»;
a*b – операція множення,
a div b – операція обчислення неповної частки,
a mod b – операція обчислення залишку.
Логічні операції:
a > b - операція «більше»
a < b - операція «менше»
a <= b - операція «менше або дорівнює»
a >= b - операція «більше або дорівнює»
a = b - операція «дорівнює»
a <> b - операція «не дорівнює»
Арифметичні операції додавання, віднімання і «мінус» називають адитивними, а операції множення, обчислення неповної частки і залишку – мультиплікативними.
Ми будемо вважати, що операції div і mod правильно інтерпретуються тільки тоді, коли обидва операнди – натуральні числа. Для цих операцій справедливе співвідношення
A = B * (A div B) + A mod B.
причому
A div B >= 0, 0 <= A mod B < B.
Це означає, що будь-яке натуральне число A можна розділити на інше натуральне число B із залишком, причому неповна частка невідє’мна, а залишок може приймати значення 0, 1, ..., B-1.
Наприклад, якщо A = 56, B = 9, то A div B = 6, A mod B = 2, і 56 = 9*6 + 2.
У наступній задачі ми використовуємо операції div і mod для того, щоб виділити цифри числа.
Задача 1.1 Скласти алгоритм, що переставляє місцями старшу і молодшу цифри даного тризначного десяткового числа АВС, тобто будує число СВА.
Рішення.
Позначимо через А, В і С – відповідно старшу, середню і молодшу цифри вхідного числа АВС, а через АВ – двозначне число, отримане з АВС відкиданням останньої цифри. Тоді
C = ABC mod 10, AB = ABC div 10.
Ми «розщепили» число на молодшу цифру і число, складене зі старших цифр. З числом АВ робимо те ж саме:
B = AB mod 10, A = AB div 10.
Залишилося „зібрати” число CBA з його цифр A, B, C:
CBA = 100*C + 10*B + A.
Алгоритм Переверни число;
Вхід
ABC : Натуральне число;
Вихід
ВСА : Ціле число;
Допоміжні величини
A, B, C, AB: Цілі числа;
Початок
Обчислити C = ABC mod 10;
Обчислити AB = ABC div 10;
Обчислити B = AB mod 10;
Обчислити A = AB div 10;
Обчислити CBA = 100*C + 10*B + A
Кінець.
Задача 1.2 Банкомат заряджений купюрами номіналами 100, 50, 20, 10, 5, 2, 1. Скласти алгоритм, що визначає, скільки купюр кожного номіналу потрібно, щоб видати суму в N грошових одиниць. Ваш алгоритм повинен витрачати при цьому найменшу можливу кількість купюр.
Рішення.
Дано: натуральне число N. Позначимо через K100 кількість сотенних купюр, K50 – кількість полтин, і т.д. Наш алгоритм буде подібним жадібній людині: на кожному кроці він буде визначати і віднімати із суми максимально можливу кількість купюр даного номіналу, починаючи із самих великих.
У задачах програмування дуже часто потрібно знайти оптимальне рішення. «Жадібні» алгоритми прагнуть на кожному кроці знайти «максимальну частину» такого рішення. Ця стратегія часто, хоча далеко не завжди, приводить до оптимальних рішень.
Алгоритм Банкомат;
Вхід
N: Натуральне число;
Вихід
K100, K50, K20, K10, K5, K2, K1: Цілі числа;
Початок
Обчислити K100 = N div 100; {Кількість сотенних}
Обчислити N = N mod 100; {Залишок N < 100}
Обчислити K50 = N div 50; {Кількість півсотень}
Обчислити N = N mod 50; {Залишок N < 50}
Обчислити K20 = N div 20; {Кількість двадцяток}
Обчислити N = N mod 20; {Залишок N < 20}
Обчислити K10 = N div 10; {Кількість десяток}
Обчислити N = N mod 10; {Залишок N < 10}
Обчислити K5 = N div 5; {Кількість п'ятірок}
Обчислити N = N mod 5; {Залишок N < 5}
Обчислити K2 = N div 2; {Кількість двійок}
Обчислити K1 = N mod 2 {Залишилося одиничок < 2}
Кінець.
Задача 1.3 Скласти алгоритм, що обчислює цілі коефіцієнти А, B, C квадратного рівняння Ах2 + Вx + С = 0 за його раціональними коренями х1 = n1 / m1, x2 = n2 / m2
Рішення.
Дано: цілі числа n1, m1, n2, m2. Потрібно знайти цілі числа А, B, С. Зв'язок між коренями і коефіцієнтами квадратного рівняння встановлює теорема Вієта: якщо x1 і x2 – корені приведеного квадратного рівняння x2 + px + q = 0, то x1 + x2 = -p, x1*x2 = q. Тому
n1/m1 + n2/m2 = - B/А , n1/m1 * n2/m2 = C/А.
Звідси (n1*m2+n2*m1)/(m1*m2) = - B/А (n1*n2)/(m1*m2) = C/А.
Прирівнюємо чисельники і знаменники дробів у цих рівностях:
A = m1*m2, B = - (n1*m2+n2*m1), C = n1*n2.
Алгоритм Теорема Вiєта;
Вхід
m1, m2, n1, n2: цілі числа;
Вихід
А, B, C: цілі числа;
Початок
Обчислити A = m1*m2;
Обчислити B = -(n1*m2 + n2*m1);
Обчислити C = n1*n2
Кінець.
Програміст повинен знати ту предметну область, задачу якої він вирішує. Метод рішення потрібно шукати саме там.