- •3. Аналіз вимог і визначення специфікацій програмного забезпечення
- •3.1. Визначення вимог до програмних продуктів
- •3.1.1. Функціональні вимоги
- •3.1.2. Експлуатаційні вимоги.
- •3.2. Вибір архітектури програмного забезпечення
- •3.3. Структура і формат даних. Статичні, напівстатичні і динамічні структури
- •3.3.1. Класифікація структур даних
- •3.3.2. Прості структури даних
- •3.3.3. Статичні структури даних
- •3.3.4. Напівстатичні структури даних
- •3.3.5. Динамічні структури даних
- •3.4. Модульне програмування
- •3.4.1. Поняття модуля
- •3.4.2. Основні характеристики програмного модуля
- •3.4.3. Модульна структура програмних модулів
- •3.4.4. Методи розробки при модульному програмуванні
- •Ціленаправлена конструктивна реалізація
- •3.5. Аналіз вимог і визначення специфікацій при структурному підході
- •3.5.1. Специфікації процесів
- •3.5.2. Словник термінів
- •3.5.4. Функціональні діаграми
- •3.5.5. Діаграми потоків даних (dfd)
- •3.5.6. Діаграма сутність-зв’язок
- •3.6. Аналіз вимог і визначення специфікацій при об’єктному підході
- •3.6.1. Деякі теоретичні відомості про uml
- •3.6.2. Визначення прецедентів (варіантів використання)
- •3.6.3. Побудова концептуальної моделі предметної області
3.3.4. Напівстатичні структури даних
Властивості напівстатичних структур даних:
вони мають змінну довжину і прості способи її зміни;
зміна довжини структури відбувається у визначених межах, не перевищуючи деякого максимального (граничного) значення.
З логічної точки зору напістатична структура представляє собою послідовність даних, зв’язану відношеннями лінійного списку (див. розділ 3.3.5). Доступ до елемента може здійснюватись по його порядковому номеру.
Фізично напістатичні структури представляються чи у вигляді вектора, тобто розміщуються в неперервній області пам’яті, чи у вигляді однозв’язного списку, де кожен наступний елемент адресується вказівником, який знаходиться в поточному елементі.
До напівстатичних структур належать стеки, черги, деки, строки.
3.3.5. Динамічні структури даних
Динамічні структури не мають постійного розміру, тому пам’ять під окремі елементи таких структур виділяється в момент, коли вони створюються в процесі виконання програми, а не під час трансляції. Коли в елементі структури більше немає необхідності, пам’ять звільняється (елемент «руйнується»).
Оскільки елементи динамічної структури розміщуються в пам’яті не по порядку і навіть не в одній області, адреса елементу такої структури не може бути обчислена з адреси початкового чи попереднього елемента. Зв’язок між елементами динамічної структури встановлюється через вказівники, які містять адреси елементів пам’яті. Таке представлення даних в пам’яті називається зв’язним.
Таким чином, крім інформаційних полів, заради який створюється структура і які є видимими для кінцевого користувача ПЗ, динамічні структури містять поля для зв’язку з іншими елементами, видимі для програміста – розробника ПЗ.
З допомогою зв’язного представлення даних забезпечується висока мінливість структури. Переваги динамічних структур:
розмір структури обмежується тільки об’ємом пам’яті комп’ютера;
при зміні логічної послідовності елементів структури (видалення, додавання елемента, зміна порядку розміщення елементів) вимагається тільки корекція вказівників.
З іншого боку, такі структури володіють ряд недоліків:
робота з вказівниками вимагає високої кваліфікації програміста;
на вказівники витрачається додаткова пам’ять;
додаткова трата часу на доступ до елементів зв’язної структури.
Зв’язні лінійні списки
Лінійні зв’язні списки є найпростішими динамічними структурами даних. Вони є впорядкованими множинами, які містять змінне число елементів, на які не накладаються обмеження по довжині.
На рис. 3.10 приведена структура однозв’язного списку. Тут поле INF – інформаційне поле, яке містить дані, NEXT – вказівник на наступний елемент списку. Голова списку – вказівник на початок списку. Вказівник на наступний елемент останнього елемента містить значення nil, це є ознакою останнього елемента.
Двозв’язні списки
Обробка однозв’язного списку не завжди зручна, так як неможливо рухатись в протилежну сторону. Таку можливість забезпечує двозв’язний список, кожен елемент якого містить два вказівника: на наступний і попередній елементи. Структура лінійного двозв’язного списку на рис 3.11, де поле NEXT – вказівник на наступний елемент, PREV – вказівник на попередній елемент. Перший і останній елементи такого списку містять nil у вказівнику на попередній і наступний елементи відповідно.
Для зручності обробки списку додають ще один особливий елемент – вказівник кінця списку. Наявність двох вказівників в кожному елементі ускладнює список і призводить до додаткових затрат пам’яті, але в той же час забезпечує більш ефективне виконання деяких операцій над списком.