Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод вказів лаборат роб Опер сист.doc
Скачиваний:
11
Добавлен:
08.02.2016
Размер:
1.41 Mб
Скачать

6. Приклад вирішення задачі

6.1. Індивідуальне завдання:

  • матриця містить нулі нижче головної діагоналі;

  • індексація починається з 0.

6.2. Опис методів рішення

6.2.1. Представлення в пам'яті

Ощадливе використання пам'яті передбачає, що для тих елементів матриці, у яких напевно містяться нулі, пам'ять виділятися не буде. Оскільки при цьому порушується двовимірна структура матриці, вона може бути представлена в пам'яті як одномірний масив, але при звертанні до елементів матриці користувач має можливість звертатися до елемента по двох індексах.

6.2.2. Модульна структура програмного виробу

Програмний виріб повинний бути окремим модулем, файл LAB2.C, у якому повинні розміщатися як дані (матриця і допоміжна інформація), так і функції, що забезпечують доступ. Зовнішній доступ до програм і даних модуля можливий тільки через виклик функцій читання і записи елементів матриці. Доступні ззовні елементи програмного модуля повинні бути описані в окремому файлі LAB2.H, що може включатися в програму користувача оператором препроцесора:

#іnclude "lab2.h"

Користувачу повинний поставлятися результат компіляції - файл LAB2.OBJ і файл LAB2.H.

6.2.3. Перетворення 2-компонентної адреси елемента матриці, що задає користувач, у 1-компонентну повинно виконуватися окремою функцією (так називаної, функцією лінеаризації), виклик якої можливий тільки з функцій модуля. Можливі три методи перетворення адреси:

  • при створенні матриці для неї створюється також і дескриптор D[N] - окремий масив, кожен елемент якого відповідає одному рядку матриці; дескриптор заповнюється значеннями, підібраними так, щоб: n = D[x] + y, де x, y - координати користувача (рядок, стовпець), n - лінійна координата;

  • лінійна координата підраховується методом ітерації як сума корисних довжин усіх рядків, що передують рядку x, і до неї додається зсув y-го корисного елемента відносно початку рядка;

  • для перетворення підбирається єдине арифметичне вираження, який реалізує функцію: n = f(x,y).

Перший варіант забезпечує найшвидший доступ до елемента матриці, тому що вимагає найменших розрахунків при кожнім доступі, але плата за це - додаткові витрати пам'яті на дескриптор. Другий варіант - найгірший за всіма показниками, тому що кожен доступ вимагає виконання оператора циклу, а це і повільно, і займає пам'ять. Третій варіант може бути компромісом, він не вимагає додаткової пам'яті і працює швидше, ніж другий. Але вирази для лінеаризації отут буде складніше, ніж першому варіанті, отже, і обчислюватися буде повільніше.

У програмному прикладі, що ми приводимо нижче, цілком реалізований саме третій варіант, але далі ми показуємо й істотні фрагменти програмного коду для реалізації і двох інших.

6.3. Опис логічної структури

6.3.1. Загальні перемінні

У файлі LAB2.C описані такі статичні перемінні:

  • іnt NN - розмірність матриці;

  • іnt SІZE - кількість ненульових елементів у матриці;

  • іnt *m_addr - адреса стиснутої матриці в пам'яті, початкове значення цієї перемінний - NULL - ознака того, що пам'ять не виділена;

  • іnt L2_RESULT - загальний прапор помилки, якщо після виконання будь-якої функції він дорівнює -1, то відбулася помилка.

Перемінні SІZE і m_addr описані поза функціями з квалификатором statіc, це означає, що смороду доступні для усіх функцій у цьому модулі, але недоступні для зовнішніх модулів. Перемінна L2_RESULT також описана поза усіма функціями, не без явного квалификатора. Ця перемінна доступна не тільки для цього модуля, але і для всіх зовнішніх модулів, якщо вона в них буде описана з квалификатором extern. Такий опис мається у файлі LAB2.H.