Fruitsekta.ru

Мир ПК
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Модуль на языке паскаль

Модули в Паскале

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

Структура модуля

Модуль имеет следующую структуру:
UNIT
INTERFACE

IMPLEMENTATION

BEGIN

END.

Заголовок модуля состоит из зарезервированного слова Unit(модуль) и имени модуля.

Имя модуля выбирается по общим правилам и должно совпадать с именем дискового файла содержащего исходный текст модуля.
Расширение в имени модуля (.pas ) не указывается оно задается по умолчанию.

Имя модуля используется для его связи с основной программой с помощью предложения Uses.
Предложение Usesм.б. помещено после заголовка модуля или за словами

Interfaceи Implementation.

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

Раздел реализации – начинается с ключевого словаImplementation(выполнение) и содержит описание локальных для модуля объектов т. е. меток, констант, типов, переменных которые не доступны основной программе и другим модулям (т. е. не видимые из вне) и полное описание процедур и функций. При этом в заголовке подпрограмм список формальных параметров м.б. опущен, но если он приводится то должен точно соответствовать описанию в интерфейсной части.

Раздел инициализации – заключается в словесные скобки BEGIN END.
и содержит операторы, которые будут выполнены до передачи управления основной программе. Это м.б. операторы инициализации данных (переменных) Например операторы присваивания, ввода а также процедуры связывания и открытия файлов. Раздел операторов м.б. пустымBEGIN END или отсутствовать простоEND.
В конце модуля ставится точка.

Компиляция и использование модулей

Оперативная память система имеет сегментную структуру (один сегмент равен 64К =65535 байт). Код программы м.б. не более одного сегмента, объем данных не может превышать один сегмент (если не использовать динамическую память) и для стека один сегмент. Размер стека задается директивой <$M<>>. Минимальный размер стека 1К максимальный один сегмент по умолчанию 16К. Значения локальных переменных при обращении к подпрограмме помещаются в стек, а при выходе извлекаются из стека.
Код модуля помещается в отдельный сегмент, т.к. он транслируется автономно от основной программы, а количество модулей используемых программой зависит только от доступной ОП. Это позволяет создавать большие программы.
Компилятор создает код модуля с тем же именем, но с расширением tpu(turbo pascal unit).
Для использования модуля основной программой или другими модулями его имя (без расширения) помещается в списке предложенияUses
Если модуль является компактным и часто м.б. использован прикладными программами, то его можно поместить в библиотеку стандартных модулейTURBO.TPL (Turbo-Pasacal-library) с помощью утилитыTPUMOVER.
Но это необходимо делать только в случае крайней необходимости т.к. библиотека загружается в ОП и уменьшает место для программы.
При компиляции файла с исходным текстом модуля появляется одноименный файл с расширением tpu и помещается в каталоге указанном опцией

OPTIONS/DIRECTORIES/UNIT DIRECTORIES

или в текущем каталоге при отсутствии этой опции.
При компиляции основной программы используемые модули д.б. в каталоге указанном опцией
OPTIONS/DIRECTORIES/EXE & TPU DIRECTORIES

либо в текущем каталоге при отсутствии этой опции
Для получения EXE файла задачи в опции

COMPILE/DESTINATION/DISK(MEMORI)
установить DISK.
Существует три режима компиляции модулей:
— COMPILE
— BUILD
— MAKE

Режимы устанавливаются меню COMPILE

1. Режим COMPILE (вызывается Alt-F9) . При этом компилируется программа а используемые модули д.б. предварительно откомпилированы и храниться в соответствующих каталогах.
2. Режим BUILD (вызывается F9) . При этом игнорируются ранее откомпилированные модули, а ищутся модули с расширением pas и перекомпилируются.
3. Режим MAKE (вызываетсяF9) . При этом перекомпилируется только модули, которые имели изменения в тексте.

Пример 16.1.

В файле inp.txt расположены три массива вещественных чисел

-2.1 3.1 -2.4 5.6 5.4 -6.7 3.5 -3.6
2.3 -4.3 2.1 2.5 -3.7 -5.6 4.6 3.5 -7.5
-2.1 4.3 -2.3 7.6 4.5 -8.9 5.7 -4.5 6.8 -5.8

где Max_a, Max_b, Max_c, Sa, Sb, Sc, ka, kb, kc — максимальный элемент, сумма и количество положительных элементов соответствующих массивов a, b, и c.
Результат вывести в файл out.txt и на экран.

Читать еще:  Гост требования безопасности к производственному оборудованию

Текст модуля

