Доступ к объявленным в модуле объектам. Пусть, например, мы создаем модуль, реализующий арифметику комплексных чисел (такая арифметика ни в стандартном Паскале не предусмотрена).
Пусть, например, мы создаем модуль, реализующий арифметику комплексных чисел (такая арифметика ни в стандартном Паскале не предусмотрена).
К сожалению, в Паскале нельзя использовать функции, значения которых имели бы структурированный тип (запись, например), поэтому арифметика комплексных чисел реализуется четырьмя процедурами:
UNIT Cmplx;
{---------------------}
INTERFACE
{---------------------}
type complex = record
re, im:real
end;
Procedure AddC | (x, у | : complex; | var z | : complex) ; |
Procedure SubC | (x, у | : complex; | var z | : complex) ; |
Procedure MulC | (x, у | : complex; | var z | : complex) ; |
Procedure DivC | (x, у | : complex; | var z | : complex) ; |
const | ||||
с : complex = | (re : | 0.1; im : | -1); |
{---------------------}
IMPLEMENTATION
{---------------------}
Procedure AddC; begin
z.re := x.re + y.re; z . im := x.im + y. im
end {AddC};
Procedure SubC;
begin
z.re := x.re - y. re ;
z.im := x.im - y.im
end {SubC};
Procedure MulC;
begin
z.re := x.re*y.re - x.im*y. im;
z.im := x.re*у.im + x.im*y.re
end {MulC};
Procedure DivC;
var
zz : real;
begin
zz := sqr(y.re) + sqr(y.im);
z. re := (x.re * y.re + x.im * y.im) / zz;
z.im := (x.re * y.im - x.im * y.re) / zz
end {DivC};
end.
Текст этого модуля следует поместить в файл CMPLX.PAS.
Вы можете его откомпилировать, создав TPU-файл, после чего Вашей программе станут доступны процедуры из новой библиотеки.
Стандартные модули
В Паскале имеется восемь стандартных модулей, в которых содержится большое число разнообразных типов, констант, процедур и функций.
Этими модулями являются SYSTEM, DOS, CRT, PRINTER, GRAPH, OVERLAY, TURBOS и GRAPH3.
Модули GRAPH, TURBOS и GRAPHS выделены в отдельные TPU-файлы, а остальные входят в состав библиотечного файла TURBO.TPL.
Лишь один модуль SYSTEM подключается к любой программе автоматически, все остальные становятся доступны только после указания их имен в списке, следующем за словом USES.
Ниже приводится краткая характеристика стандартных модулей.
Модуль SYSTEM. В него входят все процедуры и функции стандартного Паскаля, а также встроенные процедуры и функции, которые не вошли в другие стандартные модули (например, INC, DEC, GETDIR и т.п.).
Как уже отмечалось, модуль SYSTEM подключается к любой программе независимо от того, объявлен ли он в предложении USES или нет, поэтому его глобальные константы, переменные и подпрограммы считаются встроенными в Турбо Паскаль.
Модуль PRINTER.
Делает доступным вывод текстов на матричный принтер.
В нем определяется файловая переменная LST типа TEXT, которая связывается с логическим устройством PRN. После подключения модуля может быть выполнена, например, такая программа:
Uses Printer;
begin
writeln (LST, 'Турбо Паскаль')
end.
Модуль CRT.
В нем сосредоточены процедуры и функции, обеспечивающие управление текстовым режимом работы экрана.
С помощью входящих в модуль подпрограмм можно перемещать курсор в произвольную позицию экрана, менять цвет выводимых символов и окружающего их фона, создавать окна. Кроме того, в модуль включены также процедуры «слепого» чтения клавиатуры и управления звуком.
Модуль GRAPH.
Содержит обширный набор типов, констант, процедур и функций для управления графическим режимом работы экрана.
С помощью подпрограмм, входящих в модуль GRAPH, можно создавать разнообразные графические изображения и выводить на экран текстовые надписи стандартными или разработанными программистом шрифтами.
Подпрограммы модуля GRAPH после соответствующей настройки могут поддерживать различные типы аппаратных графических средств.
Настройка на имеющиеся в распоряжении программиста технические средства графики осуществляется специальными программами - драйверами, которые не входят в файл GRAPH. TPU, но поставляются вместе с ним.
Модуль DOS.
В модуле собраны процедуры и функции, открывающие доступ программам к средствам дисковой операционной системы MS- DOS.
Модуль OVERLAY.
Он необходим при разработке громоздких программ с перекрытиями.
Как уже говорилось, Паскаль обеспечивает создание программ, длина которых ограничивается лишь основной оперативной памятью ПК.
Операционная система MS-DOS оставляет исполняемой программе около 580 Кбайт основной памяти (без учета резидентных программ и самой системы
Паскаль).
Память такого размера достаточна для большинства применений, тем не менее использование программ с перекрытиями снимает это ограничение.
Справочная информация
Существуют стандартные модули Паскаля (system, crt, graph и т.д.), справочная информация по которым дана в приложении.
Приведем пример разработки и использования модуля.
Рассмотрим следующую задачу.
Реализовать в виде модуля набор подпрограмм для выполнения следующих операций над обыкновенными дробями вида P/Q (P – целое, Q - натуральное):
- сложение;
- вычитание;
- умножение;
- деление;
- сокращение дроби;
- возведение дроби в степень N (N — натуральное);
- функции, реализующие операции отношения (равно, не равно, больше или равно, меньше или равно, больше, меньше).
Дробь представить следующим типом:
Type Frac=Record
Р: Integer;
Q: 1..32767
End;
Используя этот модуль, решить задачи:
1. Дан массив А, элементы которого — обыкновенные дроби.
Найти сумму всех элементов и их среднее арифметическое; результаты представить в виде несократимых дробей.
2. Дан массив А, элементы которого — обыкновенные дроби.
Отсортировать его в порядке возрастания.
Unit Droby;
Interface
Type
Natur=l..High(Longlnt) ;
Frac=Record
P: Longlnt;
Q: Natur
End;
Procedure Sokr(Var A: Frac);
Procedure Summa(A,B: Frac; Var C: Frac);
Procedure Raznost(A,B: Frac; Var C: Frac);
Procedure Proizvedenie(A,B: Frac; Var C: Frac);
Procedure Chastnoe(A,B: Frac; Var C: Frac);
Procedure Stepen(A: Frac; N: Natur; Var C: Frac);
Function Menshe(A,B: Frac): Boolean;
Function Bolshe(A,B: Frac): Boolean;
Function Ravno(A,B: Frac): Boolean;
Function MensheRavno(A,B: Frac): Boolean;
Function BolsheRavno(A,B: Frac): Boolean;
Function NeRavno(A,B: Frac): Boolean;
{Раздел реализации модуля} Implementation
{Наибольший общий делитель двух чисел -вспомогательная функция, ранее не объявленная) Function NodEvklid(A,B: Natur): Natur;
Begin
While AOB Do
If A>B Then
If A Mod B<>0 Then A:=A Mod В
Else A:=B
Else
If В Mod A<>0 Then B:=B Mod A
Else B:=A;
NodEvklid:=A End;
(Сокращение дроби}
Procedure Sokr;
Var M,N: Natur;
Begin
If A.P<>0
Then
Begin
If A.P<0
Then M:=Abs(A.P)
Else M:=A.P;
{Совмещение типов, т.к. А.Р -Longint}
N:=NodEvklid(M,A.Q);
A.P:=A.P Div N;
A.Q:=A.Q Div N
End
End;
Procedure Summa; {Сумма дробей}
Begin
{Знаменатель дроби}
C.Q:=(A.Q*B.Q) Div NodEvklid(A.Q,B.Q);
{Числитель дроби}
C.P:=A.P*C.Q Div A.Q+B.P*C.Q Div B.Q;
Sokr(C)
End;
Procedure Raznost; {Разность дробей}
Begin
{Знаменатель дроби}
C.Q:=(A.Q*B.Q) Div NodEvklid(A.Q,В.Q);
{Числитель дроби)
C.P:=A.P*C.Q Div A.Q-B.P*C.Q Div B.Q;
Sokr(C)
End;
Procedure Proizvedenie; {Умножение дробей)
Begin
{Знаменатель дроби}
C.Q:=A.Q*B.Q;
{Числитель дроби}
С.Р:=А.Р*В.Р;
Sokr(С)
End;
Procedure Chastnoe;
{Деление дробей}
Begin
{Знаменатель дроби}
C.Q:=A.Q*B.P;
{Числитель дроби}
C.P:=A.P*B.Q;
Sokr(С)
End;
Procedure Stepen; {Возведение дроби в степень}
Var I: Natur;
Begin
C.Q:=1;
C.P:=1;
Sokr(A);
For I:=l To N Do
Proizvedenie(А,С,С)
End;
Function Menshe; {отношение '<' между дробями}
Begin
Menshe:=A.P*B.Q<A.Q*B.P
End;
Function Bolshe; {отношение '>' между дробями}
Begin
Bolshe:=A.P*B.Q>A.Q*B.P
End;
Function Ravno; {отношение '=' между дробями}
Begin
Ravno:=A.P*B.Q=A.Q*B.P
End;
Function BolsheRavno; {отношение '>=' между дробями}
Begin
BolsheRavno:=Bolshe(А,В) Or Ravno(A,B)
End;
Function MensheRavno; {отношение '<=' между дробями}
Begin
MensheRavno:=Menshe(А,В) Or Ravno(A,B)
End;
Function NeRavno; {отношение '<>' между дробями}
Begin
NeRavno:=Not Ravno(A,B)
End;
{Раздел инициализации модуля}
Begin
End.
При разработке модуля рекомендуется такая последовательность действий:
· Спроектировать модуль, т.е. определить основные и вспомогательные подпрограммы и другие ресурсы.
· Описать компоненты модуля.
· Каждую подпрограмму целесообразно отладить отдельно, после чего «вклеить» в текст модуля.
Сохраним текст разработанной программы в файле droby . pas и откомпилируем наш модуль.
Для этого можно воспользоваться внешним компилятором, поставляемым вместе с Паскалем.
Команда будет выглядеть так: трс droby . pas.
Если в тексте нет синтаксических ошибок, получим файл droby . tpu, иначе будет выведено соответствующее сообщение с указанием строки, содержащей ошибку.
Другой вариант компиляции: в меню системы программирования
Паскаль выбрать Compile/Destination Disk, затем — Compile/Build.
Теперь можно подключить модуль к программе, где планируется его использование.
Решим первую задачу — выполним суммирование массива дробей.
Program Sum; Uses Droby;
Var A: Array[1..100] Of Frac;
I,N: Integer;
S: Frac;
Begin
Write('Введите количество элементов массива:’);
ReadLn(N);
S.P:=0; S.Q:=1; {Первоначально сумма равна нулю}
For I:=l To N Do {Вводим и суммируем дроби}
Begin
Write('Введите числитель',I,' -и дроби:');
ReadLn(A[I]. Р);
Write ('Введите знаменатель ',1,'-й дроби:');
ReadLn(A[I].Q) ;
Summa(A[I] ,S, S) ;
End;
WriteLn ('Ответ:',S.P, '/',S.Q)
End.
Вторую задачу предлагается решить самостоятельно.
Как видно из примера, для подключения модуля используется служебное слово uses,
после которого указывается имя модуля.
Данная строка записывается сразу же после заголовка программы.
Если необходимо подключить несколько модулей, они перечисляются через запятую.
При использовании ресурсов модуля программисту совсем не обязательно иметь представление о том, как работают вызываемые подпрограммы.
Достаточно знать назначение подпрограмм и их спецификации, т. е. имена и параметры.
По такому принципу осуществляется работа со всеми стандартными модулями.
Поэтому если программист разрабатывает модули не только для личного пользования, ему необходимо выполнить полное описание всех доступных при подключении ресурсов.