Міністерство освіти і науки України
НУ “Львівська політехніка”
Кафедра ЕОМ
ЗВІТ
про виконання лабораторної роботи №8
на тему:
Модульне програмування на мові Turbo Pascal
Кохалик Роман
(Студент)
КІ-17, ІКТАМ
(Група)
Мітьков В.С.
(Керівник лаб. занять)
Львів 2003
Мета роботи: вивчення способів підключення модулів та їх підключення до програми.
Теоретичні відомості:
1. Пiдключення модулiв
Програма на мовi Турбо Паскаль може складатися з декiлькох файлiв. Текстовi файли можуть включатися в основну програму за допомогою директиви компiлятора {$I iм'я файлу}. Об'єктнi файли вiдкомпiльованих асемблерних програм включаються директивою {$L iм'я файлу}. В окремих файлах розмiщуються також модулi, якi пiдключаються до програми командою Uses.
Модуль - це автономно вiдкомпiльована програмна одиниця, що включає в себе рiзнi компоненти роздiлу оголошення - типи, константи, змiннi, процедури i функцiї. Модуль може включати в себе також виконуванi оператори в роздiлi iнiцiалiзацiї.
Модулi дають можливiсть створювати бiблiотеки прикладних програм i являються потужним засобом модульного програмування.
Компiлятор розмiщує програмний код кожного модуля в окремому сегментi оперативної пам'ятi. Кiлькiсть модулiв, з якими працює програма, обмежується об'ємом наявної оперативної пам'ятi. Ім'я модуля повинно спiвпадати з iменем дискового файлу, в якому вiн зберiгається.
В Турбо Паскалi визначенi наступнi iмена для стандартних модулiв:
Crt - для роботи з дисплеєм та клавiатурою - керування режимами екрана, пiдтримка вiкон, кольору, звуку, розширених кодiв клавiатури;
Dos - для роботи з функцiями MSDOS - обробка переривань, керування датою i часом, пошук файлiв у каталогах, запуск зовнiшнiх програм;
Graph - графiчна бiблiотека;
Graph3 - реалiзацiя графiки для Турбо Паскаля 3.0;
Overlay - пiдтримка оверлейної структури програми;
Printer - вивiд iнформацiї на принтер;
System - базова бiблiотека Турбо Паскаля, мiстить пiдпрограми роботи з числовими та символьними даними, робота з файлами та iн.;
Turbo3 - для забезпечення сумiсностi з Турбо Паскаль 3.0.
Зв'язок мiж модулями i основною програмою здiйснюється командою Uses список модулiв;
Оператор Uses повинен бути тiльки один i розмiщений на початку програми перед блоком оголошень. Список модулiв задається через кому. Наприклад:
Uses Crt,Dos,Graph,MyUnit;
Цей оператор пiдключає пiдключає три бiблiотечних модулi: Crt - для роботи з екраном та клавiатурою, Dos - для роботи з функцiями MSDOS, Graph - для роботи з графiкою. Останнiй пiдключений модуль створюється користувачем.
Модуль System пiдключається до програми автоматично.
Якщо iм'я модуля не спiвпадає з iменем файлу зберiгання, то перед iменем модуля потрiбно записати директиву препроцесора {$U iм'я файла}, наприклад:
Uses {$U modul1.pas}MyUnit;
Стандартнi модулi розмiщуються у бiблiотечному файлi turbo.tpl, який пiдключається автоматично при завантаженнi Турбо Паскаля. Для роботи з бiблiотекою turbo.tpl використовується утiлiта TPUMOVER, яка дає можливiсть поповнити бiблiотеку новими модулями або витерти модулi з бiблiотеки.
При пiдключеннi модуля компiлятор насамперед переглядає вмiст системного бiблiотечного файла Turbo.tpl, потiм бiжучий каталог, i завершує пошук в каталогах, заданих опцiєю меню Options/Directories/Unit Directories iнтегрованого середовища.
При використаннi однакових iмен в модулях i програмi дiють наступнi правила:
1) оголошення програми перекривають оголошення модулiв;
2) оголошення останнього модуля перекривають оголошення передостаннього
модуля i т. д.
Для доступу до iмен модуля, якi перекриваються програмою або iншими модулями можна використати iм'я, складене з iменi модуля та iдентифiкатора змiнної, роздiлених крапкою, наприклад: MyUnit.x .
У виконуваний файл будуть помiщенi коди тiльки тих пiдпрограм модуля, до яких при компiляцiї програми був хоча б один виклик.
2. Структура модуля
Модуль складається iз заголовку, де записується його iм'я, та трьох роздiлiв - iнтерфейсного, реалiзацiї та iнiцiалiзацiї.
Unit iм'я модуля;
interface
{iнтерфейсний роздiл}
implementation
{роздiл реалiзацiї}
begin
{роздiл iнiцiалiзацiї}
end.
Модуль завершується службовим словом end, пiсля якого ставиться крапка. Роздiл iнiцiалiзацiї не є обов'язкрвим i може бути опущений разом iз словом begin.
Iнтерфейсний роздiл. Починається службовим словом interface i призначений для оголошення всiх глобальних об'єктiв модуля - типiв, констант, змiнних та пiдпрограм, якi мають бути доступними основнiй програмi або iншим модулям. При оголошеннi глобальних пiдпрограм в iнтерфейсному роздiлi вказуються тiльки їх заголовки.
Оголошення зовнiшнiх пiдпрограм (ключове слово external) та пiдпрограм в машинних кодах (ключове слово inline) повиннi записуватись зразу за їх заголовками. Тiло процедури або функцiї в машинних кодах розмiщується у круглих дужках пiсля слова inline (тобто в iнтерфейснiй частинi). Тiла всiх iнших пiдпрограм розмiщуються в роздiлi реалiзацiї.
В iнтерфейсному роздiлi модулiв не можна використовувати випереджаючий опис пiдпрограм (forward), асемблерних пiдпрограм (assembler) та процедур обробки переривань (interrupt).
На початку iнтерфейсного роздiлу можуть пiдключатися iншi модулi за допомогою службового слова Uses. iнформацiя з цих модулiв може бути необхiдною для всiх роздiлiв модуля - iнтерфейсного, реалiзацiї та iнiцiалiзацiї. Дiя модулiв, пiдключених в iнтерфейснiй частинi, є локальною до даного модуля. При необхiдностi пiдключення цих модулiв повинно бути здiйснено повторно в основнiй програмi.
Всi константи та змiннi, оголошенi в iнтерфейсному роздiлi, а також глобальнi об'єкти основної програми розмiщуються в одному загальному сегментi даних. Максимальний розмiр такого сегменту не повинен перевищувати 64 Кбайт.
Роздiл реалiзацiї. Починається службовим словом implementation i мiстить тiла процедур i функцiй, оголошених в iнтерфейснiй частинi. Список формальних параметрiв i тип функцiї можуть бути опущенi, але якщо вони є, то повиннi спiвпадати iз заголовком, оголошеним в iнтерфейснiй частинi.
Зразу пiсля слова implementation може стояти оператор Uses для пiдключення модулiв, необхiдних для оголошень типiв, змiнних та роботи пiдпрограм роздiлу реалiзацiї. Список модулiв роздiлу реалiзацiї не повинен повторювати список модулiв iнтерфейсного роздiлу.
В роздiлi реалiзацiї можуть оголошуватися локальнi для модуля об'єкти: допомiжнi типи, константи, змiннi, мiтки, пiдпрограми. iмена типiв, констант та змiнних, оголошених в iнтерфейсному роздiлi та роздiлi реалiзацiї не повиннi повторюватись. Можна оголошувати локальнi пiдпрограми типу inline, assembler, external, forward, interrupt.
В роздiлi реалiзацiї допускається довiльне звертання до пiдпрограм, оголошених в iнтерфейснiй частинi. Для пiдпрограм, оголошених в роздiлi реалiзацiї допускається звичайне для Турбо Паскаля звертання - знизу вгору. Для forward-пiдпрограм допускається довiльне звертання.
Роздiл iнiцiалiзацiї. Є необов'язковим i може бути опущеним, починаючи зi слова begin до end. В цьому роздiлi розмiщуються оператори, що виконуються до передачi управлiння основнiй програмi. При пiдключеннi декiлькох модулiв будуть виконанi роздiли iнiцiалiзацiї починаючи з останнього у списку модуля. Роздiли iнiцiалiзацiї всiх модулiв будуть виконанi до початку виконання операторної частини основної програми. В роздiлi iнiцiалiзацiї виконують деякi пiдготовчi дiї для роботи програми, наприклад вiдкривають робочi файли.
3. Компiляцiя модулiв
Програма на мовi Турбо Паскаль може бути вiдкомпiльована в одному з трьох режимiв, якi встановлюються за допомогою команд меню iнтегрованого середовища: Compile, Make, Build.
При компiляцiї в режимi Compile всi оголошенi в Uses модулi повиннi бути попередньо вiдкомпiльованi i результати їх компiляцiї розмiщенi в одноiменнi файли з розширенням .tpu .
В режимi Make компiлятор перевiряє наявнiсть TPU-файлiв для кожного оголошеного модуля. Якщо файл з розширенням .tpu не знайдений, то транслюється одноiменний файл з розширенням .pas. Якщо ж TPU-файл iснує, але у файл з розширенням .pas внесенi змiни, то також вiдбувається повторна компiляцiя файлу з розширенням .pas.
В режимi Build iснуючi .tpu-файли iгноруються i вiдбувається повторна компiляцiя всiх .pas-файлiв.
Текст програми:
program p;
Uses crt,Production;
Var i,j:integer;
A:TMatrix;
q:char;
Begin
Repeat
clrscr;
For i:=1 to n do
for j:=1 to n do
Begin
Write ('A[',i,' ',j,'] = ');
Readln (A[i,j]);
End;
If Ort(A)=true then writeln ('Матриця ортонормована')
else Writeln('Матриця не ортонормована');
writeln('------------------------');
Writeln ('Для виходу натисніть "Q"');
q:=readkey;
Until q='q';
End.
Текст модуля:
Unit Production;
Interface
const n=4;
Type TMatrix=array [1..n,1..n] of real;
Function Ort(A:TMatrix):Boolean;
Implementation
Function Ort;
Var i,j,k:integer; s:real; b:boolean;
begin
b:=true;
s:=0;
For i:=1 to n do
For j:=i+1 to n do
begin
For k:=1 to n do
s:=s+A[i,k]*A[j,k];
if s<>0 then b:=false;
end;
For i:=1 to n do
begin
s:=0;
For k:=1 to n do
s:=s+ A[i,k]*A[i,k];
if s<>1 then b:=false;
end;
Ort:=b;
End;
End.
Висновок: На цій лабораторні роботі я отримав зняння про створення модулів на мові Turbo Pascal.