Unit UNMAS;
Interface
Const n=10;
Type vec=array[1..n] of real;
Var z :vec;
i :integer;
f1,f2 :text;
Procedure Vv(s:char; num:byte;Var z:vec);
Procedure SK1(z:vec; num:byte; Var s:real; Var k:byte);
Function MAX(z:vec; num:byte):real;

Implementation
Procedure Vv(s:char; num:byte;Var z:vec);
Begin
Writeln(‘Mассив ‘,s);
For i:=1 to num do
Begin
Read(f1,z[i]); Write(z[i]:4:1,’ ‘:3);
End;
Readln(f1); Writeln;
End;

Procedure SK1(z:vec;num:byte; Var s:real; Var k:byte);
Begin
s:=0; k:=0;
for i:=1 to num do if z[i]>0 then
Begin
s:=s+z[i];
k:=k+1
End;
End;
Function MAX(z:vec;num:byte):real;
Var m :real;
Begin
m:=z[1];
for i:=1 to num do if z[i]>m then m:=z[i];
MAX:=m
End;

Begin
Assign(f1,’inp.txt’); Reset(f1);
Assign(f2,’out.txt’); Rewrite(f2)
End.

Текст программы

Program lr7_16;
Uses CRT,UNMAS;
Var
a,b,c :vec;
y,sa,sb,sc :real;
ka,kb,kc :byte;
Begin
clrscr;
Vv(‘a’,8,a);
Vv(‘b’,9,b);
Vv(‘c’,n,c);
SK1(a,8,sa,ka);
SK1(b,9,sb,kb);
SK1(c,n,sc,kc);
y:=(MAX(a,8)+MAX(b,9)+MAX(c,n))+(sa+sb+sc+ka+kb+kc);
Writeln(‘Результат:’:20);
Write (‘Массив а : ‘);
Writeln(‘sa=’,sa:5:1,’ ka=’,ka);
Write (‘Массив b: ‘);
Writeln(‘sb=’,sb:5:1,’ kb=’,kb);
Write (‘Массив c: ‘);
Writeln(‘sc=’,sc:5:1,’ kc=’,kc);
Writeln(‘ ‘:10,’y=’,y:10);
Readln;
Writeln(f2,’ђҐ§г«мв в:’);
Writeln(f2,’ ‘:10,’y=’,y:10);
Close(f1);
Close(f2)
End.

Результаты работы программы

Mассив a
-2.1 3.1 -2.4 5.6 5.4 -6.7 3.5 -3.6
Mассив b
2.3 -4.3 2.1 2.5 -3.7 -5.6 4.6 3.5 -7.5
Mассив c
-2.1 4.3 -2.3 7.6 4.5 -8.9 5.7 -4.5 6.8 -5.8
Результат:
Массив а : sa= 17.6 ka=4
Массив b: sb= 15.0 kb=5
Массив c: sc= 28.9 kc=5
y= 9.330E+01

Вернуться в оглавление:Алгоритмические языки

Подключаемые модули

1. Основные положения

Подключаемый модуль – файл, содержащий исходный текст на языке Pascal, имеющий определенную структуру, предназначенный для использования как в главной программе, так и в других подключаемых модулях.
Использование заключается в подключении модуля в разделе uses, путем указания его имени.

2. Общая структура подключаемого модуля

Структурно в подключаемом модуле можно выделить три раздела:
1) Интерфейсный раздел – interface (должен быть объявлен, может быть пустым)
2) Раздел реализаций – implementation (должен быть объявлен, может быть пустым)
3) Тело модуля – begin-end. (может отсутствовать)

Интерфейсный раздел – область подключаемого модуля, начинающаяся с ключевого слова interface и заканчивающаяся ключевым словом implementation, которая может содержать:
— список подключаемых модулей;
— константы;
— пользовательские типы данных;
— переменные;
— прототипы процедур и функций,
доступные из места подключения данного модуля.

Замечание 1: переменные, объявленные в разделе интерфейсов, являются глобальными. То есть существуют в любом месте программы, где подключен данный модуль, в том числе в разделе реализации самого модуля.
Замечание 2: как и в программе, вышеперечисленные секции (объявления констант, переменных и др., за исключением секции uses) в данном разделе могут быть расположены в любой последовательности и в любом количестве.
Замечание 3: если в данном разделе объявляются прототипы процедур/функций, то их реализации должны гарантированно присутствовать в разделе implementation.

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

Пример интерфейсного раздела:

Pascal

Раздел реализаций – область подключаемого модуля, начинающаяся с ключевого слова implementation и заканчивающаяся телом модуля (если таковое имеется) или ключевым словом end с точкой, означающим конец модуля, в которой располагаются реализации процедур и функций, объявленных в интерфейсном разделе, которая может содержать:
— список подключаемых модулей;
— константы;
— пользовательские типы данных;
— переменные;
— процедуры и функции,
необходимые для реализации процедур/функций, объявленных в интерфейсном разделе.

