Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСНОВЫ АЛГОРИТМИЗАЦИИ.doc
Скачиваний:
188
Добавлен:
16.03.2015
Размер:
1.82 Mб
Скачать

Вопросы для самопроверки

  1. Дайте определение рекурсии?

  2. Какие существуют формы рекурсивных процедур?

  3. Что означает косвенный рекурсивный вызов подпрограмм?

  4. В чём заключается назначение опережающего описания рекурсивной подпрограммы?

9. Модули

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

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

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

Модуль можно разделить на несколько разделов:

  • Заголовок;

  • Интерфейсная часть;

  • Реализационная часть;

  • Инициализационная часть.

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

Заголовок модуля

UNITИмя модуля

{$N+} Глобальные директивы компилятора

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

INTERFACEНачало раздела объявлений

USESИспользуемые при объявлении модули

Подразделы объявления доступных глобальных соответственно

LABELметок

CONSTконстант

TYPEтипов и

VARпеременных

Заголовки доступных соответственно

PROCEDUREпроцедур и

FUNCTIONфункций

Реализационнаячасть

IMPLEMENTATIONНачало раздела реализации

USESИспользуемые при реализации модули

Подразделы объявления скрытых глобальных соответственно

LABELметок

CONSTконстант

TYPEтипов

VARпеременных

Тела доступных и скрытых соответственно

PROCEDUREпроцедур и

FUNCTIONфункций

Инициализационнаячасть

BEGIN

Основной блок модуля

END.

Заголовок модуля аналогичен заголовку программы: в модуле вместо зарезервированного слова PROGRAM используется слово UNIT.

Здесь могут присутствовать директивы компилятору, дающие общие установки и соглашения для всего модуля.

Например,

{$S+} - директива компилятору: включить (отключить) контроль возможного переполнения стека;

{$N+} - директива компилятору: использовать числовой процессор (реализовать операции с плавающей точкой программно), применяют для переменных типа real;

{$E+} - директива компилятору: включить (отключить) режим программной эмуляции сопроцессора, применяют для переменных типа extended – вещественное число повышенной точности (10 байт).

При написании модуля необходимо придерживаться следующих основных правил:

  • Имя модуля, как и имя программы не должно совпадать с именами объектов (процедур, функций и т. д.) внутри модуля (программы).

  • Имя модуля должно совпадать с именем файла, в котором он будет храниться. Отсюда, имя модуля не может состоять более чем из 8 символов.

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

Примечание. В рамках приложение Турбо Паскаль 7.0 поставляются стандартные модули System, Strings, Crt, Printer, Dos, WinDos, Graph, Overlay, Graph3 и Turbo3.

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

Следом за оператором USES описываются доступные извне и необходимые для описания процедур и функций определения типов данных, констант и переменных.

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

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

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

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

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

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

Чтобы окончательно оформить эту программу как модуль, необходимо сохранить объектный модуль данной программы на диске. Для опции Compile / Destination установить значение Disk и выполнить компиляцию с помощью комбинации клавиш [Ctrl + F9].

ТП7.0 распознаёт в начале текста модуля оператор модуля UNIT и автоматически создаст файл с расширением *.TPU вместо *.EXE (как для обычных программ). Выдаваемое при этом сообщение Can not run a unit!” просто информирует Вас о том, что модуль самостоятельно не выполняется.

В опции Options / Directories установить значение параметра Include Directory равным пути, где расположен, подключаемый к основной программе, файл с расширением *.TPU (Turbo Pascal Unit), то есть модуль.

Задача 9.1. Вычислить значение функции F(x) по формуле

.

Нахождение корня n-ой степени осуществить через подпрограмму - функцию, а расчёт значения по формуле – через подпрограмму - процедуру. Подпрограммы поместить в модуль.

Листинг модуля Second

Unit second; {Имя модуля}

{second.pas}

interface {Начало раздела объявлений}

Function FunSqrt (x1 : real; k : integer) : real; {Вычисление корня числа}

Procedure ProcY (var y1 : real; x1 : real); {Расчёт значения по формуле}

Implementation {Начало раздела реализации}

Uses Crt;

Function FunSqrt; {Тело функции}

begin

FunSqrt := exp((1/k) * ln(x1));

end;

Procedure ProcY; {Тело процедуры}

Const b = 10.7;

c = 0.4;

var a : real;

begin

a := exp(0.1*x1) + x1;

y1 := ln(FunSqrt(a,2)) / (x1 + FunSqrt(b,3) + arctan(x1)) + c;

end;

end.

Листинг основной программы

program Task;

Uses crt,

second;{Подключение модуля, в котором хранятся функция вычисления корня и процедура вычисления значения по формуле}

Var x, y : real; {Глобальные переменные}

s : char;

begin

ClrScr;

Repeat

TextColor(12); {Розовый цвет текста}

Writeln('Введите значение переменной Х:');

Readln (x);

ProcY (y,x); {Вычисляется значение по формуле}

TextColor(9); {Синий цвет текста}

Writeln('Значение переменной Y равно :', '':2, y:10:6);

TextColor(14); {Жёлтый цвет текста}

Writeln('Продолжить (Y/N) ?');

Readln (s);

Until (s = 'N') or (s = 'n');

end.

Примечание. Так как заголовки функции Funsort и процедуры Procy в модуле были описаны в интерфейсной части, то это позволит пользователю использовать эти подпрограммы в любой другой внешней программе, подключив соответствующий модуль. Учитывая условия задачи, где требовалось во внешней программе вычислить только значение переменной y по указанной формуле, подставляя каждый раз различные значения x, то есть использовать только процедуру, необходимо изменить листинг модуля. Для этого достаточно описание заголовка функции Funsort, вычисляющей корень n-ой степени, из интерфейсной части переместить в раздел реализации.

Задача 9.2. Дана матрица A(n, m). Необходимо: упорядочить элементы в каждой строке матрицы по возрастанию, а сами строки расположить по убыванию количества положительных элементов в строке. В программе организовать вызов процедуры, реализующей общую часть задания. Формирование элементов массива A случайным образом, вывод элементов массива оформить в виде процедур. Сортировку строк и элементов в строках матрицы A оформить в подпрограммах (процедурах). Нахождение количества положительных элементов в строке матрицы А выполнить с помощью функции. Процедуры и функцию описать в модуле.

Листинг модуля Second2

unitsecond2;