Читайте также:
|
|
Теперь рассмотрим совсем другие файлы – те, в которых вы храните свою программу. Предположим, вы с другом решили создать программу из 7 процедур. Вы делаете 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.
Теперь вам нужно собрать оба куска в единую программу. Для этого вы можете скопировать текст из файла вашего друга в свой файл (как это делается, расказано в части IV). Но если вы не хотите этого делать, чтобы, скажем, не увеличивать свой файл, вы можете воспользоваться директивой компилятора $I. Директива компилятора - это специальная инструкция, вставленная в текст вашей программы на Паскале и предназначенная для управления компьютером на этапе компиляции вашей программы. Директива компиляции имеет вид {$.... } и Паскаль не путает ее с обычным комментарием только из-за наличия значка доллара. Символы, стоящие после значка доллара, и являются управляющей информацией для компилятора. Директива {$I c:\PASC\F25 } является приказом компилятору подставить в это место текст, находящийся в файле F25 из каталога PASC диска c. Если файл находится в текущем каталоге, то достаточно указать его имя. Вот ваша готовая к работе программа с директивой:
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;la;si;la;sol;fa;mi;re;doo
End.
Модули программиста
Известно, что в Паскале нет стандартной функции, возводящей число в целую неотрицательную степень. В целую степень, большую двух. Предположим, что вы математик, и вам нужна функция, возводящая число в любую целую неотрицательную степень. Напишем эту функцию:
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. В следующий раз будет использоваться именно он, а не 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,'< путь к гр.др >');{Инициализация графики}
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 или какие-нибудь другие.
Дата добавления: 2015-11-14; просмотров: 55 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Глава 15. Другие возможности Паскаля | | | Дополнительные процедуры и функции модуля Graph |