- •1. Подпрограммы
- •1.1. Описание подпрограмм
- •1.2. Обращение к подпрограммам
- •1.3. Виды параметров подпрограмм
- •1.3.1. Параметры-значения и параметры-переменные
- •1.3.2. Параметры процедурного типа
- •1.3.3. Параметры-константы
- •1.3.4. Нетипизированные параметры подпрограмм
- •1.4. Рекурсивные подпрограммы
- •1.3.5. Массивы и строки открытого типа
- •2. Файлы данных
- •2.1. Текстовые файлы
- •2.2. Типизированные файлы
- •2.3. Нетипизированные файлы
- •2.4. Обработка ошибок, возникающих в действиях с файлами
- •3. Указатели - ссылочные типы данных
- •4. Модули
- •5. Локальные и глобальные сети эвм
- •6. Базы данных
- •6.1. Модели организации данных
- •6.2. Нормализация данных
- •6.3. Типы связей между объектами
- •7. Основы компьютерной безопасности
- •7.1. Компьютерные вирусы
- •7.2. Защита информации в Интернете
- •Контрольные работы
- •Тема 1. Параметры-значения и параметры-переменные
- •Пример выполнения задания
- •Решение. Составляем алгоритм (изображен ниже), а затем программу.
- •Варианты задания
- •Тема 2. Процедурный тип Пример выполнения задания
- •Варианты задания
- •Тема 3. Рекурсия Пример выполнения задания
- •Варианты задания
- •Тема 4. Текстовые и типизированные файлы Пример выполнения задания
- •Варианты задания
- •Тема 5. Указатели Пример выполнения задания
- •Варианты задания
- •Тема 6. Модули Пример выполнения задания
- •Варианты задания
- •Библиографический список
- •Оглавление
- •1.1. Описание подпрограмм ……………………………………………… 1
4. Модули
Модули позволяют реализовывать сколь угодно сложные программы. С появлением модулей стало возможным преодоление кодом Pascal-программы предела в 64 K, т.к. каждый модуль может быть такого же размера, что и программа. Модули служат также целям создания библиотек подпрограмм для решения задач в конкретной предметной области. Наконец, модули обеспечивают информационную закрытость, смысл которой будет понятен из примера, рассмотренного ниже. А пока изложим основные правила создания модулей.
Модуль можно рассматривать как отдельно хранимую, независимо компилируемую, но не выполняемую программу. Он содержит объекты, которые используют другие программы (модули). В отличие от обычной программы, модуль имеет обязательный заголовок следующего вида:
Unit <Имя модуля>;
Открывает модуль служебным словом interface интерфейсная секция, в которой описываются все объекты, ‘видимые’ из любой программы (модуля) и, следовательно, доступные для использования. Таким образом могут быть представлены типы, константы, переменные, заголовки подпрограмм. Если для описания этих объектов требуются компоненты из других модулей, то их имена должны быть перечислены сразу после слова interface в списке следующим образом:
uses <Имя1>, <Имя2>, <Имя3>;.
В интерфейсных частях модулей не следует допускать циклических обращений модулей друг к другу, т.к. компилятор не может установить связей.
Затем идет секция реализации модуля, которая начинается служебным словом implementation и содержит описания подпрограмм, объявленных в интерфейсной части, а также локальные объекты модуля. При описании подпрограмм можно использовать их сокращенные заголовки. Если в данной секции используются объекты из других модулей, то сразу после слова implementation необходимо перечислить имена соответствующих модулей в конструкции
uses <Имя1>, <Имя2>, <Имя3>;.
В этом списке не следует повторять имен модулей, аналогично указанных в интерфейсной части. В секциях реализации допустимо циклическое обращение модулей друг к другу, т.к. за взаимодействие отвечает интерфейсная секция.
Завершает модуль секция инициализации. Она содержит подготовительные действия, которые будут выполняться однократно при запуске программы (например, инициализация переменной, связывание имени файловой переменной с файлом на диске и т.п.). Начинается секция словом begin, которое не пишется, если секция отсутствует. А вот слова interface и implementation опускать нельзя, даже если соответствующие секции ничего не содержат. Завершает модуль end. (с точкой, как и программу).
Файл, в котором будет храниться текст модуля, должен иметь такое же имя, что и модуль в своем заголовке. Результатом трансляции модуля является одноименный файл на диске с расширением имени .tpu (Turbo Pascal Unit). TPU-файлы будут размещаться в каталоге, имя которого можно задать в секции среды Options командой Directories (каталоги). В появившемся окне диалога нужный каталог задают в стоке EXE & TPU Directory (текущий каталог, если ничего не задано). Можно выполнять компиляцию каждого модуля отдельно или из окна с основной программой командой Compile/Make (F9).
Чтобы использовать в программе объекты, представленные в интерфейсных частях модулей, необходимо записать в ней сразу после заголовка
Uses <Список имен модулей>;.
Покажем на примере, как составляется текст модулей и как их используют. Оговоримся, что пример носит иллюстративный характер, решение этой конкретной задачи без модулей гораздо проще. Итак, поменяем местами наибольший и наименьший элементы вектора.
Ниже приводится программа. Из ее текста не понятны действия, реализованные по отношению к вектору a, к тому же неизвестны его компоненты и их число.
program Zamena;
uses mod1, mod2; {Модули, используемые в пpогpамме}
var
i : byte;
begin
writeln('Исходный вектор:');
for i := 1 to n do
write(a[i] : 4);
writeln;
Change(a); {Подпрограмма из mod1}
writeln('Результат перестановки наименьшего и наибольшего элементов');
for i := 1 to n do
write(a[i] : 4);
writeln
end.
Далее приводятся алгоритмы действий, реализованных в основной программе, а также в подпрограммах, представленных в модулях. Количество модулей выбрано с учетом организации различных вариантов связи модулей.
Процедура Change
да
нет
нет
да
Процедура
Obmen
Ниже представлены модули, участвующие в решении задачи.
unit mod1; {Модуль с основной подпpогpаммой}
interface
uses mod2; {В модуле mod2 описан тип mas}
procedure Change(var a : mas); {Заголовок подпрограммы}
implementation
uses mod3; {В модуле mod3 подпрограмма Obmen}
var {локальные переменные модуля, их можно}
max, min, k : byte; {сделать локальными для подпрограммы Change}
procedure Change; {Сокращенный заголовок}
begin
max := 1; min := 1;
for k := 2 to n do begin
if a[k] > a[max] then max := k;
if a[k] < a[min] then min := k
end;
obmen(a[max], a[min])
end; { ; обязательна, т.к. нет секции инициализации}
end. {mod1}
unit mod2; {Модуль с параметрами}
interface
const
n = 10;
type
mas = array[1..n] of byte;
const {Исходный вектор}
a : mas = (23, 1, 33, 57, 49, 17, 88, 121, 0, 13);
implementation {Секция отсутствует}
end. {mod2}
unit mod3;
interface
procedure Obmen(var x, y : byte);
implementation
procedure Obmen;
var
pp : byte;
begin pp := x; x := y; y := pp end;
end. {mod3}
В заключение подчеркнем еще раз, что модули существуют для программ, но не наоборот. Например, нельзя константу n, задающую размер вектора, объявить в программе, а затем использовать ее в модуле для описания типа. Интерфейсные части модулей становится фактическим продолжением разделов описания объектов программы, когда в ней присутствует строка uses <Список имен модулей> .
Turbo Pascal поставляется с десятью стандартными модулями. Кратко охарактеризуем их. Базовые средства языка содержит модуль System. Его объекты подключаются автоматически (не требуется писать uses system). Остальные модули должны быть описаны в операторе uses. Для работы с консолью применяют средства модуля Crt. При этом можно задавать различные режимы вывода текста на экран. Функция Readkey модуля возвращает значение нажатой на клавиатуре клавиши, а функция Keypressed – значение true, если на клавиатуре была нажата любая буквенно-цифровая клавиша, клавиши <Esc>, <Enter> и некоторые другие. Модуль Dos позволяет работать с операционной системой MS DOS. Эти три модуля, а также практически не используемые модули Printer и Overlay находятся в файле turbo.tpl (Turbo Pascal Library). Для реализации действий в графическом режиме работы видеоадаптера используют графическую библиотеку модуля Graph. Модули Strings и WinDos содержат средства для работы с ASCIIZ-строками (строки, завершающиеся символом с номером 0 таблицы - NUL).
