
- •Програмування
- •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.7. Дійсні числа
Дійсні числа представляють значення різних величин при математичних обчисленнях. Цим і визначається їх застосування в алгоритмах рішення різного роду обчислювальних задач. До елементарних операцій виконавця звичайно відносять арифметичні і логічні операції, а також операції обчислення деяких математичних функцій.
Принципово важливою особливістю дійсних чисел є те, що вони представляють наближені значення величин і всі операції над ними слід вважати наближеними.
У записі алгоритмів прийнято використовувати дійсні числа в десятковій системі числення. Допускається запис чисел як у виді десяткових дробів (форма представлення з фіксованою точкою), так і у формі з плаваючою точкою.
Арифметичні операції:
a + b – операція додавання
a - b – операція віднімання,
- b – операція «мінус»;
a*b – операція множення,
a / b – операція ділення.
Логічні операції: (див. Цілі числа).
Математичні функції
Взагалі кажучи, задача наближеного обчислення значення деякої математичної функції (наприклад, сінуса) не є елементарною. Її, як правило, не можна вирішити за допомогою алгоритму, подібного до алгоритму додавання дробів, тобто виконуючи фіксоване число арифметичних дій над цілими числами. Тому спеціалізований виконавець, орієнтований на математичні розрахунки, „знає” алгоритми наближеного обчислення деякого набору математичних функцій. До їх числа, як правило, входять такі елементарні функції, як sin(x), cos(x), ln(x), arctg(x), exp(x), sqrt(x), функції округлення, виділення цілої і дробової частини.
Розглянемо кілька обчислювальних алгоритмів.
Задача 1.4. Побудувати математичну модель і скласти програму обчислень координат матеріальної точки, кинутої з початковою швидкістю V0 у напрямку вектора а = (X0,Y0) у момент часу t.
Рішення.
Як відомо з фізики, матеріальна точка М, кинута в деякому напрямку, рухалася б рівномірно і прямолінійно, якби не сила тяжіння, що діє на точку і спрямована вертикально вниз. Тому
x = t*V0*Cos(Alfa)
y = t*V0*Sin(Alfa) – g*t2/2
Проекції одиничного вектора напрямку на координатні осі обчислюються за формулами:
Cos(Alfa) = x0/sqrt(x02 + y02)
Sin(Alfa) = y0/sqrt(x02 + y02)
Тому
x = V0*t *x0/sqrt(x02 + y02)
y = V0*t*y0/sqrt(x02 + y02) – g*t2/2
Ці формули вирішують математично поставлену задачу, тобто представляють її математичну модель. Програміст, реалізуючи відповідний алгоритм, повинен подбати про економію ресурсів виконавця. Простіше кажучи, він має так розписати обчислення, щоб виконавець не робив ту саму роботу двічі. У нашому випадку це досягається попереднім обчисленням значення виразу V0/sqrt(x02 + y02), що входить у кожну з формул.
A = V0/sqrt(x0*x0 + y0*y0)
x = A*t*x0
y = A*t*y0 – g*t2/2
Наступне спрощення менш очевидне. Якщо у виразі для y винести за дужки t, однією операцією множення стане менше.
A*t*y0 – g*t2/2 = (A*y0 – g*t /2)*t
Турбота про економію ресурсів виконавця приводить до наступної послідовності обчислень:
A = V0/sqrt(x0*x0 + y0*y0)
x = A*t*x0
y = (A*y0 – g*t /2)*t
Алгоритм Рух точки;
Вхід
V0, x0, y0, t: Дійсні числа;
Вихід
x, y: Дісні числа;
Константа
G = 9.8;
Допоміжна величина
A: Дійсне число;
Початок
Обчислити A = V0/sqrt(x0*x0 + y0*y0);
Обчислити x = A*t*x0;
Обчислити y = (A*y0 – g*t /2)*t
Кінець.
В текст алгоритму включений розділ, у якому приведене ім'я і чисельне значення константи всесвітнього тяжіння. Константи є допоміжними величинами особливого роду. Константи не змінюють свого значення в процесі виконання алгоритму. Їх імена і значення визначаються в самому алгоритмі. Команди алгоритму замість значень констант використовують їх імена.
Задача 1.5. Скласти алгоритм, що обчислює першу цифру числа an (a – дійсне число, n – натуральне число.)
Рішення.
Дано: позитивне дійсне число a і натуральне число n. Знайти: натуральне число z.
Ідея рішення полягає в наступному: для того, щоб обчислити an, знайдемо десятковий логарифм числа a, помножимо його на n, а потім пропотенцюємо результат по основі 10.
x = lg(a), y = n*x, z = 10y
Згадаємо тепер, що ціла частина числа y – це порядок числа z, а дробова частина, називана також мантисою, визначає значення z, тобто його представлення у виді послідовності цифр. Тому, якщо виділити дробову частину y і пропотенціювати результат, ми одержимо число z1, розташоване між 1 і 10 (1 <= z1 < 10), перша цифра якого дорівнює шуканій.
x = lg(a), y = n*x, y = Frac(y), z1 = 10y , z = Int(z1)
Алгоритм Перша цифра степеня;
Вхід
A: Дійсне число;
N: Натуральне число;
Вихід
Z: Натуральне число;
Допоміжна величина
y: Дійсне число;
Початок
Обчислити y = lg(a);
Обчислити y = n*y;
Обчислити y = Frac(y);
Обчислити y = Pow(y, 10);
Обчислити z = Int(y)
Кінець.
Складаючи алгоритм, ми знову турбуємося про економію ресурсів виконавця. Цього разу ми заощаджували пам'ять: величина y використовувалося як місце збереження результатів проміжних обчислень.
В алгоритмі були використані функції:
Lg(x) – десятковий логарифм x;
Frac(x) – дробова частина
Int(x) – ціла частина
Pow(x, n) – x у ступені n.
Система команд виконавця повинна бути постачена алгоритмами обчислення цих функцій.
Задача 1.6. Багаточлени F(x) = a*x + b і G(x) = c*x + d задані своїми коефіцієнтами. Скласти алгоритм обчислення коефіцієнтів багаточлена H(x) = F(x)*G(x).
Рішення.
Коефіцієнти багаточлена F(x) легко обчислити: перемножимо двочлени F(x) і G(x) і згрупуємо коефіцієнти при x2, x і вільний член.
(a*x + b)*(c*x + d) = (a*c)*x2 +(b*c + a*d)*x +(b*d)
Звідси u = a*c, v = b*c + a*d, w = b*d. Команди алгоритму:
Початок
Обчислити u = a*c,
Обчислити v = b*c + a*d,
Обчислити w = b*d.
Кінець.
Виконавець має виконати 4 множення і 1 додавання. Зауважимо, що множення – це більш складна операція, ніж додавання. Для її виконання потрібно більше часу. Тому для прискорення роботи алгоритмів кількість множень в обчисленнях прагнуть зробити мінімальною.
Задача, що ми вирішуємо, є класичним прикладом неочевидної можливості такого прискорення. Виявляється, обчислити u, v, w можна, застосувавши тільки 3 множення.
Початок
Обчислити u = a*c,
Обчислити w = b*d,
Обчислити p = (a + b)*(c + d),
Обчислити v = p – u - w
Кінець.
Одним множенням стало менше за рахунок появи додатково 3-х адитивних операцій.