Основное назначение: реализация процедур и функций, описанных в секции interface.

Замечание 1: при реализации процедур и функций, описанных в интерфейсной секции, их заголовки могут быть описаны в сокращенной форме. Исключение — PascalABC: при использовании переменных заголовка в тексте реализации возникает ошибка компиляции.

Пример 1 (заголовки в сокращенной форме):

Pascal
Pascal

Тело модуля – последняя область подключаемого модуля, образуемая парой ключевых слов: «begin» и «end.», в которой можно размещать программный код аналогично главной программе.
Тело модуля может отсутствовать. В таком случае ключевое слово «begin» не пишется, а «end.» сигнализирует о конце модуля.

Основное назначение: инициализация переменных модуля, выделение ресурсов, необходимых для его работы и т.д.

Пример модуля, содержащего тело:

Pascal

Пример модуля без тела: (см. пример модуля для заголовков в полной форме).

Замечание 1: Программный код, размещенный в теле модуля, выполняется один раз – при загрузке модуля, до начала исполнения кода главной программы.

Замечание 2: В случае, когда в секции uses подключено несколько модулей, имеющих разделы инициализации, выполнение кода этих разделов идет в порядке подключения модулей.

2.4. Дополнительные разделы в структуре модуля.

Компиляторы Free Pascal, Pascal ABC, Pascal ABC.Net допускают помимо перечисленных выше еще два раздела:
— раздел инициализации
— раздел финализации.

2.4.1. Раздел инициализации.

Раздел инициализации – область подключаемого модуля, размещаемая после по окончании раздела реализаций, начинающаяся с ключевого слова initialization и заканчивающаяся разделом финализации, если таковой имеется, или ключевым словом end с точкой. Назначение аналогично телу модуля.

2.4.2. Раздел финализации.

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

Основное назначение: освобождение ресурсов, выделенных для работы модуля.

Pascal

Замечание 1: программный код, размещаемый в перечисленных разделах, исполняется один раз. Код разделов инициализации – до начала исполнения кода главной программы, код разделов финализации – после.

Замечание 2: при наличии в модуле любого из данных двух разделов, наличие тела модуля более не допускается.

3. Компиляция модулей.

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

3.1. Компиляция в Turbo Pascal.

Результатом компиляции подключаемого модуля в Turbo Pascal-е является *.tpu – файл (Turbo Pascal Compiled Unit), представляющий собой машинное представление данных и кода, размещенных в нем.

3.2. Компиляция в Free Pascal.

Результатом компиляции подключаемого модуля в Free Pascal-е являются два файла: *.ppu – файл, содержащий интерфейсную часть модуля, и файл *.o — объектный файл, содержащий часть реализаций. Причем последний необходим для компоновки приложения.

3.3. Компиляция в Pascal ABC.Net.

В отличие от перечисленных выше сред в Pascal ABC.Net в процессе компиляции модуля не генерируется код на машинном языке. Компилятор данной среды завершает свою работу после выполнения семантического анализа, сохраняя семантическое дерево модуля в промежуточный формат — *.pcu – файл, который в первом приближении можно считать результатом компиляции с обозначенными ограничениями.

3.4. Ускорение компиляции программ.

На этапе компоновки приложения, компоновщик собирает исполняемый модуль, принимая на вход объектные модули. Таким образом, имея уже откомпилированные подключаемые модули, компиляция программ с их использованием ускоряется, так как они уже обработаны. Данное справедливо для Turbo и Free Pascal-ей. Однако, в Pascal ABC.Net ускорение компиляции достигается только за счет того, что отсутствует необходимость проводить синтаксический и семантический анализ.

Вывод: откомпилированные версии исполняемых модулей не совместимы между различными компиляторами.

Модуль FormsABC: создание простого интерфейса

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

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

Создадим каркас приложения:

После запуска мы увидим на экране главную форму с заданным размером и заголовком, центрированную относительно экрана.

Добавим на форму компоненты, отвечающие за параметры a,b,N и выбор функции ([a,b] — отрезок интегрирования, N — количество отрезков разбиения):

После запуска мы увидим следующее окно:

Здесь f1 := new FlowBreak и аналогичные добавляют переход на новую строку при вставке следующего компонента, f5 := new FlowBreak(50) пропускает дополнительно 50 пикселей по вертикали, s1 := new Space(20) пропускает 20 пикселей по горизонтали.

Обратим внимание, что на самом деле компоненты вставляются не на саму форму, а на панель MainPanel, которая лежит поверх формы и обеспечивает последовательное добавление компонентов.

