Слайд 2Зачем нужны модули?
Стандартный паскаль: модулей нет.
Место подпрограмм – перед разделом
действий программы. Подпрограмма – часть программы.
Единственная возможность использования в
программе отдельно подготовленной подпрограммы – вставка в программу текста подпрограммы на алгоритмическом языке =>
Невозможна раздельная компиляция подпрограммы и программы =>
Невозможно создание библиотеки откомпилированных алгоритмов (объектных модулей). Это основной недостаток стандартного паскаля и всех алгоритмических языков, использующих блочную программу.
Слайд 3Зачем нужны модули?
Для обеспечения возможности компиляции программы по частям.
Модули введены
в Турбо Паскаль и поддерживаются в Объектном Паскале.
Слайд 4Что такое модуль?
Модуль - это автономно компилируемая программная
единица, включающая в себя различные разделы описаний (типов, констант, переменных,
процедур и функций) и, возможно, некоторые исполняемые операторы (например, присваивание переменным начальных значений или установление связи между программными и физическими именами файлов).
Слайд 5Что такое модуль?
Модуль - это автономно компилируемая программная единица.
Модуль может
быть подключен к любой паскаль-программе или к другому модулю (программной
единице).
Модуль включает в себя различные разделы описаний (типов, констант, переменных, процедур и функций).
Модуль делится на две основные части: интерфейсную (interface) и исполняемую (implementation). В интерфейсной части даются описания, которые могут использоваться в программной единице, к которой подключен модуль. В исполняемой части приводятся описания, доступные только внутри модуля.
Кроме описаний, модуль может содержать некоторые операторы, подготавливающие условия для использования модуля (например, присваивание переменным начальных значений или установление связи между программными и физическими именами файлов). Такие операторы содержатся в части модуля, которая называется инициализирующей. Эта часть не является обязательной.
В Объектном Паскале модуль также может иметь завершительную часть (finalization), состоящую из операторов, обеспечивающих грамотное завершение программной единицы, использующей модуль.
Слайд 6При изучении модулей надо освоить:
Правила создания модулей (структуру модуля).
Правила использования
модулей.
Слайд 7Структура модуля (ТП, ОП)
UNIT имя_модуля;
INTERFACE
интерфейсная_часть
IMPLEMENTATION
исполняемая_часть
[BEGIN
инициирующая_часть]
END.
от подпрограмм – только заголовки
заголовки подпрограмм
могут быть сокращенными
Слайд 8Структура модуля (ОП)
UNIT имя_модуля;
INTERFACE
интерфейсная_часть
IMPLEMENTATION
исполняемая_часть
[INITIALIZATION
инициирующая_часть]
[FINALIZATION
завершающая_часть]
END.
Слайд 9Имя файла, содержащего модуль
Имя_модуля.pas
При компиляции
ТП: Имя_модуля.pas => Имя_модуля.tpu
ОП: Имя_модуля.pas
=> Имя_модуля.dcu
Слайд 10Пример: Модуль VECTOR, позволяющий осуществлять некоторые операции над векторами
Unit
VECTOR; {операции над векторами}
INTERFACE
Type AR=Array[1..10] of real;
Function Scpr(Var a,b:Ar;N:Integer):Real;
{вычисление скалярного
произведения двух векторов}
Function Lngth(Var a:Ar; N:Integer):Real;
{вычисление длины вектора}
Function UngleRad(Var a,b:Ar; N:Integer):Real;
{вычисление угла между двумя векторами в радианах}
Function UngleGr(Var a,b:Ar;N:Integer):Real;
{вычисление угла между двумя векторами в градусах}
Procedure Sum(Var a,b,c:Ar;N:Integer);
{вычисление суммы двух векторов}
Procedure Inp(Var a:Ar; N:Integer);
{ввод координат вектора}
Слайд 11Продолжение примера
IMPLEMENTATION
Function Scpr;
Var I:Integer; S:Real;
Begin
S:=0;
For i:=1 To N
Do
S:=S+a[i]*b[i];
Scpr:=S;
End;
Function Lngth;
Begin
Lngth:=Sqrt(Scpr(a,a,N));
End;
Function UngleRad;
Var x:Real;
Begin
x:=Scpr(a,b,N)/Lngth(a,N)/
Lngth(B,N);
If x=0 then UngleRad:=pi/2
Else
UngleRad:=ArcTan(Sqrt(1-
x*x)/x);
End;
Function UngleGr;
Begin
UngleGr:=UngleRad(a,b,3)/pi*180;
End;
Слайд 12Продолжение примера
Procedure Sum;
Var i:Integer;
Begin
For i:=1 to
N Do
c[i]:=a[i]+b[i]
End;
Procedure Inp;
Var I:Integer;
Begin
For i:=1 To N Do
Read(a[i]);
Readln
End;
End.
Слайд 13Использование модулей
Если программа использует модули, то в ее начале,
перед всеми разделами описаний, должно стоять ключевое слово USES, после
которого через запятую перечисляются имена этих модулей. Например:
Program ppp;
Uses crt,graph; {программа ppp использует модули crt и graph}
Слайд 14Если модуль использует другие модули, то предложение USES может стоять
либо после слова INTERFACE, либо после слова IMPLEMENTATION. Модули, подключенные
в интерфейсной части, доступны в любой точке рассматриваемого модуля; модули, подключенные в исполняемой части, доступны в любом месте модуля, за исключением интерфейсной части. Примеры использования модулем других модулей будут рассмотрены позже.
Использование модулей
Слайд 15Пример: программа, использующая модуль VECTOR
Program Primunit;
{Даны два вектора а и
b в трехмерном пространстве;}
{вычисляется длина вектора с (с=а+b) и угол
между вектором с и плоскостью XOY}
Uses VECTOR; {используется модуль VECTOR}
Var a,b,c,cpr:Ar;{тип ar объявлен в модуле}
Begin
Writeln(' Введите координаты исходных векторов');
Inp(a,3);Inp(b,3); {ввод а и в}
Sum(a,b,c,3); {c=a+b}
Writeln(' Длина вектора-суммы:', Lngth(c,3):10:3);
cpr[1]:=c[1]; cpr[2]:=c[2]; cpr[3]:=0;
{cpr - проекция с на плоскость XOY}
If Lngth(cpr,3)< 1.0e-6 then
Writeln('вектор c ортогонален плоскости XOY')
Else
Слайд 16Продолжение примера
Begin
Write(' Угол между вектором с и
плоскостью XOY:',
UngleGr(c,cpr,3):6:1);
Writeln(' градусов');
End;
Readln;
End.
Слайд 17Подключение модулей в Турбо Паскале
Чтобы файлы с расширением .TPU были
доступны среде Turbo (Borland) Pascal, их следует поместить в текущий
каталог или указать их содержащий каталог в диалоговом окне опции OPTIONS/DIRECTORIES/UNIT DIRECTORIES.
Слайд 18Uses имя_модуля in имя директории
Добавление модуля в проект в Испекторе
проектов.
Подключение модулей в Delphi
Слайд 19Модули как средство программирования
Модули, прежде всего, дают возможность компилировать
программу по частям и создавать библиотеки откомпилированных подпрограмм. Однако этим
не исчерпываются возможности, которые они дают программисту.
Модули, кроме описания процедур и функций, могут содержать также описания констант, типов, переменных, что избавляет программиста от необходимости их повторного описания.
Информация модуля разделена по уровням доступа. В модуле выделяются видимая, доступная другим программам и содержащая основную информацию для использующего модуль программиста, интерфейсная часть и невидимая исполняемая часть.
В модуле могут присутствовать инициирующая и завершающая части, обеспечивающие грамотное использование модуля.
Слайд 20Пример: модуль, содержащий подпрограмму решения уравнения (root)
Что должен содержать модуль?
Какие описания?
функциональный тип – задающий вид уравнения;
функцию определения корня уравнения.
Слайд 21Unit uravnenie;
Interface
Type fn=function(x:real):real;{функциональный тип, задающий
вид уравнения}
function root(f:fn; a,b,e:real):real; {подпрограмма вычисления корня уравнения f(x)=0 на [a,b] c погрешностью е методом деления отрезка пополам}
Implementation
function root(f:fn; a,b,e:real):real;
var x:real;
begin
repeat
x:=(a+b)/2;
if f(x)*f(b)<=0 then
a:=x
else
b:=x
until b-a root:=(a+b)/2;
end;
End.
Слайд 22Подпрограмма решения двух уравнений, использующая модуль
program _2uravnenia;
uses uravnenie;
Var r1,r2:real; {коpни
уpавнений}
function fx1(x:real):real; {fx1 задает первое уравнение}
begin
fx1:=1.0/(1.2*sin(x)/cos(x)+sqrt(x+1))-x;
end;
function fx2(x:real):real; {fx2 задает
второе уравнение}
begin
fx2:=(exp(-x)-sqrt(exp(x))+3.7)/3.0-x;
end;
begin
r1:=root(fx1,0,3,1.0e-4);{fx1 - функция - факт. параметр}
r2:=root(fx2,0,3,1.0e-4);{fx2 - функция - факт. параметр}
writeln('Коpень пеpвого уpавнения r1=',r1:7:4);
writeln('Коpень втоpого уpавнения r2=',r2:7:4);
end.