Л а б о р а т о р н а р о б о т а N 8
Модульне програмування у Турбо Паскалi

Мета роботи полягае у вивченнi способiв оголошення модулiв та
•х пiдключення до програми.
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мена для стандартних модул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в.
4. Завдання для роботи
Використовуючи засоби модульного програмування написати програму
на мовi Turbo Pascal:
==========================================================================
1. Написати програму переводу цiлого десяткового числа у двiйкову систему
числення.
2. З клавiатури вводиться рядок символiв, що складається з слiв, роздiлених
пропусками. Написати програму на мовi Паскаль, яка витирає з цього рядка
всi входження заданого слова.
3. Написати програму переводу дробової частини дiйсного десяткового числа у
двiйкову систему числення, обмежившись 16-ма двiйковими розрядами.
4. Написати програму переводу цiлого 8-розрядного шiстнадцяткового числа у
десяткову систему числення.
5. Написати програму переводу цiлого десяткового числа у вiсiмкову
систему числення.
6. Написати програму переводу цiлого 8-розрядного вiсiмкового числа у
десяткову систему числення.
7. Написати програму переводу дробової частини дiйсного десяткового числа у
шiстнадцяткову систему числення, обмежившись 8-ма розрядами.
8. Написати програму переводу цiлого 8-розрядного шiстнадцяткового
числа числа у вiсiмкову систему числення.
9. Написати програму переводу дробової частини дiйсного числа у вiсiмкову
систему числення, обмежившись 8-ма розрядами.
10. Заданий файл записiв з даними про продукцiю пiдприємства: код виробу,
назва виробу, кiлькiсть, цiна одного виробу). Сформувати новий файл,
вибравши всi вироби з цiною, меншою вiд заданої цiни.
11. Сформувати в областi динамiчної пам'ятi однонаправлений впорядкований
по зростанню лiнiйний список дiйсних чисел, введених з клавiатури.
Вставити у цей список число, отримане вiд генератора випадкових величин,
так, щоб не порушити впорядкованiсть списку.
12. Заданi дiйснi числа s, t. Знайти f(1.2,s)+f(t,s)-f(2s-1,st). Обчислення
оформити у виглядi модуля.
13. Використовуючи оголошення типiв
type кольори=(червоний, синiй, зелений);
палiтра=set of кольори;
картина=array[1..n, 1..n] of палiтра;
написати процедуру PROC(K:картина; var A:палiтра), яка параметру A
присвоює множину кольорiв, якi входять в палiтру елементiв масиву K,
розмiщених на головнiй дiагоналi.
14. Заданий невпорядкований файл записiв: назва автомобiля, марка, номер,
прiзвище власника. Знайти кiлькостi автомобiлiв кожної марки.
15. Сформувати в областi динамiчної пам'ятi однонаправлений лiнiйний
список з 20-ти випадкових чисел. Помiняти мiсцями мiнiмальний та
максимальний елементи.
16. Заданий невпорядкований файл записiв з даними про продукцiю
пiдприємства: код виробу, назва виробу, кiлькiсть, цiна одного виробу).
Знайти сумарну вартiсть продукцiї для кожного окремого коду виробiв.
17. Сформувати в областi динамiчної пам'ятi однонаправлений лiнiйний
список iз 20-ти випадкових чисел. Виключити iз списку всi елементи, якi
потрапляють у заданий iнтервал [a,b].
18. Заданi дiйснi числа s, t. Знайти f(t, -2s, 1.17) + f(2.2, t, s - t).
Обчислення оформити у виглядi модуля.
19. Використовуючи оголошення типiв
type кольори=(червоний, синiй, зелений);
палiтра=set of кольори;
картина=array[1..n, 1..n] of палiтра;
написати процедуру PROC(K:картина; var A:палiтра), яка параметру A
присвоює множину кольорiв, якими зафарбована побiчна дiагональ масиву K.
20. Заданий невпорядкований файл записiв з даними про науковi працi:
прiзвище автора, назва статтi, назва журналу, рiк видання. Знайти кiлькостi
публiкацiй кожного автора.
21. Сформувати в областi динамiчної пам'ятi однонаправлений лiнiйний
список дiйсних чисел, якi вводяться з клавiатури. Впорядкувати цей список
по зростанню значень елементiв.
22. Заданi дiйснi числа . Для дiйсного x, яке мiняється вiд 1 до 5
з кроком 0.5 отримати значення z=p(x+1)-p(x). Обчислення оформити
у виглядi модуля.
23. Заданий невпорядкований файл записiв з iнформацiєю про засоби
комп'ютерної технiки, якi є у розпорядженнi пiдроздiлiв унiверсистету: тип
ЕОМ, кiлькiсть, назва пiдроздiлу. Визначити загальну кiлькiсть ЕОМ, якi є у
розпорядженнi кожного iз пiдроздiлiв унiверситету.
24. Сформувати в областi динамiчної пам'ятi двонаправлений список 20-ти
дiйсних чисел, отриманих за допомогою генератора випадкових величин.
Виключити зi списку мiнiмальний елемент.
25. Заданi змiннi k, l, m, n дiйсного типу. Знайти f(2k, l+n, m-3n, km-
l)+f(l+km, n-m, 4k, ln). Обчислення оформити у виглядi модуля.
26. Використовуючи оголошення типiв
type кольори=(червоний, синiй, зелений);
палiтра=set of кольори;
картина=array[1..n, 1..n] of палiтра;
написати процедуру PROC(K:картина; var A:палiтра), яка параметру A
присвоює множину кольорiв, якi входять в палiтру елементiв масиву K,
розмiщених вище головної дiагоналi.
27. Заданий невпорядкований файл записiв: назва виробу, код виробу,
кiлькiсть, цiна одного виробу, дата (dd/mm/yy). По кожному коду виробу
визначити вартiсть продукцiї, виготовленої на протязi заданого мiсяця.
28. Сформувати в областi динамiчної пам'ятi двонаправлений кiльцевий
список 20-ти дiйсних чисел, отриманих за допомогою генератора випадкових
величин. Пiдрахувати кiлькiсть елементiв, менших вiд своїх двох сусiднiх
елементiв.
29. Заданi змiннi r, s, t дiйсного типу. Обчислити f(sin(r), t-2s, 4r)-f(t-r,st-
4,3t). Обчислення оформити у виглядi модуля.
30. Заданий невпорядкований файл записiв: назва виробу, код виробу,
кiлькiсть, цiна одного виробу, дата (dd/mm/yy). Впорядкувати файл по
зростанню кодiв виробiв.
31. Сформувати в областi динамiчної пам'ятi двонаправлений список цiлих
чисел, якi вводяться з клавiатури. Вставити у список елемент, отриманий вiд
генератора випадкових величин, пiсля максимального елемента.
32. Заданi дiйснi a, b, c. Обчислити f(a,b-c)f(c,b-a)-2f(a+c,b). Обчислення
оформити у виглядi модуля.
33. Написати модуль, який виконує обчислення евклiдової норми вектора
дiйсних чисел. Евклiдова норма - це корiнь квадратний з суми квадратiв
елементiв вектора. Виконати пiдключення модуля до основної програми та
звертання до його пiдпрограм.
34. Визначити, чи задана цiла квадратна матриця 10-го порядку є
симетрична вiдносно боково• дiагоналi.
35. Написати модуль, який знаходить мiнiмальний та максимальний елементи
вектора дiйсних чисел. Виконати пiдключення модуля до основної програми
та звертання до його пiдпрограм.
36. Визначити, чи задана цiла квадратна матриця 9-го порядку є магiчним
квадратом, тобто такою, в якiй суми елементiв у всiх рядках i стовпчиках
однаковi.
37. Створити файл записiв з наступною структурою: дата, номер цеху, код
виробу, кiлькiсть виробiв, цiна одного виробу. Для заданого коду виробу
знайти вартiсть продукцiї, виготовлненої цехом N 1.
38. Написати модуль, який виконує обчислення евклiдової норми кожного
рядка прямокутної матрицi дiйсних чисел. Евклiдова норма - це корiнь
квадратний з суми квадратiв елементiв вектора. Виконати пiдключення
модуля до основної програми та звертання до його пiдпрограм.
39. Визначити чи задана цiла квадратна матриця 7-го порядку є
ортонормованою, тобто такою, в якiй скалярний добуток кожної пари
рiзних рядкiв дорiвнює 0, а скалярний добуток кожного рядка на себе
дорiвнює 1. Скалярний добуток двох векторiв однакової розмiрностi - це сума
добуткiв їх елементiв з рiвними iндексами.
40. Створити файл записiв з наступною структурою: дата, номер цеху, код
виробу, кiлькiсть виробiв, цiна одного виробу. Для заданого коду виробу
сумарну кiлькiсть продукцiї, виготовлненої до задано• дати.
41. Написати модуль, який виконує пошук мiнiмальних елементiв у кожному
стовчику прямокутної матрицi дiйсних чисел. Виконати пiдключення модуля
до основної програми та звертання до його пiдпрограм.
42. Написати програму для множення прямокутної матрицi дiйсних чисел
А(n*m) на вектор дiйсних чисел В(m).
43. Заданий файл записiв з наступною структурою: код виробу, цiна одного
виробу. З клавiатури вводиться iнформацiя про продукцiю пiдприємства у
виглядi запису: код виробу, кiлькiсть виробiв. Для кожного коду знайти
сумарну вартiсть виготовленої продукцiї.
44. Написати модуль, який виконує сортування вектора дiйсних чисел по
зростанню значень елементiв. Виконати пiдключення модуля до основної
програми та звертання до його пiдпрограм.
45. Заданий файл записiв з iнформацiєю про продукцiю, яка зберiгається на
складi пiдприємства: дата, код виробу, кiлькiсть виробiв. З клавiатури
вводиться iнформацiя про прихiд або розхiд продукцiї на протязi робочого
дня у такому ж форматi. Для заданого коду знайти залишок продукцiї на
кiнець робочого дня.
46. Написати модуль, який перевiряє, чи заданий вектор дiйсних чисел
впорядкований по зростанню значень елементiв. Виконати пiдключення
модуля до основної програми та звертання до його пiдпрограм.
47. Написати програму для множення прямокутної матрицi дiйсних чисел
А(n*m) на матрицю дiйсних чисел С(m*p).
48. Заданий файл-каталог з iнформацiєю про книги бiблiотеки: автор, назва
книги, видавництво, рiк видання, кiлькiсть сторiнок, тематика. Роздрукувати
у формi таблицi данi про наявнiсть книг у бiблiотецi по заданiй тематицi, рiк
видання яких, бiльший вiд заданого.
49. Написати модуль, який виконує нормування вектора дiйсних чисел шляхом
дiлення його елементiв на максимальний елемент. Виконати пiдключення
модуля до основної програми та звертання до його пiдпрограм.
50. Вiдомостi про автомобiль складаються iз його марки, 7-значного номера та
прiзвища власника. Знайти i вивести на екран прiзвища власникiв
автомобiлiв, номер яких починається на '01'.