Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Praktikum_po_programmirovaniyu.doc
Скачиваний:
23
Добавлен:
09.12.2018
Размер:
2.5 Mб
Скачать

6.1. Структура модулей

Модули – это независимо разрабатываемые и хранимые, независимо компилируемые и тестируемые программные единицы со строго определенным интерфейсом, которые могут объединяться в различных сочетаниях.

Развитие модульного программирования было обусловлено возрастающими объемами программ, их увеличивающейся внутренней сложностью и коллективным характером разработок. Программный код модулей компилятор помещает в отдельные сегменты памяти. Объем каждого сегмента не превышает 64 кбайт, а общий объем памяти, отводимой под все сегменты, определяется лишь допустимой памятью.

Использование модулей позволяет обеспечить:

- независимость разработки и тестирования;

95

- независимость хранения;

- ослабление ограничений на суммарный объем программы.

Модули так же, как и подпрограммы бывают стандартными и модулями, разрабатываемыми самим пользователем.

Примеры стандартных модулей: System, Crt, Graph.

Каждый модуль хранится в отдельном файле, причем имя модуля должно совпадать с именем файла. Модуль подсоединяется к программе с помощью предложения uses (например, uses Crt), которое помещается сразу за заголовком программы. Модули имеют следующую структуру.

Unit <имя модуля> {заголовок модуля}

Interface {интерфейсная часть}

Implementation {секция реализации}

Begin

{секция инициализации}

end.

Все секции модуля, кроме первой, могут быть пустыми.

Имя модуля задается разработчиком модуля и должно совпадать с именем файла, содержащего этот модуль.

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

96

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

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

Рассмотрим механизм разработки модуля на примере модуля для расчета определенного интеграла по методу Симпсона.

Формула Симпсона имеет вид:

- количество точек на интервале интегрирования (); ; .

97

Допустим, что модуль будет выполнять одну функцию: вычислять интеграл по методу Симпсона.

Для вычисления интеграла достаточно знать: вид подынтегральной функции, пределы интегрирования и количество точек на интервале интегрирования.

Все эти данные должны быть переданы в модуль из вызывающей программы. Особый интерес представляет передача в модуль подынтегральной функции. Для этого необходимо использовать новый тип переменных: процедурный тип. К процедурным типам относят параметры-процедуры и параметры-функции. Назначение этих типов – обеспечить возможность передачи процедур и функций в качестве фактических параметров в модули. В Паскале реализованы две модели вызова: ближняя (hear) и дальняя (far). В режиме hear вызов процедуры или функции возможен в пределах 64 Кбайтов, то есть, в пределах одного сегмента кода. В режиме far возможен вызов процедуры или функции из любого сегмента. Ближняя модель вызова экономит один байт и несколько микросекунд при каждом вызове, поэтому стандартный режим компиляции предусматривает использование только этой модели. Однако при передаче процедурных параметров (то есть, процедур и функций) соответствующие подпрограммы должны компилироваться в режиме дальней модели вызова.

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

Unit simpson; {имя модуля}

Interface

{Создаем процедурный тип}

type fun = function(x: real): real;

{Определяем тип глобальных переменных}

98

var a1,a2: real; {Интервал интегрирования}

m: integer; {Количество точек разбиения}

{ Заголовок процедуры, доступной}

{вызывающей программе}

Procedure Integral(a1,a2: real; m: integer; g: fun; var s: real);

Implementation

{Код процедуры, описанной в интерфейсной части}

Procedure Integral;

var i: integer; h:real;

begin

h:=(a2-a1)/m;

s:=h/3*(g(a1)+g(a2));

for i:=1 to m-1 do

begin

if i mod 2 = 0 then s: = s+2*h/3*g(a1+i*h)

else

s: = s+4*h/3*g(a1+i*h);

end;

end;

end.

В данном модуле секция инициализации отсутствует.

Приступаем к разработке программы, использующей этот модуль для вычисления определенного интеграла по методу Симпсона от функции f(x) в пределах от a до b.

Program rash;

{Подсоединяем модуль simpson к программе}

uses simpson;

var a,b,d:real;

{Описание подынтегральной функции}

{Поскольку эта функция должна передаваться}

{в модуль, для нее задается режим дальней}

{модели вызова far}

function func(x:real):real; far;

99

begin

func:=x*x;

end;

begin

writeln(‘Введите пределы интегрирования');

readln(a,b);

writeln(‘Введите кол-во точек разбиения n’);

writeln(‘n должно быть четным числом’);

readln(n);

Integral(a,b,n,func,d);

Writeln(‘Результат = ‘, d);

end.