Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тurbo Pascal 7+.doc
Скачиваний:
12
Добавлен:
24.12.2018
Размер:
10.09 Mб
Скачать

15.2. Вставка в программу фрагментов из других программных файлов

Рассмотрим файлы, в которых вы храните свою программу. Предположим, вы с другим пользователем решили создать программу из семи процедур. Вы делаете 3 процедуры и тело программы, а другой пользователь - 4 процедуры. Пользователь записал все 4 процедуры в файл VSTAVKA.pas на вашем компьютере. Вот он:

PROCEDURE fa; BEGIN Sound(698); Delay(300); NoSound END;

PROCEDURE sol; BEGIN Sound(784); Delay(300); NoSound END;

PROCEDURE la; BEGIN Sound(880); Delay(300); NoSound END;

PROCEDURE si; BEGIN Sound(988); Delay(300); NoSound END;

Конечно, файл другого пользователя не является законченной программой и сам по себе не запускается. А вот ваша программа:

USES CRT;

PROCEDURE doo; BEGIN Sound(523); Delay(300); NoSound END;

PROCEDURE re; BEGIN Sound(587); Delay(300); NoSound END;

PROCEDURE mi; BEGIN Sound(659); Delay(300); NoSound END;

BEGIN

doo;re;mi;fa;sol;la;si;la;sol;fa;mi;re;doo

END.

Теперь нужно собрать все процедуры в единую программу. Для этого мы можем скопировать текст из файла другого пользователя в свой файл. (как это делается, рассказано в части 4). Но если вы не хотите этого делать, чтобы, скажем, не увеличивать свой файл, вы можете воспользоваться директивой компилятора $I. Директива компилятора - это специальная инструкция, вставленная в текст вашей программы на Паскале и предназначенная для управления компьютером на этапе компиляции вашей программы. Директива компиляции имеет вид {$....}, и Паскаль не путает ее с обычным комментарием только из-за наличия значка доллара. Символы, стоящие после значка доллара, и являются управляющей информацией для компилятора. Директива {$I c:\PASC\F25} является приказом компилятору подставить в это место текст, находящийся в файле F25 из каталога PASC диска с. Если файл находится в текущем каталоге, то достаточно указать его имя. Вот ваша готовая к работе программа с директивой:

USES CRT;

PROCEDURE doo; BEGIN Sound(523); Delay(300); NoSound END;

PROCEDURE re; BEGIN Sound(587); Delay(300); NoSound END;

PROCEDURE mi; BEGIN Sound(659); Delay(300); NoSound END;

{$I VSTAVKA} {Директива компилятору на вставку текста из файла VSTAVKA}

BEGIN

doo;re,mi;fa;sol;!a;si;la;sol,fa;mi;re,doo

END.

15.3. Модули программиста

В Паскале нет стандартной функции, возводящей число в целую неотрицательную степень, большую двух. Предположим, что вы математик и вам нужна функция, возводящая число в любую целую неотрицательную степень. Напишем эту функцию:

FUNCTION st(a:Real; n:Word) :Real;

VAR step :Real;

i :Word;

BEGIN

step:=1;

for i:=1 to n do step:=step*a;

st:=step;

END;

BEGIN

WriteLn(st(2,3)) {Это 2 в кубе, то есть 8}

END.

Пусть вы часто пишете программы, использующие возведение в степень. Но вам не хочется в каждую такую программу вставлять описание функции St. Вы можете пойти двумя путями:

• описать st и другие часто встречающиеся процедуры и функции в другом файле и использовать директиву $I;

• описать st и другие часто встречающиеся процедуры и функции в другом файле и оформить этот файл как новый модуль.

Второй способ немного сложнее, но намного лучше первого. Вот как будет выглядеть ваш модуль:

UNIT Mathemat; {Заголовок модуля с придуманным вами именем}

INTERFACE {Раздел ИНТЕРФЕЙСА}

FUNCTION st(a:Real; n:Word) :Real;

IMPLEMENTATION {Раздел РЕАЛИЗАЦИИ}

FUNCTION st;

VAR step :Real;

i :Word;

BEGIN

step:=1;

for i:=1 to n do step:=step*a;

st=step

END;

BEGIN {Раздел ИНИЦИАЛИЗАЦИИ, у нас он пуст}

END.

