- •1. Історія розвитку мов програмування.
- •2. Структурне та об'єктно - орієнтоване програмування.
- •Процедурне програмування
- •Тема: Об'єктно — орієнтований підхід у програмуванні.
- •Суть об'єктно - орієнтовного підходу до програмування.
- •Особливості та переваги об'єктно - орієнтованого програмування.
- •Базові поняття та терміни
- •Наслідування, інкапсуляція та поліморфізм.
- •Заняття №3.
- •Написання програми.
- •2. Базові типи та описи даних.
- •Цілі числа
- •1. Основні поняття припроцесорної обробки. Компонування декількох файлів в одну програму
- •2. Припроцесорні змінні
- •3. Макровизначення (макроси).
- •4. Умовна компіляція
- •Заняття №5 Тема: Специфікація, об'єктів на основі абстрагування
- •1. Поняття класу об'єктів.
- •Формат класу.
- •Звернення до членів класу
- •Заняття №6 Тема: Ідентифікація об'єктів.
- •1. Ідентифікація назвою.
- •2. Область доступу ідентифікаторів
- •3. Опис об'єкту: інтерфейс і реалізація.
- •Тип адрес.
- •5. Ідентифікація вказівником.
- •6. Посилання
- •Віртуальні функції.
- •„Дружні" функції.
- •Тема: Інтерпретація об'єктів.
- •1. Поліморфізм
- •Тема: Інтерпретація об'єктів (заняття 2)
- •Наслідування властивостей.
- •Множинне наслідування.
- •1. Поняття „час життя" об'єкта та „область видимості".
- •Область видимості імен.
- •Тема: Динамічні структури об'єктів
- •1. Зв'язана організація пам'яті.
- •2. Асоціативні структури.
- •3. Списки. Черги. Рекурсивні структури. Набори. Дерева.
- •Тема: Процеси в об'єктах. Інкапсуляція
- •Логічний паралелізм. Схема сопрограм
- •Список використаної літератури
Тема: Динамічні структури об'єктів
Мета: Ознайомлення з зв'язаною організацією пам'яті та динамічними структурами даних: списками, стеками, чергами.
План заняття:
Зв'язана організація пам'яті.
Асоціативні структури.
Списки. Черги. Рекурсивні структури. Набори. Дерева.
1. Зв'язана організація пам'яті.
Зв'язана організація пам'яті визначає безліч структур, зв'язки між елементами яких реалізуються покажчиками. Кожен елемент такої структури (об'єкт) володіє, таким чином, властивістю "мати зв'язки" з іншими елементами, на які указує значення цієї властивості. Зв'язана організація пам'яті може використовуватися і для зберігання статичних структур даних, але оскільки реалізація зв'язків через посилання дає можливість використовувати динамічні механізми створення/знищення об'єктів, основним застосуванням зв'язаної організації є динамічне моделювання об'єктно-орієнтованих систем. Динамічні структури об'єктів, як вже наголошувалося, характеризуються наявністю особливої властивості: "мати змінний склад елементів структури". Ця властивість дозволяє будь-яку динамічну структуру розглядати як асоціацію зв'язаних об'єктів змінного складу. (Помітимо, що термін "асоціація" використовується в програмуванні дуже часто і сенс, що вкладається в це поняття, багато в чому залежить від контексту).
2. Асоціативні структури.
Властивість асоціативності відноситься до загальних групових властивостей класів, воно властиво не об'єкту окремо, а сукупності об'єктів. Простим прикладом групової властивості є "Кількість об'єктів в класі "- жоден з об'єктів класу окремо такою властивістю не володіє. Реалізація асоціативних властивостей класів вимагає використання спеціальних структур, що
"зв'язують" об'єкти-членів цих структур "узами" асоціативності. Правила, регулюючі впорядкованість асоціації, можуть бути сконструйовані як що виділяють властивості на безлічі іманентних властивостей об'єкта (наприклад, впорядкованість по "Віку" об'єкта, "Пріоритету" об'єкта). Вони можуть бути побудовані на основі часу модифікації складу членів асоціації (наприклад, правило "першим прийшов - першим вийшов" добре відомо всім, хто бував в чергах: кожен знов прийшов в чергу стає останнім членом цієї асоціації очередников). Загальна властивість асоціації полягає в тому, що можливість бієкції її структури (складу) на натуральний ряд чисел фактично визначає наявність "лінійного" порядку на безлічі її членів. Такий порядок визначається відносинами передування: "предок-нащадок", "предьідущий-последующий" і т.п. Ця властивість робить основною реалізаційною структурою асоціації лінійний список.
3. Списки. Черги. Рекурсивні структури. Набори. Дерева.
Якщо до початку роботи з даними неможливо визначити обсяг необхідної пам'яті, пам'ять буде виділятьсь по мірі необхідності окремими блоками, зв'язаними один з одним вказівниками. Такий спосіб організації даних називається динамічними структурами даних, оскільки їх розмір змінюється під час виконання програми. Із динамічних структур в програмах найчастіше використовують лінійні списки, стеки, черги та бінарні дерева. Вони відрізняються способом зв'язку окремих елементів та допустимими операціями.
Динамічні структури широко використовуються для розв'язування задач сортування, оскільки впорядкування динамічних структур не потребує перестановки елементів, а лише змінює вказівник на ці елементи.
Структура - це набір (інколи їх називають аргументами) логічно зв'язаних, перемінених, об'єднаних під одним ім'ям. Структури можуть складатися з переміних різних типів даних. Структура часто використовується, щоб опре ділити запис, які повині зберігатися в файлах вказівничі структури можуть служити базою для створення тяжких структурних даних, такі як зв'язані списки, черги, стеки і дерева.
Структури - це продуктивні типи даних, вони створюються з об'єктів других типів. Описання структури:
struct card {
char*face;
char*suit;
};
Ключове слово struct - оприділяє структури. Ідентифікатор card є ім'ям структури. Ім'я структури використовується з ключовим словом struct для об'явленне переміних типа структури. Тип структури struct card. Переміні, об'явлені в середні лапок структури, є елементами структури. Елементи одної структури повинні мати унікальні імена, но дві різні структури можуть мати одинакові імена, і це не, визве ніяких конфліктів. Кожна оприділена структура повинна закінчуватися крапкою з комою.
- Елементи в структурах повинні мати унікальні імена.
- Оприділене структури створює новий тип даних, який може використовуватись для об'явлення перемінних.
Структури, які на себе зсилаються.
В якості елемента вказівник, який зсилає на структуру того ж типа.
Наприклад:
srtuct node {
int data
struct node * nextPtr;
};
Описують тип struct node. Структура типа struct node складається з двох елементів - цілого data і вказівника nextPtr. Елемент nextPtr - вказівник на структуру типа struct node – структура того ж самого типа, що нами об'явлена, звідси і термін „структура, зсилаюча на себе".
Елемент nextPtr – інколи називається зв'язкою, nextPtr – можна використовувати для того, щоб зв'язати структуру типа struct node з другою структурую того ж типа. Структури, зсилаючись на себе, можуть зв'язуватись разом для корисних структур даних, такі як списки, черхи, стеки і дерева.
Зв'язні списки.
Це лінійний набір зсилаючі на себе структури, які називаються вузлами, і об'єднаних вказівників - зв'язкою, звідси і назва зв'язаний.
Доступ до зв'язаного списку забезпечують вказівникам на перший вузол списка. Доступ до слідуючи вузлів виникає через зв'язуючий вказівник, які зберігаються в кожному вузлі. Зв'язуючий вказівник в остальному вузлі списка встановлюються в ЖЛХ, які встановлюють кінець списка.
Дані зберігаються в зв'язному списку динамічно - кожен вузол створюється по мірі необхідності. Вузол може складати дані любого типа, включаючи другі структури. Списки і черги також належать лінійних структур даних, і являються спеціальними варіантами зв'язних списків. Дерева являється нелінійними структурами даних.
Списки даних можуть зберігатися в масивах. Зв'язаний список зручний, коли спочатку невідомо. скільки лементів даних будуть складати структуру.
Зв'язані списки являється динамічними, тому довжина списку може збільшуватись і зменшуватись. Розмір масиву змінити не можна, тому що пам'ять під масив виділяється під час компіляції.
Зв'язані списки переповнюються лиш у випадку, якщо в системі не хватає пам’яті, щоб задовольнити запит на виділення динамічної пам'яті.
- Дві основні функції зв'язаних списків insert і delete.
Функція isEmpty – називається предикатною функцією - вона не міняє списків, а всього лиш визначає, чи являється список пустим (вказівник на перший вузол списку рівень NULL). Якщо список пустий, то повертається значення 1, в противному випадку 0.
Функція printlist – роздруковує список. Символи встановлюються в алфавітному порядку
Функція inser – передає адрес списка і символ, який необхідно встановити. Адрес списка необхідний, коли значення повинно встановлюватися в початку списка.
Передача адреси списка позволяє модифікувати список через виклик по ссилці. Так як список сам по собі являється вказівником (на свій перший елемент), при передачі адреса списку вказівник на вказівник. (Це двійна косвена адресація).
Щоб встановити символ в список, необхідно виконати такі кроки:
Викликати malloc, створити вузол, присвоїти newPtr адрес виділеного блока пам'яті, присвоїти newPtr data символ, який необхідно встановити, а newPtr nextPtr – значення NULL.
Ініціалізувати previousPtr як NULL, і currentPtr як *sPtr (вказівник на початку списка). Вказівники previousPtr і currentPtr – використовуються для зберігання вузлів.
Якщо currentPtr не NULL, і встановляючи значення більше, чим currentPtr data, значення currentPtr – переміщається в наступний вузол списка. Так визначається крапка в списку, в яку буде встановлення значення.
Якщо previousPtr рівен NULL, новий вузол встановлюється як перший вузол списка. Присвоївши newPtr nextPtr – значення *sPtr (попередній перший вузол – вказівник нового вузла), присвоївши *sPtr значення newPtr (*sPtr – вказує на новий вузол).
Якщо previousPtr не NULL, то новий вузол встановлюється на своє місце. Для цього значення newPtr присвоюється previousPtr nextPtr, newPtr nextPtr присвоюється значення currentPtr (вказівник текучого вузла - в зв'язці нового).
Функція delete отримує адресу вказівника на початок списка і символ, який потрібно удалити.
Стеки
Стек - це спрощений варіант зв'язоного списку. Нові вузли можуть добавлятися в стек і видалятися із стека тільки зверху. Стек часто називається структурою вида – останнім прийшов – першим вийшов (LIFO). В стек зсилилаютья через вказівник на верхній елемент стека. Зв'язуючий елемент в останньому вузлі стека встановлений рівень NULL, щоб змінити границю стека.
Основні функції, які використовуються при роботі зі стеками – push, pop.
Функція push - створює новий вузол і поміщає його на вершину стека.
Функція pop - видаляє верхній вузол стека, звільнює пам'ять, яка була виділена із вилученому вузлі, і повертає вилучене значення.
Функція push – розміщує новий вузол на вершину стека.
При виконані функції можна виконати три етапи:
Створення нового вузла під викликом malloc, при цьому вказівнику newPtr присвоюємо адресу блока виділеної пам'яті, перемінної newPtr data присвоюється значення, яке необхідно помістити в стек, і вказівнику newPtr nextPtr присвоюємо NULL.
Вказівник newPtr nextPtr присвоюється *topPtr (вказівник на верхньому стеку), зв'язуючий елемент newPtr тепер вказує на вузол, який був верхній до цього.
*topPtr присвоює значення newPtr; *topPtr – тепер вказує на нову вершину стека.
Операція, включаючи в себе *topPtr, міняє значення staecPtr в main.
Функція pop – віддаляє верхній вузол стека. Щоб викликати pop, main визначає, не пустий чи стек.
В виконані функції pop можна виділити п'ять основних станів:
Вказівнику tempPtr – присвоюється *topPtr (tempPtr – буде використай для звільненя непотрібної пам'яті).
Перемінної popValue присвоюється значення (*topPtr) data (зберігає значення, яке зберігається в верхньому вузлі).
*topPtr присвоюється (*topPtr) nextPtr (*topPtr – присвоюється адреса нового верхнього вузла).
Звільненя пам'яті, на яку вказує tempPtr.
5) Викликаючою функцією повертає значення popValue (це функція main). Черги
В черзі вузли видаляються тільки з голови, а добавляються тільки в хвіст черги. При цій причині черги часто називається структурними даних типа першим прийшов - першим вийшов (FIFO). Операції постановки в черзі і видалення з черги мають назву enqueue (постановити в чергу) і dequeue (виключити з черги).
Черги знаходиться в комп'ютерних системах. Більшістю комп'ютерів обладнані тільки одним процесом, тому в кожний конкретний момент часу може обслуговувати тільки один користувач. Останні користувачі стають в чергу. Кожен, який стоїть в черзі, поступово переміщується до її початку по мірі обслуговування з переду стоячих користувачів.
Лінійні списки
Самий простий спосіб зв'язати множину елементів – зробити так, щоб кожен елемент містив ссилку на наступний. Такий спосіб називається однозв'язним. Якщо додати в кожен елемент ссилку на попередній елемент то отримаємо двохзв'язиий список. Якщо останній елемент зв'язаний з вказівником на перший - це кільцевий список. Кожний елемент містить ключ, який ідентифікує цей елемент. Ключем може бути або ціле число, або стрічка і являється частиною поля даних.
Зв'язний список - це різновид лінійних структур даних, що є послідовність елементів, звичайно відсортовану відповідно до заданого правила. Послідовність може містити будь-яку кількість елементів, оскільки при створенні списку використовується динамічний розподіл пам'яті.
Кожен елемент зв'язного списку є окремий об'єкт, що містить поле для зберігання інформації і показник на наступний елемент списку.
Заняття №12
