Assign(f, 'TempFile. txt');
Rewrite(f); //создать файл
finalization
if FileExists('TempFile. txt') then
//Если файл не был уничтожен,
begin //то
try
CloseFile(f); //Закрыть файл
except
//Сообщения не будет,
//если файл был закрыт в основной программе
end;
Erase(f); //Уничтожить закрытый файл
end
end.
. присоединить к программе Project1:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
Unit1;//Использовать модуль Unit1 в этой программе
. . . . . . .
то файл 'TempFile. txt' будет создан до передачи управления в основную программу и с ним можно будет работать, используя файловую переменную f (открывать, закрывать, открывать для до-
бавления текста, записывать текст в файл, читать из файла, уничтожать файл), а после выхода из основной программы при любом ее завершении (нормальном или аварийном) управление
будет передано операторам части финализации модуля Unit1, и файл 'TempFile. txt' будет уничтожен.
Объявления в отдельных частях модуля могут располагаться в любой последовательности и чередоваться при соблюдении правила использования имен: при объявлении нового имени (констан-
ты, типа, переменной, процедуры, функции) могут использоваться только ранее объявленные имена или имена из подключенных модулей. Компилятор узнает о подключенных модулях, анализируя
предложения использования в основной программе или в самих модулях. Предложение использования строится из ключевого слова uses и следующего за ним списка имен подключаемых модулей. В основной программе и в интерфейсной части модуля формы, создаваемых в среде Delphi, предложения использования вставляются автоматически. имена новых модулей следует просто
добавить в уже имеющийся список. При создании нового модуля пользователь при необходимости должен сам добавить предложения использования. Например, в модуль, создаваемый для решения вычислительных задач, следует в интерфейсную часть или в часть реализации включить предложение использования со стандартным модулем Math:
uses Math;
Присутствие имени модуля в предложении использования основной программы (или другого модуля) означает, что объявленные в его интерфейсной части константы, типы, переменные и подпрограммы доступны для использования. Существует отличие в назначении предложений использования в разных частях модуля. Предложения использования в интерфейсных частях должны строиться так, чтобы не возникало взаимных ссылок модулей непосредственно или через другие модули. Только в этом случае компилятор сможет определить порядок использования объявлений из интерфейсных частей. Для части реализации такого ограничения нет. Это позволяет строить взаимно рекурсивные подпрограммы, принадлежащие разным модулям. Можно использовать взаимную рекурсию и внут-
ри модуля без применения директивы forward, так как оно действует в модулях по умолчанию для всех подпрограмм, заголовки которых размещены в интерфейсной части. При разработке программы в среде Delphi вновь создаваемый модуль (по команде File/New/Unit) добавляется в предложение использования основной программы автоматически. Также автоматически добавляется в предложение использования основной программы ссылка на готовый модуль. Для этого следует ввести команду Project/Add to Project..., в диалоге выбрать папку с модулем и в ней. сам модуль с расширением. pas (при разработке приложения с формой текст основной программы можно отобразить командой Project/View Source). После добавления в проект модулей программист уже в них должен прописать в предложениях использования взаимные ссылки. В приложениях с формой убедиться, что модуль подключен, можно, отобразив текст основной программы командой Project/View Source, где должна быть ссылка на модуль в предложении uses, или открыв окно диалога Project Manager командой View/Project Manager... Пример 1. Составить консольное приложение, выполняющее обработку матриц по формуле (A + B) ЧC + D. Приложение должно использовать модули Unit1 и Unit2, подготовленные в проекте и хранящиеся в одной папке с основной программой. Модуль Unit1 предназначен для объявления типа массивов, которые будут хранить матрицы, участвующие в вычислениях, и две процедуры: ReadMatr ввода матрицы и WriteMatr вывода. Модуль Unit2 также должен содержать процедуры AddMatr сложения матриц и MulMatr умножения. Требования к модулю Unit1. Для хранения матриц следует использовать двумерные динамические массивы. Первый параметр процедуры ReadMatr должен представлять матрицу, размеры которой заданы вторым и третьим параметрами, а четвертый параметр целого типа с начальным значением 0 указывать режим работы процедуры. Процедура ReadMatr должна обеспечить ввод матрицы с клавиатуры в виде матрицы по строкам, если четвертый параметр при ее вызове опущен. Этот параметр предназначен для отладки программ, использующих модуль Unit1. При задании в вызове процедуры ReadMatr четвертого параметра, не равного 0, процедура должна генерировать матрицу случайных чисел от нуля до абсолютного значения этого параметра включительно, причем если он меньше нуля, то при многократных запусках программы генерироваться должны разные данные, ина-
че. одни и те же. Сгенерированные матрицы следует выводить в виде матрицы по строкам. роцедура WriteMatr должна иметь один параметр, представляющий матрицу, и обеспечивать ее вывод в виде матрицы по строкам с пробелом между числами не менее одного. Требования к модулю Unit2. Для хранения матриц следует использовать двумерные динамические массивы типа, объявленного в модуле Unit1. В процедурах AddMatr и MulMatr два первых параметра должны представлять только входные данные (матрицы, представляющие только исходные данные), а третий. только выходные данные (результирующую матрицу). Требования к основной программе. Использовать условную ком-
пиляцию, обеспечивающую при объявлении имени Debug директивой {$IFDEF Debug} генерацию случайных чисел для матриц, представляющих исходные данные, иначе ввод матриц с кла-
виатуры.
//Модуль Unit1 объявления типа двумерного
//динамического массива
//и процедур ввода и вывода матриц.
unit Unit1;
interface
uses
Math;
type
tm1=array of Integer;
//тип двумерного динамического массива
tm2=array of tm1;
procedure ReadMatr(out x:tm2;
m, n:Integer;
r:Integer=0);
procedure WriteMatr(const x:tm2);
implementation
procedure ReadMatr(out x:tm2;
m, n:Integer;
r:Integer=0);
{Ввод матрицы m*n по строкам в динамический
массив типа tm2: при r=0 - ввод с клавиатуры,
иначе - от датчика случайных чисел,
причем при r>0 - без Randomize,
иначе - с Randomize}
var i, j:Integer;
begin
//Установить размеры массива x
//равными размерам вводимой матрицы
SetLength(x, m,n);
if r=0 then begin
//Ввод матрицы с клавиатуры
for i:=0 to m-1 do begin
for j:=0 to n-1 do
Read (x[i, j]);
ReadLn
end;
end
231
else
begin
//Генерация матрицы случайных целых чисел,
//из интервала 0..r+1
if r<0 then //При r<0 будет создан
//новый набор случайных чисел для матрицы
Randomize;
r:=Abs(r)+1;
for i:=0 to m-1 do
for j:=0 to n-1 do
x[i, j]:=Random(r);
WriteMatr(x);
end;
end;//ReadMatr
procedure WriteMatr(const x:tm2);
{Вывод матрицы m*n по строкам
из динамического массива}
var i, j,m, n,xmax:Integer;
begin
m:=High(x);
n:=High(x[0]);
xmax:=Abs(x[1,1]);
for i:=0 to m do
for j:=0 to n do
if Abs(x[i, j])>xmax then
xmax:=Abs(x[i, j]);
for i:=0 to m do begin
for j:=0 to n do
Write (x[i, j]:Trunc(Log10(xmax))+2);
WriteLn;
end;
end;//WriteMatr
end.
//Модуль Unit2 объявления процедур
//сложения и умножения матриц
unit Unit2;
interface
uses
Unit1;
{Фактические параметры обеих процедур не могут
быть одновременно и входными, и выходными}
procedure AddMatr(const x, y:tm2; out z:tm2);
7. МОДУЛИ ПОЛЬЗОВАТЕЛЕЙ
232 ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ
procedure MulMatr(const x, y:tm2; out z:tm2);
implementation
procedure AddMatr(const x, y:tm2; out z:tm2);
{Процедура сложения матриц Z=X+Y}
var
i, j,m, n:Integer;
begin
m:=High(x); //m+1 - число строк в X, Y и Z
n:=High(x[0]);//n+1 - число столбцов в X, Y и Z
//Установить размеры массива z
//равными размерам матрицы Z
SetLength(z, m+1,n+1);
for i:=0 to m do
for j:=0 to n do
z[i, j]:=y[i, j]+x[i, j];
end;//AddMatr
procedure MulMatr(const x, y:tm2; out z:tm2);
{Процедура умножения матриц Z=X*Y}
var
i, j,m, n,l, k:Integer;
begin
// m+1 - число строк в X и Z столбцов в Y
m:=High(x);
// n+1 - число столбцов в X
n:=High(x[0]);
// l+1 - число столбцов в Y
l:=High(y[0]);
//Установить размеры массива z
//равными размерам матрицы Z
SetLength(z, m+1,l+1);
for i:=0 to m do
for j:=0 to l do begin
z[i, j]:=0;
for k:=0 to n do
z[i, j]:=z[i, j]+x[i, k]*y[k, j];
end;
end;//MulMatr
end.
//Основная программа вычисления матрицы E=(A+B)*C+D
program Project1;
{$APPTYPE CONSOLE}
233
uses
SysUtils,
Unit1 in 'Unit1.pas',
Unit2 in 'Unit2.pas';
//Объявление имени Debug,
//используемого при условной компиляции.
{$DEFINE Debug}
//Отменить объявление имени Debug можно,
//удалив строку с директивой {$DEFINE Debug}
//или превратив ее в комментарий: //{$DEFINE Debug}.
var
a, b,c, d,e, f,g:tm2;
begin
{$IFDEF Debug}
//Если имя Debug объявлено директивой
//{$DEFINE Debug}, то в исполняемую программу
//будут включены следующие операторы, обеспечивающие
//генерацию матриц случайных чисел и их вывод
WriteLn(' Mатрица A 2х3 целых случайных чисел '
,'в диапазоне 0..7');
ReadMatr(a,2,3,8);
WriteLn(' Mатрица B 2х3 целых случайных чисел '
,'в диапазоне 0..5');
ReadMatr(b,2,3,6);
WriteLn(' Mатрица C 3х4 целых случайных чисел '
,'в диапазоне 0..8');
ReadMatr(c,3,4,-9);
WriteLn(' Mатрица D 2х4 целых случайных чисел '
,'в диапазоне 0..8');
ReadMatr(d,2,4,9);
{$ELSE} //иначе, то есть если имя Debug
//не объявлено, то в исполняемую программу
//будут включены следующие операторы,
//обеспечивающие ввод матриц с клавиатуры.
WriteLn(' Введите матрицу A 2х3');
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |


