Скачать программы Все программы автора1. 13. Разработка модулейИзвестно, что откомпилированная программа размещается в отдельном сегменте памяти, т. е. не может превышать 64 Кбайта. Для создания больших программ в Турбо - Паскале предусмотрено подключение к основной программе откомпилированных модулей. Модуль включает в себя, как правило, большое число процедур, выполняющих однотипные операции, например, работа с графикой, операции с комплексными числами, матричные операции и т. д.
Модуль определяется как программа, начинающаяся со служебного слова "Unit" и включающая в себя интерфейсную, исполняемую и инициирующую части. Интерфейсная часть модуля начинается со служебного слова "Interface" и состоит из раздела описания глобальных имен типов, меток, констант, переменных, а также заголовков процедур, доступных основной программе. Исполняемая часть модуля начинается со служебного слова "Implementation" и содержит полное описание процедур (заголовок, разделы описания и выполнения), заголовки которых перечислены в интерфейсной части, а также локальных имен типов, меток, констант и переменных, используемых в инициирующей части. Инициирующая часть модуля начинается со служебного слова "Begin" и содержит блок операторов, выполняемых при подключении модуля к основной программе. Инициирующая часть вместе со словом " Begin " может отсутствовать или быть пустой. Заканчивается модуль служебным словом " End. " с точкой. Содержимое исполняемой и инициирующей частей не доступно основной программе, связь модуля с основной программой осуществляется через интерфейсную часть модуля. Структура модуля имеет вид: Unit Name_M; { Name_M - имя модуля } { ----------------------------------------------------------------- } Interface { Интерфейсная часть модуля} { ------------------------------------ раздел описания глобальных имен} Type MM= array[1..10, 1..10] of real; { описание типа } Var Max_F, Min_F: real; {описание глобальных переменных} { ----------------------------------------------------------------- } Procedure Name_P(p1: real; p2: MM); { описание заголовков процедуры} Function Name_f(p3, p4: real): real; { и функции } { ----------------------------------------------------------------- } Implementation {Исполняемая часть модуля} { -------------------------------------- раздел описания локальных имен} Const C = 'Подключен модуль Name_M'; { задание локальной константы} Procedure Name_P; {Полное описание процедуры} { Раздел описания процедуры} Begin { Раздел выполнения процедуры} End; Function Name_f: real; {Полное описание функции} { Раздел описания функции} Begin { Раздел выполнения функции} End; { ---------------------------------------------------------------- } BEGIN { Инициирующая часть модуля} Writeln(C); {операторы модуля} END. Отметим, что в интерфейсной части модуля запрещается делать опережающее описание процедур. Запрещается также рекурсия модулей. Модуль записывается в файл с именем модуля, например, Name_M. pas. Затем файл компилируется, при этом получается файл с расширением ". tpu", например, Name_M. tpu, который автоматически записывается в каталог, указанный в опции Options, Directories, EXE & TPU, иначе - в текущий каталог. При запуске программы, использующей модуль, файл с расширением ". tpu" ищется в каталоге, указанном в опции Options, Directories, EXE & TPU или Unit Directories, либо в текущем каталоге. Подключение модулей осуществляется в начале основной программы с помощью служебного слова "Uses" с указанием имен модулей, например: Program Pr_1; Uses Name_M1, Name_M2; Если в основной программе имя идентификатора совпадает с именем, объявленным в интерфейсной части подключенного модуля, то используются значения, присвоенные идентификатору в программе. Если одинаковые имена встречаются в интерфейсной части подключенных модулей (например в Name_M1 и Name_M2), то используются значения, присвоенные идентификатору в последнем описанном модуле, т. е. в Name_M2.
Приведем пример разработки и подключения модуля. В модуле опишем процедуры работы с матрицами.
Unit MATR_1; { ----------------------------------------------------------------- } Interface { ----------------------------------------------------------------- } Type M = array[1..10, 1..10] of real; M1 = array[1..10] of real; Procedure MAT_1(a:M; var b:M; n: word); Procedure MAT_2(a:M; var b:M1; n: word); { ----------------------------------------------------------------- } Implementation { ----------------------------------------------------------------- } Procedure MAT_1; { создание матрицы "B", транспонированной к "A"} var i, j: word; begin for i:=1 to N do for j:=1 to N do b[i,j]:=a[j,i] end; { ----------------------------------------------------------------- } Procedure MAT_2; {расчет квадратов диагональных элементов} var i, j: word; begin for i:=1 to N do b[i]:=a[i,i] * a[i,i] end; { ----------------------------------------------------------------- } END. В основной программе PR_1 подключается модуль MATR_1 и используются процедуры MAT_1 и MAT_2. Program PR_1; Uses MATR_1; Type MM = M; MM1 = M1; Var a1,a2,a3: MM; b1,b2: MM1; i,j,n: word; Begin Writeln('введите размерность матрицы N='); Readln(n); Randomize; for i:=1 to n do for j:=1 to n do a1[i,j]:=random(20)+1; MAT_1(a1, a2, n); MAT_1(a2, a3, n); MAT_2(a1, b1, n); MAT_2(a2, b2, n) end. В результате двойного транспонирования исходной матрицы "a1" (из "a1" в "a2", из "a2" в "a3") получается матрица "a3" тождественная "a1" . Матрицы "b1" и "b2" содержат квадраты диагональных элементов матриц "a1" и "a2". Типы массивов фактических параметров должны соответствовать типам массивов формальных параметров, описанных в модуле MATR_1. Можно использовать имена типов, заданные в интерфейсной части модуля или задавать новые имена типов.
Практическое задание N 1. 33
1. Написать и отладить программы с использованием модуля, содержащего процедуры расчета элементов линейных массивов "В", являющихся: 1_1. суммой элементов в столбцах матрицы "A" (NxM), 1_2. суммой элементов в строках матрицы "A" (NxM), 1_3. наибольшими элементами в строках матрицы "A" (NxM), 1_4. наименьшими элементами в строках матрицы "A" (NxM). 1_5. наибольшими элементами в столбцах матрицы "A" (NxM), 1_6. наименьшими элементами в столбцах матрицы "A" (NxM). N=30, M=10. Значения элементов матрицы "A" определяются в основной программе функцией Random(10), N=15, M=6. Программа выводит на экран значения элементов массивов "A" и "В". 2. Составить модуль, содержащий процедуры или функции для расчета: 2_1. скалярного произведения двух векторов "A" и "B" длиной "N", т. е. С = A * B = a 1 * b 1 + a 2 * b 2 + ... + a N * b N , где N<=100. 2_2. суммирования двух матриц "A" и "B" размером (МxN), N<=30, M<=30, т. е. С = A + B , где c 11 = a 11 + b 11 ; b 12 = a 12 + b 12 ; и т . д . c MN = a MN + b MN. 2_3. умножения двух матриц "A" (МxN) и "B" (NxK) , N<=30, K <=30, M<=30, т. е. С= A * B , где c ij = a i1 * b 1j + a i2 * b 2j + ... + a iN * b Nj ; и т. д. Элемент с индексом "i, j" новой матрицы "С" (МхК) получается как сумма произведений элементов i - ой строки матрицы "A" на соответствующие элементы j - ого столбца матрицы "В". Значения элементов матрицы "A" определяются в основной программе функцией Random(200), М=5, N=10. Программа выводит на экран массивы "A", "В" и "С". |