Чтобы использовать подпрограммы, константы, типы, переменные, описанные в интерфейсе модуля, в основной программе следует записать слово uses, после которого указать имя (имена) модуля (модулей). После этого в основной программе можно использовать идентификаторы, указанные в интерфейсах перечисленных модулей.
Пример. Программа, меняющая в массиве максимальное и минимальное числа.
program EXAMPLE26;
uses Unit1, Unit2;
var i: Integer;
for 1 := 1 to N do
procedure Change(var Am Mass);
procedure Change;
var Max, Min, i: Integer;
for i := 1 to N do
if Arr[i] > Arr[Max] then Max:= i;
type Mass = array[l..N] of Real;
constArr:Mass= (0.5, -2.0, 1.0, 3.5, 7.0);
procedure Swap(var X, Y: Real);
Z := X; X := Y; Y := Z
13.6. Использование идентификаторов элементов модуля
Как правило, идентификаторы объектов модуля используются в основной программе (или другом модуле) обычным образом. Однако может оказаться, что используемый идентификатор элемента модуля совпадает с идентификатором использующей его программы. Чтобы различить их, при обращении к элементу модуля указывается имя модуля, а затем через точку — идентификатор объекта (аналогично использованию полей записи).
Видео 5. Подключение модулей Мх210 в среде программирования CODESYS v3.5
Пример.
program ЕХАМРLE;
vаr Result, X: Reа1;
14 Стандартные модули
Как указывалось выше, модули можно использовать для создания библиотек стандартных подпрограмм и данных. В Тurbo Раscаl в настоящее время имеется большое количество стандартных подпрограмм и данных, объединенных в несколько стандартных модулей. Они позволяют упростить процедуру написания программ, более полно использовать возможности компьютеров типа IВМ РС, возможности операционной системы МS DOS. В библиотеке имеются следующие стандартные модули:
System — — основная библиотека;
Strings — работа с АSCIIZ-строками;
Crt — работа с консолью;
Graph — графическая библиотека;
Dos — использование, возможностей ДОС;
WinDos — использование возможностей ДОС с использованием АSСIIZ-строк
Оverlaу — организация оверлейных сруктур;
Рrinter -работа с принтером;
Turbo3 — связь с программами Тurbo Раsсаl 3.0;
Graph3 — связь с графикой Тurbo Раscal 3.0.
Модули Strings, Graph, WinDos, Тurbo3 и Graph3 находятся соответственно в файлах Strings.TPU. GRAPH.TPU, WINDOS.TPU, TURBO3.TPU и GRAPH.ТРU, остальные – в файле ТURBO.ТРL.
Так как необходимость обеспечить совместимость с программами, написанными в терминах среды Тurbo Раscаl 3.0, возникает. все реже и реже, модули Тurbo3 и Graph3 рассматриваться не будут.
При описании каждого модуля вначале приводятся сводные данные об элементах модуля (константы. переменные, типы, подпрограммы),.а затем краткие характеристики подпрограмм. Учитывая, что в среде Тurbo Раscаl 7.0 имеется хорошо развитая система помощи, включая и многочисленные примеры, которые можно непосредственно использовать в создаваемой программе, при описании ; каждой стандартной подпрограммы будут приведены лишь ее название и назначение.
Астроумные. Матрица, модули и кристаллы. Как эти элементы влияют на нашу жизнь? Выпуск от 07.07.2023
Источник: studfile.net
Использование модулей в основной программе
Чтобы использовать подпрограммы, константы, типы, переменные, описанные в интерфейсе модуля, в основной программе следует записать слово uses, после которого указать имя (имена) модуля (модулей). После этого в основной программе можно использовать идентификаторы, указанные в интерфейсах перечисленных модулей.
Пример. Программа, меняющая в массиве максимальное и минимальное числа.
program EXAMPLE26; |
uses Unitl, Unit2; |
var i: Integer; |
begin |
Change(Arr); |
for i := 1 to N do |
WriteLn(Arr[i]) |
end. |
unit Unit1; |
interface |
uses Unit2; |
procedure Change(var Arr: Mass); |
implementation |
uses Unit3; |
procedure Change; |
var Max, Min, i: Integer; |
begin |
Max := 1; |
Min :=1; |
for i := 1 to N do |
begin |
if Arr[i] > Arr[Max] |
then Max := i; |
if Arr[i] |
then Min : = i |
end; |
Swap(Arr[Max], Arr[Min]) |
end |
end. |
unit Unit2; |
interface |
const N = 5; |
type Mass = array[l..N] of Real; |
const Arr: Mass =(0.5, -2.0, l.0, 3.5, 7.0); |
implementation |
end. |
unit Unit3; |
interface |
procedure Swap(var X, Y: Real) |
implementation |
procedure Swap(var X, Y: Real); |
var Z: Real; |
begin |
Z := X; X :- Y; Y := Z |
end |
end. |
Источник: 5byte.ru
Создание и использование модулей
Помимо использования стандартных библиотек язык C позволяет создавать пользователю-программисту собственные библиотеки функций. Это позволяет упростить процесс программирования и улучшить качество программ. Каждая библиотека оформляется как отдельный заголовочный файл с расширением h. В этом файле производится объявление констант, переменных, типов данных, функций Определение (описание) функций помещают в файле с таким же именем, но с расширением .cpp.
Для подключения созданной библиотеки (заголовочного файла) следует использовать директиву #include .
Для добавления в проект заголовочного файла следует выбрать пункт меню Project и в раскрывшемся подменю выбрать пункт Add New Item.
В раскрывшемся окне следует выбрать шаблон Header File(.h) и в редакторе кода набрать код заголовочного файла.
После этого необходимо выполнить те же действия для создания файла с расширением .cpp и добавления его в проект (содержит описания функций). При этом в раскрывающемся окне следует выбрать пункт C++File(.cpp).
Объявления в отдельных частях модуля могут располагаться в любой последовательности и чередоваться при соблюдении правила использования имён: при объявлении нового имени (константы, типа, переменной, процедуры, функции) могут использоваться только ранее объявленные имена или имена из подключенных модулей.
Компилятор узнаёт о подключенных модулях, анализируя предложения использования в основной программе или в самих модулях. Предложение использования строится из ключевого слова #include и следующего за ним имени заголовочного файла. При создании нового модуля пользователь должен сам, при необходимости, добавить предложения использования. Например, в модуль, создаваемый для решения вычислительных задач, следует включить предложение использования со стандартным модулем math.h:
Присутствие имени модуля в предложении использования основной программы (или другого модуля) означает, что объявленные в нем константы, типы, переменные и подпрограммы доступны для использования в ней (или другом модуле).
Пример 1. Составить консольное приложение, выполняющее обработку матриц по формуле . Приложение должно использовать модуль modul1 и модуль modul2, подготовленные в одном проекте и хранящиеся в одной папке с основной программой. Модуль modul1 предназначен для объявления двух функций readmatr ввода матрицы и writematr вывода матрицы. Модуль modul2 должен содержать функцию addmatr сложения матриц и функцию mulmatr умножения матриц.
Требования к модулю modul1. Для хранения матриц следует использовать двумерные динамические массивы.
Первый параметр функции readmatr должен представлять матрицу (int ***x – адрес переменной указателя, хранящего адрес массива указателей на строки матрицы), размеры которой должны быть заданы вторым и третьим параметрами, а четвёртый параметр целого типа с начальным значением 0 должен указывать режим работы функции. Функция readmatr должна обеспечить ввод матрицы с клавиатуры, если четвёртый параметр при её вызове опущен.
Этот параметр предназначен для отладки программ, использующих модуль modul1. При задании в вызове функции readmatr четвёртого параметра, не равного 0, функция должна генерировать матрицу случайных чисел в диапазоне от 0 до абсолютного значения этого параметра включительно, причем если параметр меньше нуля, то при многократных запусках программы генерироваться должны разные данные, иначе – одни и те же данные. Сгенерированные матрицы должны выводиться в виде матрицы по строкам. Функция writematr должна иметь три параметра, первые два из которых задают размеры матрицы (количество строк и столбцов), а третий параметр представляет матрицу, и обеспечивать вывод матрицы в виде матрицы по строкам, разделяя числа не менее чем двумя пробелами.
Требования к модулю modul2. Для хранения матриц следует использовать двумерные динамические массивы. В функциях addmatr и mulmatr два первых параметра должны представлять только входные данные (матрицы, представляющие только исходные данные), а третий – только выходные данные (результирующую матрицу). Четвертые и пятые параметры задают количество строк и столбцов первой матрицы, шестой параметр функции mulmatr определяет количество столбцов второй матрицы.
Требования к основной программе. Использовать условную компиляцию, обеспечивающую при объявлении константы DEBUG директивой #define DEBUG 1, равной единице, генерацию случайных чисел для матриц, представляющих исходные данные, иначе – ввод матриц с клавиатуры (#if DEBUG==1).
Текст файла modul1.h (объявление функций ввода и вывода матриц):
void readmatr(int ***x,int m,int n,int r=0);
void writematr(const int m,const int n,int **x);
Текст файла modul2.h (объявление функций сложения и умножения матриц):
void addmatr(int **x,int **y,int ***z,int m,int n);
void mulmatr(int **x,int **y,int ***z,int m,int n,int l);
Текст файла modul1.cpp (описание функций ввода и вывода матриц):
void readmatr(int ***x,int m,int n,int r)
при r=0 — ввод с клавиатуры, иначе — от датчика случайных
чисел, причём при r>0 — без srand, иначе — с srand*/
//Установить размеры массива x
//равными размерам вводимой матрицы
*x=new int *[m]; //не было в С
//Генерация матрицы случайных целых чисел,
//из интервала 0..r
//новый набор случайных чисел для матрицы
/*Вывод матрицы по строкам*/
void writematr(const int m,const int n,int **x)
Текст файла modul2.cpp (описание функций сложения и умножения матриц):
void addmatr(int **x,int **y,int ***z,int m,int n)
//Установить размеры массива z равными размерам матрицы Z
void mulmatr(int **x,int **y,int ***z,int m,int n,int l)
//Установить размеры массива z равными размерам матрицы Z
Текст основной программы
int _tmain(int argc, _TCHAR* argv[])
//Если константа DEBUG объявлена директивой #define DEBUG 1, равной 1, то
//в исполняемую программу будут включены следующие операторы,
//обеспечивающие генерацию матриц случайных чисел и их вывод
printf(«Matriza A 2×3 zelix sluchainix chisel n»);
printf(«n Matriza B 2×3 zelix sluchainix chisel n»);
printf(«n Matriza C 3×4 zelix sluchainix chisel n»);
printf(«n Matriza D 2×4 zelix sluchainix chisel n»);
//иначе, то есть если константа DEBUG объявлена, не равной 1, то
//в исполняемую программу будут включены следующие операторы,
//обеспечивающие ввод матриц с клавиатуры.
printf(«n Wwedite matrizu A 2×3 zelix chiseln»);
printf(«n Wwedite matrizu B 2×3 zelix chiseln»);
printf(«n Wwedite matrizu C 3×4 zelix chisel n»);
printf(«n Wwedite matrizu D 2×4 zelix chisel n»);
//Вычисление и вывод матриц
printf(«n Matriza F=(A+B) n»);
printf(«n Matriza G=(A+B)xC n»);
printf(«n Matriza E=(A+B)xC+Dn»);
При запуске программы с директивой, задающей значение константы DEBUG, равной единице, в окно программы сразу будут выведены с поясняющими текстами результаты построения матриц случайных чисел и вычисления выражения по шагам, как показано на рис. 7.1.
При обращении к функции ввода с отрицательным последним параметром производится обращение к функции srand(time(NULL)); все матрицы будут при повторных запусках новые (используется каждый новое начальное значение случайного числа). При положительном значении последнего параметра все матрицы при повторных запусках не изменяются (используется одно и то же начальное значение случайного числа).
После отладки программы в строке с директивой #define DEBUG 1, в которой константе задается значение, равное 1, следует произвести изменение, задающее константе любое значение, отличное от 1.
В соответствии с условиями примера 1 для хранения исходных данных и результатов при сложении и умножении матриц используются разные массивы. С целью уменьшения числа дополнительных массивов (в программе это массивы f и g) можно сохранять полученные результаты на месте одного из исходных массивов. Для расширения возможностей функций addmatr и mulmatr можно создать новый модуль, заменяющий модуль modul2, или использовать его подпрограммы в новом модуле. Рассмотрим второй вариант, так как он интересен ещё и тем, как следует использовать одинаковые глобальные имена, объявленные в разных модулях.
Пример 2. Составить консольное приложение, выполняющее обработку матриц по формуле A∙B∙C+C+D∙A. Приложение должно использовать модули modul1 и modul2, подготовленные ранее (см. пример 1), и новый модуль modul3. Модуль modul3, как и модуль modul2, должен иметь функции addmatr и mulmatr, имеющие то же назначение, что и одноимённые функции модуля modul2, но, по возможности, использовать их и допускать применение одного и того же массива при обращении к ним одновременно в качестве разных фактических параметров.
Модуль ввода и вывода данных остается без изменений. В модуль modul2 внесено изменение, связанное с объявлением области действия имен. Это сделано для того, чтобы можно было обращаться к одноименным функциям, представленным в разных модулях.
Текст файла modul2.h (объявление функций сложения и умножения матриц):
void mulmatr(int **x,int **y,int ***z,int m,int n,int l);
Одноименные функции сложения и умножения матриц, объявленные в третьем модуле, позволяют сохранять полученный результат на месте одной из исходных матриц.
Текст файла modul3.h (объявление функций сложения и умножения матриц):
void mulmatr(int **x,int **y,int ***z,int m,int n,int l);
Текст файла modul2.cpp (описание функций сложения и умножения матриц):
void addmatr(int **x,int **y,int ***z,int m,int n)
//Установить размеры массива z равными размерам маирицы Z
void mulmatr(int **x,int **y,int ***z,int m,int n,int l)
//Установить размеры массива z равными размерам маирицы Z
Текст файла modul3.cpp (описание функций сложения и умножения матриц):
using namespace mod2;
void addmatr(int **x,int **y,int ***z,int m,int n)
//Выделить память по массив z, если его адрес не совпадает с адресом
// ни одного из исходных массивов
void mulmatr(int **x,int **y,int ***z,int m,int n,int l)
//Если адрес результирующего массива совпадает с адресом одного из
//исходных массивов, то используется промежуточный массив, память для //которого затем освоборждается
Текст основной программы
using namespace mod2;
using namespace mod3;
int _tmain(int argc, _TCHAR* argv[])
// Если константа DEBUG объявлена директивой #define DEBUG 1, равной 1, то
//в исполняемую программу будут включены следующие операторы,
//обеспечивающие генерацию матриц случайных чисел и их вывод
printf(«Matriza A 2×3 zelix sluchainix chisel n»);
printf(«n Matriza B 3×3 zelix sluchainix chisel n»);
printf(«n Matriza C 3×2 zelix sluchainix chisel n»);
printf(«n Matriza D 3×2 zelix sluchainix chisel n»);
//иначе, то есть если константа DEBUG объявлена, не равной 1, то
//в исполняемую программу будут включены следующие операторы,
//обеспечивающие ввод матриц с клавиатуры.
printf(«n Wwedite matrizu A 2×3 zelix chiseln»);
printf(«n Wwedite matrizu B 3×3 zelix chiseln»);
printf(«n Wwedite matrizu C 3×2 zelix chisel n»);
printf(«n Wwedite matrizu D 3×2 zelix chisel n»);
//Вычисление и вывод матриц
printf(«n Matriza F=(AxB) n»);
printf(«n Matriza G=AxBxC n»);
printf(«n Matriza E=(AxBxC)+Cn»);
printf(«n Matriza G=AxD n»);
printf(«n Matriza E=(AxBxC)+C+AxDn»);
Чтобы обеспечить возможность использования при вызове функции одного и того же имени массива в качестве параметра, используются функции, объявленные в третьем модуле. Если в функциях этого модуля выясняется, что адрес выходного фактического массива совпадает с адресом хотя бы одного входного фактического массива, то вызывается функция mulmatr модуля modul2 с указанием в качестве выходного параметра нового, объявленного в модуле modul3 массива, из которого, после возврата управления, данные копируются в выходной фактический параметр функции mulmatr модуля modul3. Если же в функции mulmatr модуля modul3 выясняется, что адрес выходного фактического массива не совпадает с адресами входных фактических массивов, то функция mulmatr модуля modul2 вызывается с тем же набором параметров, который был передан в функцию mulmatr модуля modul3.
(x==*z //адрес выходного параметра равен адресу первого
y==*z) //адресу второго входного параметра,
//значит выходной параметр совпадает
//с одним или обоими входными
При наличии в разных модулях одинаковых имён, при вызове функции следует в качестве префикса указывать соответствующую область действия имен (например, mod3::mulmatr(a,b, или mod2::addmatr(b,c,
Результат работы программы при вводе данных с клавиатуры представлен на рисунке рис. 7.2.
При рассмотрении предметной области заданий на составление модулей авторы учитывали уровень знаний первокурсников, а также тот факт, что трудоемкость этого задания не должна существенно превышать трудоемкость других заданий. В связи с этим первая группа заданий включает задания на матрицы, а вторая группа заданий связана с решением геометрических задач. При решении задач первой группы студенты могут использовать фрагменты ранее написанных программ, модифицировав их в соответствии с требованиями оформления модулей и придав им более универсальный характер. Модуль, содержащий ряд часто используемых подпрограмм, может использоваться студентами в дальнейшем при изучении курса ”Информатики”, а также при выполнении заданий и по другим дисциплинам.
Дата добавления: 2018-10-27 ; просмотров: 292 ; Мы поможем в написании вашей работы!
Источник: studopedia.net