Скачать презентацию Модули лекция 12 Зачем нужны модули Скачать презентацию Модули лекция 12 Зачем нужны модули

лк4_Модули.ppt

  • Количество слайдов: 22

Модули лекция № 12 Модули лекция № 12

Зачем нужны модули? • Стандартный паскаль: модулей нет. Место подпрограмм – перед разделом действий Зачем нужны модули? • Стандартный паскаль: модулей нет. Место подпрограмм – перед разделом действий программы. Подпрограмма – часть программы. • Единственная возможность использования в программе отдельно подготовленной подпрограммы – вставка в программу текста подпрограммы на алгоритмическом языке => • Невозможна раздельная компиляция подпрограммы и программы => • Невозможно создание библиотеки откомпилированных алгоритмов (объектных модулей). Это основной недостаток стандартного паскаля и всех алгоритмических языков, использующих блочную программу.

Зачем нужны модули? • Для обеспечения возможности компиляции программы по частям. Модули введены в Зачем нужны модули? • Для обеспечения возможности компиляции программы по частям. Модули введены в Турбо Паскаль и поддерживаются в Объектном Паскале.

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

Что такое модуль? • • • Модуль - это автономно компилируемая программная единица. Модуль Что такое модуль? • • • Модуль - это автономно компилируемая программная единица. Модуль может быть подключен к любой паскаль-программе или к другому модулю (программной единице). Модуль включает в себя различные разделы описаний (типов, констант, переменных, процедур и функций). Модуль делится на две основные части: интерфейсную (interface) и исполняемую (implementation). В интерфейсной части даются описания, которые могут использоваться в программной единице, к которой подключен модуль. В исполняемой части приводятся описания, доступные только внутри модуля. Кроме описаний, модуль может содержать некоторые операторы, подготавливающие условия для использования модуля (например, присваивание переменным начальных значений или установление связи между программными и физическими именами файлов). Такие операторы содержатся в части модуля, которая называется инициализирующей. Эта часть не является обязательной. В Объектном Паскале модуль также может иметь завершительную часть (finalization), состоящую из операторов, обеспечивающих грамотное завершение программной единицы, использующей модуль.

При изучении модулей надо освоить: • Правила создания модулей (структуру модуля). • Правила использования При изучении модулей надо освоить: • Правила создания модулей (структуру модуля). • Правила использования модулей.

Структура модуля (ТП, ОП) UNIT имя_модуля; INTERFACE интерфейсная_часть IMPLEMENTATION исполняемая_часть [BEGIN инициирующая_часть] END. от Структура модуля (ТП, ОП) UNIT имя_модуля; INTERFACE интерфейсная_часть IMPLEMENTATION исполняемая_часть [BEGIN инициирующая_часть] END. от подпрограмм – только заголовки подпрограмм могут быть сокращенными

Структура модуля (ОП) UNIT имя_модуля; INTERFACE интерфейсная_часть IMPLEMENTATION исполняемая_часть [INITIALIZATION инициирующая_часть] [FINALIZATION завершающая_часть] END. Структура модуля (ОП) UNIT имя_модуля; INTERFACE интерфейсная_часть IMPLEMENTATION исполняемая_часть [INITIALIZATION инициирующая_часть] [FINALIZATION завершающая_часть] END.

Имя файла, содержащего модуль • Имя_модуля. pas • При компиляции ТП: Имя_модуля. pas => Имя файла, содержащего модуль • Имя_модуля. pas • При компиляции ТП: Имя_модуля. pas => Имя_модуля. tpu ОП: Имя_модуля. pas => Имя_модуля. dcu

Пример: Модуль VECTOR, позволяющий осуществлять некоторые операции над векторами Unit VECTOR; {операции над векторами} Пример: Модуль 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 Ungle. Rad(Var a, b: Ar; N: Integer): Real; {вычисление угла между двумя векторами в радианах} Function Ungle. Gr(Var a, b: Ar; N: Integer): Real; {вычисление угла между двумя векторами в градусах} Procedure Sum(Var a, b, c: Ar; N: Integer); {вычисление суммы двух векторов} Procedure Inp(Var a: Ar; N: Integer); {ввод координат вектора}

