- •Вимоги до оформлення звітів
- •Лабораторна робота 1. Використання зв‘язаних динамічних структур даних для подання послідовностей об‘єктів
- •Теоретичні відомості Динамічні структури даних
- •Неповні оголошення структур
- •Порядок виконання роботи
- •Звіт повинен містити
- •Контрольні питання для підготовки та самостійної роботи
- •Лабораторна робота 2. Робота з структурами даних типу «дерево»
- •Теоретичні відомості
- •Порядок виконання роботи
- •Індивідуальні завдання
- •Контрольні питання для підготовки та самостійної роботи
- •Лабораторна робота 3. Правила та послідовність опису систем на етапі аналізу
- •Теоретичні відомості
- •Аспекти опису систем
- •Порядок виконання роботи
- •Контрольні питання для підготовки та самостійної роботи
- •Приклад виконання завдання
- •Лабораторна робота 4. Аналіз об‘єкта проектування як системи, побудова і-дерева. Розробка графа зв‘язків елементів
- •Теоретичні відомості
- •Рівні, аспекти проектування. Блочно-ієрархічний підхід до проектування
- •Ієрархічні рівні описів проектованих об'єктів
- •Порядок виконання роботи
- •Контрольні питання для підготовки та самостійної роботи
- •Лабораторна робота 5. Формалізація інформації про структуру сукупності об‘єктів близького призначення з використанням і-або-дерев
- •Теоретичні відомості
- •Порядок виконання роботи
- •Контрольні питання для підготовки та самостійної роботи
- •Лабораторна робота 6. Порівняльний аналіз об‘єктів проектування з використанням критеріїв якості на базі методу експертних оцінок із застосуванням Exсel
- •Теоретичні відомості
- •Послідовність опису критеріїв розвитку
- •Порядок виконання роботи
- •Контрольні питання для підготовки та самостійної роботи
- •Лабораторна робота 7. Асоціативні методи рішення творчих (винахідницьких) задач
- •Теоретичні відомості Подолання психологічної інерції
- •Асоціативні методи рішення творчих задач
- •Порядок виконання роботи
- •Контрольні питання для підготовки та самостійної роботи
- •Лабораторна робота 8. Розробка програмного забезпечення для моделювання поведінки об‘єктів предметної області
- •Зміст і порядок виконання роботи
- •Контрольні питання для підготовки та самостійної роботи
- •Лабораторна робота 9. Застосування метричного апарата для оцінки якості розробки об’єктно-орієнтованої структури додатків
- •Теоретичні відомості
- •Метрики зв’язності за даними
- •Метрики зв’язності по методах
- •Метрики зв’язності по методах
- •Порядок виконання роботи
- •Контрольні питання для підготовки та самостійної роботи
- •Література
- •165/2007. Підп. До друку Формат 60х84/16.
- •84313, М. Краматорськ, вул. Шкадінова, 72
Неповні оголошення структур
Іноді кілька структур посилаються одна на одну за допомогою своїх членів-покажчиків. Необхідно оголосити структури до їх використання, але не можна сформувати їх усі друг перед другом.
Щоб вирішити цю проблему, використовується неповне оголошення структури, що починається як звичайно, але не має тіла:
struct BStruct; // Неповне оголошення структури типу BStruct
struct AStruct { // Оголошення структури типу AStruct
struct BStruct *bp; }; // Покажчик на тип BStruct
struct BStruct { // Оголошення структури BStruct
struct AStruct *ap; }; // Покажчик на тип AStruct
Стеки
Стек – це структура даних, що працює за принципом: останнім прийшов, першим вийшов. Стек нагадує стопку книг. Верхню книгу взяти легко, але щоб дістати нижні книги, потрібно забрати ті, які перебувають зверху. Наступний лістинг показує, як використовувати список для побудови стеків зі структур типу Item.
#define FALSE 0;
#define TRUE 1;
// Оголошення структури покажчиків дивися вище
void Push(Iptr newitem, Iref list); // Функція занесення елемента в стек
void Pop(Iref newitem, Iref list); // Функція вилучення елемента
void AddItem(void); // Функція додавання елемента
void DelItem(void); // Функція видалення елемента
void ShowList(Iptr p); // Функція виводу списку
void Display(void); // Функція виводу стека
Iptr avail; // Покажчик на стек avail
Iptr ilist; // Покажчик на стек item
main( ) {
int done = = FALSE;// Якщо done = = TRUE, програма завершується
int c; // Символ команди користувача
while (!done) {
Display( );
gotoxy(1, 25); cprintf("Уведіть символ A-dd, D-elete, Q-uit");
c = getch( ); // Уведення символу (виду функції)
switch (toupper(c)) {
case 'A': AddItem( ); break;
case 'D': DelItem( ); break;
case 'Q': done = = TRUE; break;}
}
return 0;}
Функція Push() привласнює члену next нового елемента адрес, який зберігається в list та передається у функцію як покажчик на покажчик на тип Item. Після цього вміст покажчика list заміняється адресою нового елемента аналогічно тому, як виконувалася вставка в список нового елемента.
void Push(Iptr newitem, Iref list){ // Занесення нового елемента в список
newitem->next = *list; // Член next зараз вказує на list
*list = newitem; } // list зараз указує на новий елемент
Функція Pop() виконує зворотну операцію, видаляючи один елемент зі стека та коректуючи покажчик, змушуючи його адресувати наступний елемент у черзі. Якщо список порожній, функція Pop() виділяє місце для нового елемента.
void Pop(Iref newitem, Iref list) { // Вилучення newitem зі списку
// або створення нового елемента, якщо список порожній
if (*list = = NULL) { // Якщо список порожній...
*newitem=malloc(sizeof(struct item)); //Динамічне створення елемента
(*newitem)->data = -1; //Ініціалізувати data, значенням рівним -1
} else { // Інакше...
*newitem = *list; // Повернення елемента, що перебуває у вершині списку
*list = (*list)->next; } } // Коректування списку
void AddItem(void) { // Додавання елемента в стек
Iptr newitem; // Покажчик на структуру типу Item
Pop(&newitem, &avail); // Одержати або створити новий елемент
if (newitem->data < 0) // Якщо це новий елемент (data = - 1)
newitem->data = rand( ); // Привласнити data випадкове число
Push(newitem, &ilist); } // Занести новий елемент у стек item
void DelItem(void) { // Видалити елемент зі стека item
// і зберегти цей же елемент у стеці avail
Iptr newitem;
Pop(&newitem, &ilist); // Одержати новий елемент зі стека item
Push(newitem, &avail); } // Зберегти елемент у стеці avail
void ShowList(Iptr p) { // Відобразити вміст списку p
while (p != NULL) { // Поки не досягнуть кінець списку
gotoxy(1, wherey( ) + 1);
cprintf("%d", p->data);
p = p->next; } } // Адресувати наступний елемент у списку
void Display(void) { // Відобразити стеки avail й item
clrscr( ); gotoxy(1, wherey( ) + 1); cprintf("Avail list: ");
ShowList(avail);
gotoxy(1, wherey( ) + 2); cprintf("Item list:");
ShowList(ilist); }