Теперь разместим справа на форме компонент TextBox, на который будем выводить результаты. Для этого необходимо знать, что MainPanel выровнена на форме так, что заполняет всё пространство формы. Изменим выравнивание MainPanel на выравнивание по левому краю формы и ширину MainPanel:

После этого добавим на форму компонент TextBox. Обратим внимание, что TextBox должен размещаться именно на форме, а не на MainPanel. Для этого изменим вначале переменную ParentControl на значение MainForm, что означает, что все следующие компоненты будут размещаться на главной форме:

Выравнивание нашего TextBox, наоборот, изменим так, чтобы он занимал оставшееся от MainPanel пространство формы:

В итоге получим приложение:

Запустив его, увидим окончательное размещение компонентов:

Инициализируем свойства компонентов начальными значениями переменных (a=0, b=1, N=10), а также заполним выпадающий список cb выражениями функций, от которых будем далее вычислять опеределнный интеграл :

В начале программы разместим описание необходимых типов, переменных и код, вычисляющий определенный интеграл:

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

Наконец, самое главное: создадим обработчик кнопки ok и присвоим его событию нажатия на кнопку ok.Click:

В обработчике MyClick происходит основная работа: из массива funs выбирается нужная функция, вычисляется интеграл (исходные значения параметров берутся из свойств компонент), после чего в TextBox выводится строка результата.

В заключение перенесем инициализацию компонент в процедуру InitControls.

Ниже приводится полный код приложения:

Запустив его, будем менять параметры вычислений и, нажимая на кнопку «Вычислить», отображать результаты в окне TextBox:

Пользовательские модули в Паскале

Модули в Паскале по отношению к основной части программы напоминают подпрограммы (процедуры и функции). Но по определению они являются самостоятельными программами, ресурсы которых могут быть задействованы в других программах. Кроме того описание модулей происходит вне вызывающего приложения, а в отдельном файле, поэтому модуль – это отдельно компилируемая программа. Файл скомпилированного модуля (именно такой нужен для использования) будет иметь расширение предусмотренное средой программирования (например, .tpu, .ppu, .pcu).

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

Структура модуля выглядит так:

Далее мы поочередно рассмотрим каждый из данных разделов.

Имя модуля (Unit)

Имя модуля, следующее после ключевого слова Unit, должно совпадать с названием файла (без .pas), в котором находиться его код. Также с помощью имени, модуль подключается к другому модулю, либо к основной программе. Для этого необходимо указать служебное слово Uses, и перечислить через запятую список подключаемых модулей:

Интерфейсная часть (Interface)

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

Для объявления данного модуля, в программе нужно указать его имя:

После чего станет возможным использование всех описанных в интерфейсной части объектов.

Исполняемая часть (Implementation)

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

Инициирующая часть

Инициирующая часть начинает свою работу до начала выполнения основной программы. В ней (между Begin и End), как правило, описываются операторы, предназначенные для разного рода вспомогательной работы. Данная часть может отсутствовать, либо не иметь в себе никакого кода. В первом случае нужно указать End с точкой, во втором – оставить пустое место внутри Begin и End.

Компиляция модулей

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

Turbo Pascal

Итогом компиляции модуля в Turbo Pascal, будет файл с расширением .tpu (Turbo Pascal Unit), хранящий его код.

Free Pascal

После компиляции модуля в среде Free Pascal, создаются два файла с разными разрешениями: .ppu и .o. Первый содержит интерфейсную часть модуля, а второй (необходим для компоновки программы) – часть реализаций.

Pascal ABC.NET

Pascal ABC.Net во время компиляции модуля не генерирует код на машинном языке. В случае, если компиляция выполнена успешна код сохраняется в файле с разрешением .pcu.

Для сред программирования Turbo Pascal и Free Pascal предусмотрены три режима компиляции: Compile, Make и Build. В режиме Compile все используемые в программе модули должны быть заранее скомпилированы. Приложение в режим Make-компиляции проверяет все подключенные модули на наличие файлов с соответствующим для среды программирования разрешением (.tpu или .o). Если какой-то из них не найден, то происходит поиск файла с названием ненайденного модуля и расширением .pas. Самый надежный из режимов – Build. Поиск и компиляция файлов (с расширением .pas) в данном режиме происходит даже тогда, когда модульные файлы уже имеются.

Пример

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

Весь этот код должен находиться в отдельном файле. Теперь напишем основную программу, в которую подключим наш модуль Search.

После компиляции файлов данное приложение должно исправно работать. Конечно, если вы, отвечая на вопрос “Этот массив упорядочен?” укажите программе ложную информацию, то и она может ответить тем же.

Ссылка на основную публикацию
Adblock
detector
Pascal