Продолжение примера IMPLEMENTATION Function Scpr; Var I: Integer; S: Real; Begin S: =0; For Продолжение примера 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 Ungle. Rad; Var x: Real; Begin x: =Scpr(a, b, N)/Lngth(a, N)/ Lngth(B, N); If x=0 then Ungle. Rad: =pi/2 Else Ungle. Rad: =Arc. Tan(Sqrt(1 x*x)/x); End; Function Ungle. Gr; Begin Ungle. Gr: =Ungle. Rad(a, b, 3)/pi*180; End;

Продолжение примера Procedure Sum; Var i: Integer; Begin For i: =1 to N Do Продолжение примера 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.

Использование модулей • Если программа использует модули, то в ее начале, перед всеми разделами Использование модулей • Если программа использует модули, то в ее начале, перед всеми разделами описаний, должно стоять ключевое слово USES, после которого через запятую перечисляются имена этих модулей. Например: Program ppp; Uses crt, graph; {программа ppp использует модули crt и graph}

Использование модулей • Если модуль использует другие модули, то предложение USES может стоять либо Использование модулей • Если модуль использует другие модули, то предложение USES может стоять либо после слова INTERFACE, либо после слова IMPLEMENTATION. Модули, подключенные в интерфейсной части, доступны в любой точке рассматриваемого модуля; модули, подключенные в исполняемой части, доступны в любом месте модуля, за исключением интерфейсной части. Примеры использования модулем других модулей будут рассмотрены позже.

Пример: программа, использующая модуль VECTOR Program Primunit; {Даны два вектора а и b в Пример: программа, использующая модуль 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. 0 e-6 then Writeln('вектор c ортогонален плоскости XOY') Else

Продолжение примера Begin Write(' Угол между вектором с и плоскостью XOY: ', Ungle. Gr(c, Продолжение примера Begin Write(' Угол между вектором с и плоскостью XOY: ', Ungle. Gr(c, cpr, 3): 6: 1); Writeln(' градусов'); End; Readln; End.

Подключение модулей в Турбо Паскале • Чтобы файлы с расширением. TPU были доступны среде Подключение модулей в Турбо Паскале • Чтобы файлы с расширением. TPU были доступны среде Turbo (Borland) Pascal, их следует поместить в текущий каталог или указать их содержащий каталог в диалоговом окне опции OPTIONS/DIRECTORIES/UNIT DIRECTORIES.

Подключение модулей в Delphi • Uses имя_модуля in имя директории • Добавление модуля в Подключение модулей в Delphi • Uses имя_модуля in имя директории • Добавление модуля в проект в Испекторе проектов.

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

Пример: модуль, содержащий подпрограмму решения уравнения (root) • Что должен содержать модуль? Какие описания? Пример: модуль, содержащий подпрограмму решения уравнения (root) • Что должен содержать модуль? Какие описания? üфункциональный тип – задающий вид уравнения; üфункцию определения корня уравнения.

Unit uravnenie; Interface Type fn=function(x: real): real; {функциональный тип, задающий вид уравнения} function root(f: Unit 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

Подпрограмма решения двух уравнений, использующая модуль program _2 uravnenia; uses uravnenie; Var r 1, Подпрограмма решения двух уравнений, использующая модуль program _2 uravnenia; uses uravnenie; Var r 1, r 2: real; {коpни уpавнений} function fx 1(x: real): real; {fx 1 задает первое уравнение} begin fx 1: =1. 0/(1. 2*sin(x)/cos(x)+sqrt(x+1))-x; end; function fx 2(x: real): real; {fx 2 задает второе уравнение} begin fx 2: =(exp(-x)-sqrt(exp(x))+3. 7)/3. 0 -x; end; begin r 1: =root(fx 1, 0, 3, 1. 0 e-4); {fx 1 - функция - факт. параметр} r 2: =root(fx 2, 0, 3, 1. 0 e-4); {fx 2 - функция - факт. параметр} writeln('Коpень пеpвого уpавнения r 1=', r 1: 7: 4); writeln('Коpень втоpого уpавнения r 2=', r 2: 7: 4); end.