Использование модулей в основной программе

Чтобы использовать подпрограммы, константы, типы, переменные, описанные в интерфейсе модуля, в основной программе следует записать слово 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.
Читайте также:
Программа чтобы открывать файлы apk

Источник: 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

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru