
- •Програмування
- •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. Заключне зауваження: переходимо до об’єктів
12.5. Задачі і вправи
Записати за допомогою конструктора множину Х, яка складена з латинських букв a, b, c, d, i, j, k, x, y, z.
Записати за допомогою конструктора множину з трьох основних кольорів множинного типу Paint.
Записати за допомогою конструктора множину цілих розв’язків квадратної нерівності x^2 +p*x + q < 0 у припущенні, що корні відповідного квадратного рівняння лежать в інтервалі [0; 255].
Записати за допомогою конструктора множину простих чисел-близнюків з інтервалу 1..30.
13. Динамічні структури даних
У попередніх параграфах були визначені фундаментальні структури даних, що використовуються у процедурному програмуванні: масиви, записи, файли і множини. Фундаментальність цих структур означає, що вони, по-перше, частіше всього використовуються в практиці програмування, і, по-друге, визначають методи структурування даних – тобто методи утворення складних структур із більш простих. Наприклад, можна визначити масив із записів, запис, що складається з множин, файл із масивів, компоненти яких – записи, і т.д. Для кожної з таких структур даних характерна та обставина, що розмір пам’яті, що відводиться для неї, визначається компілятором під час компіляції розділів типів і змінних і залишається незмінним під час виконання програми. Тому такі змінні-структури називаються статичними. Наряду з статичним розподілом пам’яті ми вже використовували в програмах і динамічний розподіл пам’яті – під локальні змінні процедур і функцій. Особливо випукло динамізм тут проявляється при використанні рекурсії.
Однак багато задач для своєї ефективної реалізації потребують явних методів динамічного використання пам’яті, тобто описання таких структур даних, розмір і конфігурація яких змінюються під час виконання програм. Такі структури даних називаються динамічними.
Приклад 13.1. Уявимо собі, що наша програма повинна деяким чином обробляти послідовність символів, яка представляє математичну формулу (арифметичний вираз). Якщо обробка пов’язана з обчисленням значення цієї формули, то представлення формули в виді рядка символів неприродно. Зручніше представити, наприклад, формулу f = (a + b)*(a - c) у виді наступної структури:
Рис. 13.1. Представлення формули динамічною структурою.
Тепер обчислення значення f можна організувати “знизу-вгору”, підставляючи результати операції замість знаків операцій. Легко бачити, що такий метод обчислення є універсальним.
Приклад 13.2. Нам треба обробити набір відомостей про людей (прізвище - F, вік - А), причому обробка включає процедури включення людини у список, вилучення зі списку, виведення списку як у алфавітному порядку по прізвищам, так у порядку зменшення віку. Дані для цієї задачі зручно уявити у виді структури:
Рис. 13.2. Представлення набору даних динамічною структурою.
в якій Fi – прізвища, Ai – вік людей, суцільні стрілки вказують на людей що йдуть в алфавітному порядку., а пунктирні – на людей, що йдуть за ростом.
Тоді включення – вилучення елементів можна робити переорієнтацією стрілок, а порядок виведення легко отримати, слідуючи по відповідним стрілкам. Нижче ми розглянемо і інші приклади задач, у програмуванні яких зручно використовувати динамічні структури.
Розглянуті приклади показують, що динамічні структури даних представляють із себе сукупність елементів, кожний з яких містить як деяку значущу інформацію, так і інформацію про зв’язки з іншими елементами структури. Інформацію про зв’язки називають посиланнями або покажчиками.
Динамічні структури даних, що реалізуються засобами мови Паскаль, представляються у виді сукупності записів, кожна з яких містить інформаційні поля і поля посилань (покажчиків) на інші записи структури.
Інформаційні поля Поля покажчиків
Рис. 13.3. Запис - елемент динамічної структури.
Посилання на деякий елемент – це по суті адреса першого (молодшого байта) фрагмента оперативної пам’яті, відведеної під цей елемент.
Для реалізації ефективних алгоритмів розв’язків задач вирішальну роль грають способи об’єднання елементів у структури даних. Для кожного такого способу характерна як топологія структури, так і методи її обробки. Нижче ми розглянемо деякі з таких динамічних структур, які по суті є стандартними (типовими).