Нам нужно просто ввести этот текст, как обычную программу, в новое окно текстового редактора и сохранить на диске под именем Mathemat.pas, так как имя файла, в котором расположен модуль, должно совпадать с именем модуля. Однако, модуль не является программой и не может быть запущен на выполнение сам по себе. Пользоваться вашим новым модулем вы можете так же, как обычным стандартным. Вот ваша программа, вызывающая модуль:

USES Mathemat;

BEGIN

WriteLn(st(10,6) :20:4); {Это 10 в шестой степени}

WriteLn(st(5,3) :20:4); {Это 5 в кубе}

END.

Файл-модуль на первых порах сохраняйте в том же каталоге, в котором находится и файл вызывающей его программы.

Когда вы в первый раз запустите на выполнение программу, вызывающую ваш новый модуль, этот модуль откомпилируется и сохранится на диске под именем Mathemat.tpu. B следующий раз будет использоваться именно он, а не Mathemat.pas (до тех пор, пока вы не измените текст модуля).

В разделе интерфейса вы приводите заголовки предназначенных для использования процедур, функций, а также описания типов, переменных и констант, которые вы также не хотите каждый раз описывать в вызывающей программе. В общем, все то, чем могут пользоваться другие программы.

В разделе реализации вы приводите краткие заголовки процедур и функций, полные заголовки которых приведены в разделе интерфейса, и описываете их тела. Если этим процедурам и функциям понадобятся для работы вспомогательные процедуры и функции, типы, константы и переменные, то они тоже описываются в разделе реализации.

Рассмотрим еще один пример. Предположим, что вы часто пишете графические программы и вам надоело в каждой программе инициализировать графику. К тому же стандартный модуль Graph позволяет вам рисовать кружочки и квадратики, но не позволяет рисовать крестики и треугольники. И наконец, вы бы хотели, чтобы в начале работы любой вашей программы экран был обведен желтой рамочкой. Вот модуль, решающий эти задачи:

UNIT Mygraph;

INTERFACE {Раздел ИНТЕРФЕЙСА}

PROCEDURE krest(x_tsentr, y_tsentr, razmer :Word);

{Задаются координаты центра и размер креста}

PROCEDURE treug(x1, y1, x2, y2, x3, y3 :Word);

{Задаются координаты трех вершин треугольника}

IMPLEMENTATION {Раздел РЕАЛИЗАЦИИ}

USES Graph; {Без этого не будет работать процедура Line}

PROCEDURE krest; BEGIN

Line(x_tsentr-razmer, y_tsentr, x_tsentr+razmer, y_tsentr);

Line(x_tsentr, y_tsentr-razmer, x_tsentr, y_tsentr+razmer);

END;

PROCEDURE treug; BEGIN

Line(x1,y1,x2,y2);

Line(x2,y2,x3,y3);

Line(x3,y3,x1,y1);

END;

{Раздел ИНИЦИАЛИЗАЦИИ}

VAR d,m :Integer; {Переменные для инициализации графики}

BEGIN

d:=0;

InitGraph(d,m,'<nyть к гр.др>'); {Инициализация графики}

SetColor(Yellow); {Рисуем рамочку}

SetLineStyle(0,0,ThickWidth);

Rectangle(10,10,630,470);

SetColor(White); {Возвращаем нормальный цвет}

SetLineStyle(0,0,NormWidth) {Возвращаем нормальную толщину линии}

END.

Если вы хотите, чтобы при запуске программы, использующей модуль, каждый раз перед выполнением самой программы автоматически выполнялись какие-то действия, вы задаете соответствующие операторы в разделе инициализации. Если для этого нужны константы, типы и переменные, они описываются в разделе реализации.

Вот программа, рисующая крест, треугольник и кружок:

USES Mygraph,Graph;

BEGIN

treug(500,50,600,300,450,450);

krest(200,150,80);

Circle(100,350,40);

ReadLn;

END.

Обращение здесь к модулю Graph понадобилось только из-за желания нарисовать кружок.

Использование модулей лучше использования директивы $I по двум причинам:

  • модуль уже откомпилирован и не требует каждый раз компиляции;

  • объем программы без модулей не может превышать 64 К. Каждый модуль может вмещать в себя дополнительно 64 К.

Задание 129

Если хотите, создайте себе модули Music, Graphica или какие-нибудь другие.