ИнфТехнКомпТехн
.pdfЕсли произошла ошибка, то в блоке 3 программа завершается с сообщением Error - Ошибка. Окно работающего приложения задания 2 показано на Рис. 8.4.
В противном случае в блоке 4 пользователь вводит два целых положительных числа N1 и N2. В блоке 5 определяется число компонент Imax = N2-N1, которые надо занести в файл. Блок 6 открывает цикл записи Imax компонент, в теле которого блок 7 выполняет запись в файл чисел в интервале N1..N2. В блоке 8 файл закрывается, а затем открывается для проверки, которая организуется в блоке 10 цикла путем построчного вывода блоком 11 Imax компонент из файла вместе с номерами. В блоке 12 файл закрывается. Для наблюдения за процессом в алгоритм введены паузы (блоки 9 и 13).
Листинг программы: program Prg_8_2; {$APPTYPE CONSOLE} uses SysUtils,RusTrans; label
Exit; const
FileDir='c:\users\PO_11\Ivanov\08_2\';; |
|
|
|
||||
var |
|
// Файловая переменная |
|
|
|||
MyFile: File of integer; |
|
|
|||||
FilePath, FileName: string; |
|
|
|
|
|
||
N1,N2,i,imax,Temp: integer; |
|
|
|
|
|
||
begin |
имя |
файла')); |
|
|
|
||
writeln(Rus('Введите |
|
|
|
||||
readln(FileName); |
|
|
|
|
|
|
|
writeln; |
|
|
|
|
|
|
|
FilePath:=FileDir+FileName; |
// Связь |
файлом на |
диске |
|
|||
AssignFile(MyFile,FilePath); |
|
||||||
{$I-} // Отключить контроль |
ошибок |
|
|
|
|||
Rewrite(MyFile);// Создать новый |
файл |
|
|
|
|||
{$I+};// Включить контроль |
ошибок |
|
открытия файла |
|
|||
if IOResult = 0 // Проверить |
ошибку |
|
|||||
then writeln(Rus('Спасибо')) |
|
|
|
|
|
||
else begin |
|
|
|
|
|
|
|
writeln(Rus('Ошибка')); |
|
|
|
|
|
|
|
readln; |
при |
ошибке |
|
|
|
|
|
goto Exit // Выход |
|
|
|
|
|||
end; |
|
|
|
|
|
|
|
writeln; |
N1, N2')); |
|
|
|
|
||
writeln(Rus('Введите |
|
|
|
|
|||
readln(N1,N2); |
|
|
|
|
|
|
|
writeln; |
|
|
|
|
|
|
|
imax:=N2-N1; |
|
|
|
|
|
|
|
for i:=0 to imax do |
|
|
|
|
|
|
|
begin |
|
|
|
|
|
|
|
Temp:=N1+i; |
// Записать в файл |
значение |
номер i |
|
|||
write(MyFile,Temp) |
|
||||||
end; CloseFile(MyFile); Reset(MyFile); |
Открыть |
файл |
для |
||||
writeln(Rus('Компоненты |
файла')); |
// |
|||||
проверки |
|
|
|
|
|
|
|
|
|
191 |
|
|
|
|
for i:=0 to imax do // Цикл |
чтения |
|
|
|
begin |
// |
Указатель |
файла |
на |
Seek(MyFile,i); |
||||
read(MyFile,Temp); |
// |
Прочитать элемент |
его на |
|
writeln(Rus('Компонент |
'),i,' |
= ',Temp);// |
Вывести |
|
дисплей |
|
|
|
|
end; CloseFile(MyFile); writeln; writeln('OK'); readln; Exit:;
end.
Задание 3
Создать программу для высокоскоростного копирования файла-источника в файлприемник. В качестве файлаисточника использовать результат компиляции Prg_8_1.exe программы задачи 1, созданный ранее. В качестве файлаприемника определить файл с именем Prg_8_1a.exe. После выполнения нужно проверить, что на диске имеется файлприемник того же размера и содержания. Чтобы убедиться в этом, можно этот файл исполнить.
Листинг программы: |
|
|
|
|
|
|
|
|
program Prg_8_3; |
|
|
|
|
|
|
|
|
{$APPTYPE CONSOLE} |
|
|
|
|
|
|
|
|
uses |
|
|
|
|
|
|
|
|
SysUtils,RusTrans; |
|
|
|
|
|
|
|
|
label |
|
|
|
|
|
|
|
|
Exit; |
FileDir='c:\users\PO_11\Ivanov\08_1\';; |
|||||||
const |
||||||||
FileDir='c:\users\PO_11\Ivanov\08_3\';; |
|
|
|
|
||||
var |
|
|
|
|
|
|
|
|
InFile,OutFile: File;// Файловые переменные |
|
|
|
|||||
Buf: array[1..512] of byte; |
// Буфер |
к |
файлам |
|
||||
FilePath1,FilePath2: string; |
// Пути |
|
||||||
i,j: integer; |
|
|
|
|
|
|
|
|
begin |
|
|
|
|
|
|
|
|
FilePath1:=FileDir1+'prg_8_1.exe'; |
Связь |
|
файлом |
источником |
||||
AssignFile(InFile,FilePath1); |
// |
|
||||||
на диске |
|
|
|
|
|
|
|
|
FilePath2:=FileDir2+'prg_8_1a.exe'; |
файлом |
приемником на |
||||||
AssignFile(OutFile,FilePath2); // |
Связь |
|||||||
диске |
// Открыть |
файд |
источник |
|
|
|||
Reset(InFile,512); |
|
|
||||||
Rewrite(OutFile,512);// Создать файл приемник |
|
|
||||||
writeln(Rus('Файл |
источник '),FilePath1); |
|
|
|
||||
writeln(Rus('Файл |
приемник '),FilePath2); |
|
|
|
||||
writeln; |
|
файл?')); |
|
|
|
|
|
|
writeln(Rus('Копировать |
|
|
|
|
|
|||
readln; |
|
начато')); |
|
|
|
|
||
writeln(Rus('Копирование |
|
|
|
|
||||
writeln; |
|
|
|
|
|
|
|
|
while not EOF(InFile) do |
|
|
|
|
|
|
|
|
begin |
|
|
/ |
Читать |
блок |
из |
InFile |
|
BlockRead(InFile,Buf, |
||||||||
|
|
192 |
|
|
|
|
|
|
BlockWrite(OutFile,Bu |
/ |
Писать блок из буфера |
end;
writeln(Rus('Копирование завершено')); readln;
CloseFile(InFile); // Закрыть файл источник CloseFile(OutFile); // Закрыть файл приемник end.
Задание 4
Создать программу обмена данными с файлом, использующую связь с файлами без файловых переменных. Она заносит в буфер 6 случайных чисел и переносит их в файл (он создается в папке проекта). Затем буфер обнуляется, и из файла возвращаются первые 4 числа. Окно работающего приложения задания 2 показано на Рис. 8.5.
Листинг программы: |
|
|
|
|
|
|
|
||
program Prg_8_4; |
|
|
|
|
|
|
|
|
|
{$APPTYPE CONSOLE} |
|
|
|
|
|
|
|
||
uses |
|
|
|
|
|
|
|
|
|
SysUtils,RusTrans; |
|
|
|
|
|
|
|
||
const |
// Константа Count |
|
|
|
|
|
|||
Count=6; |
|
|
|
|
|
||||
var |
|
|
// Дескриптор |
файла |
|
|
|
||
hMyFile: Integer; |
|
|
|
||||||
Buffer: Array[1..Count] of Byte; |
|
// Буфер |
|
|
|||||
i, Fact: Integer; |
|
|
|
|
|
|
|
||
begin |
|
|
|
|
|
|
файл |
|
|
hMyFile:=FileCreate('MyFile'); // Создать |
|
|
|||||||
writeln(Rus('В буфере случайные числа')); |
|
|
|||||||
Randomize; |
|
|
|
|
|
буфер |
|
|
|
for i:=1 to Count do // Заполнить |
|
|
|
||||||
begin |
|
|
|
|
|
|
|
|
|
Buffer[i]:= Random(100); |
|
|
буфера |
на |
дисплей |
||||
writeln(' |
', Buffer[i]); // Вывод |
||||||||
end; |
|
|
|
|
Count); // Запись |
в |
файл |
||
Fact:=FileWrite(hMyFile, Buffer, |
|||||||||
writeln(Rus('В |
файл |
записаны |
'),Fact); |
|
|
|
|||
readln; |
|
|
очищается')); |
|
|
|
|
|
|
writeln(Rus('Буфер |
|
|
|
|
|
||||
for i:=1 to Count do |
|
|
|
|
|
|
|
||
begin |
|
|
|
|
|
|
|
|
|
Buffer[i]:=0; |
|
|
// Вывод |
буфера |
на |
дисплей |
|||
writeln(' |
',Buffer[i]); |
||||||||
end; |
|
|
|
|
|
|
|
|
|
readln; |
|
|
|
// Установить маркер |
на |
начало |
|||
FileSeek(hMyFile, 0, 0); |
|||||||||
файла |
|
|
|
|
|
|
|
|
файла |
Fact:=FileRead(hMyFile, Buffer, Count-2); // Чтение из |
|||||||||
writeln(Rus('Из |
файла в |
буфер прочитаны')); |
|
|
|||||
for i:=1 to Count do |
|
|
|
|
|
|
|
||
begin |
',Buffer[i]); |
// Вывод |
буфера |
на |
дисплей |
||||
writeln(' |
|||||||||
end; |
|
буфере не |
нулевых чисел |
'),Fact); |
|
||||
writeln(Rus('В |
|
||||||||
|
|
|
|
193 |
|
|
|
|
|
FileClose (hMyFile); // Закрыть файл readln;
end.
Выводы
1.В Delphi определены типизированный, текстовый и нетипизированный файлы.
2.Связь с файлами может быть через файловые переменные или по именам.
3.При применении файловых переменных для связи с файлами на диске используется процедура AssignFile.
4.В типизированном файле возможен произвольный доступ к компоненту с любым номером.
5.В текстовом файле произвольный доступ к символу невозможен. Можно обращаться к строкам текста.
6.Нетипизированные файлы полезны для скоростного копирования.
9. Подпрограммы
Подготовка к работе
1.По рекомендованной литературе изучить:
правила объявления подпрограмм,
связь формальных и фактических параметров,
способы передачи фактических параметров в подпрограмму,
обращение к процедурам и функциям.
2.Разработать алгоритмы и программы решения задач.
Контрольные вопросы
1.Что такое подпрограмма? Ее назначение.
2.Правила объявления процедур в программе.
3.Правила объявления функций в программе.
4.Правила обращения к процедуре в программе.
5.Правила обращения к функции в программе.
6.Формальные и фактические параметры.
7.Передача параметров в процедуру с помощью параметров-значений.
8.Передача параметров в процедуру с помощью параметров-переменных. Использование слова var.
9.Передача параметров в процедуру с помощью параметров-констант. Использование слова const.
10.Использование слова out.
Задания к работе
1.Создать программу, использующую подпрограмму-функцию. Функция должна возвращать сумму элементов с заданными свойствами в массивах или матрицах. Варианты заданий приведены в Табл. 9.1. Проект – консольное приложение.
2.Создать программу, использующую подпрограмму-процедуру. В этом задании подпрограмма должна возвратить и следы матриц. Проект – консольное приложение.
|
Таблица 9.1 - Варианты задания 1 |
||
Что искать |
|
Примечание |
|
|
|
|
|
Суммы ненулевых элементов массивов X(n), Y(m). |
|
Для массива. |
|
|
|
|
|
Суммы положительных элементов массивов X(n), Y(m). |
|
Для массива. |
|
|
|
|
|
194 |
|
|
|
Суммы отрицательных элементов массивов X(n), Y(m). |
Для массива. |
|
|
|
|
Суммы элементов массивов X(n), Y(m). имеющих значения в интервале |
Для массива. |
|
Min…Max. |
||
|
||
|
|
|
Суммы ненулевых элементов матриц X(m,n) и Y(p,q). |
Для |
|
матрицы. |
||
|
||
Суммы положительных элементов матриц X(m,n) и Y(p,q). |
Для |
|
матрицы. |
||
|
||
Суммы отрицательных элементов матриц X(m,n) и Y(p,q). |
Для |
|
матрицы. |
||
|
||
Суммы элементов матриц X(m,n) и Y(p,q), имеющих значения в интервале |
Для |
|
Min…Max. |
матрицы. |
|
|
|
|
Суммы ненулевых элементов каждой строки матрицы X(m,n). |
Для строки. |
|
|
|
|
Суммы положительных элементов каждой строки матрицы X(m,n). |
Для строки. |
|
|
|
|
Суммы отрицательных элементов каждой строки матрицы X(m,n). |
Для строки. |
|
|
|
|
Суммы элементов каждой строки матрицы X(m,n), имеющих значения в |
Для строки. |
|
интервале Min…Max. |
||
|
||
|
|
|
Суммы ненулевых элементов каждого столбца матрицы X(m,n). |
Для столбца. |
|
|
|
|
Суммы положительных элементов каждого столбца матрицы X(m,n). |
Для столбца. |
|
Суммы отрицательных элементов каждого столбца матрицы X(m,n). |
Для столбца. |
|
|
|
|
Суммы элементов каждого столбца матрицы X(m,n), имеющих значения в |
Для столбца. |
|
интервале Min…Max. |
||
|
Пример выполнения Задание 1
Найти след (сумма элементов главной диагонали) квадратных матрицы A[k,k] и B[n,n], где k, n – размеры матриц. Сделаем это с помощью подпрограммы-функции Sled. В программе пользователь по запросу вводит размеры матриц A и B. Затем матрицы заполняются случайными числами с помощью вложенных циклов и функции Random (возвращает случайные вещественные числа в интервале 0..1). Для контроля ввода матрицы выводятся на экран. Далее последовательно для матриц A и B вызывается функция Sled, и вычисленные значения следов матриц A и B выводятся на экран.
Листинг программы |
|
|
|
|
|
program Prg_9_1; |
|
|
|
|
|
{$APPTYPE CONSOLE} |
|
|
|
|
|
uses |
|
|
|
|
|
SysUtils,RusTrans; |
|
|
|
|
|
const |
// Максимальный размер |
матриц |
|
||
Max=40; |
|
||||
type |
|
|
// Тип для |
матрицы |
|
Mas=array[1..Max,1..Max] of Real; |
|||||
var i,j,k,n:Integer; A,B:Mas; Sled1,Sled2:Real; |
|
||||
function Sled(M:Mas; r:Integer):Real; |
// Функция |
||||
var i:Integer; s:Real; |
|
|
|
||
begin |
|
суммы |
|
|
|
s:=0; // Обнуление |
|
|
суммы |
||
for i:=1 to r do s:=s+M[i,i]; // Накопление |
|||||
|
|
195 |
|
|
|
Result:=s;
end; begin
writeln(Rus('Введите размеры матриц не более '),Max); write(Rus('Первая k=')); // Первая матрица
ReadLn(k);
write(Rus('Вторая n=')); // Вторая матрица readln(n);
writeln;
writeln(Rus('Спасибо. Для продолжения нажмите Enter')); writeln;
readln;
Randomize;
for i:=1 to k do// Формирование матрицы A for j:=1 to k do A[i,j]:=0.5-random;
for i:=1 to n do// Формирование матрицы B
for j:=1 to n do B[i,j]:=0.5-random; writeln(Rus('Матрицы
заполнены |
случайными числами')); writeln; |
|
|
||||
for i:=1 to k do// Вывод |
матрицы |
A |
|
|
|||
begin |
|
|
|
|
|
|
|
for j:=1 to k do write(A[i,j]:8:3); |
|
|
|
||||
writeln; |
|
|
|
|
|
|
|
end; |
|
|
|
|
|
|
|
writeln; |
|
|
матрицы |
B |
|
|
|
for i:=1 to n do// Вывод |
|
|
|||||
begin |
|
|
|
|
|
|
|
for j:=1 to n do write(B[i,j]:8:3); |
|
|
|
||||
writeln; |
|
|
|
|
|
|
|
end; |
|
|
|
|
|
|
|
readln; |
|
// Вызов |
функции для |
первой |
матрицы |
||
Sled1:=Sled(A,k); |
|||||||
Sled2:=Sled(B,n); |
// Вызов |
функции для |
второй |
матрицы |
|||
writeln(Rus('Результаты')); |
// Заголовок ответа |
|
|||||
writeln; |
|
|
|
|
|
|
|
writeln('Sled1= ', Sled1:5:2); // Ответы |
|
|
|||||
writeln('Sled2= ', Sled2:5:2); |
|
|
|
|
|||
readln; |
// Ожидание |
Enter |
|
|
|
|
|
end. |
|
|
|
|
|
|
|
Задание 2
Найти сумму всех элементов и след (сумму элементов главной диагонали) квадратных матриц A[k,k] и B[n,n], где k, n – размеры матриц. Сделаем это с помощью подпрограммыпроцедуры Sum_Sled. В отличие от задания 1 в подпрограмме вычисляются два значения
Sum – сумма и Sled - след.
Листинг программы: program Prg_9_2; {$APPTYPE CONSOLE} uses
SysUtils, RusTrans; const
Max=40; |
// Максимальный размер матриц |
|
196 |
type |
// Тип для матрицы |
Mas=array[1..Max,1..Max] of real; |
|
var i,j,k,n:integer; A,B:Mas; |
|
Sum1,Sum2,Sled1,Sled2:real; |
|
procedure Sum_Sled(var Sum,Sled:real;M:Mas; r:integer); //
Процедура |
|
|
|
|
|
|
|
|
var |
|
|
|
|
|
|
|
|
i,j:integer; |
|
|
|
|
|
|
|
|
begin |
// Обнуление |
суммы |
|
|
|
|
||
Sum:=0; |
|
|
|
|
||||
Sled:=0; |
// Обнуление |
следа |
|
|
|
|
|
|
for i:=1 to r do |
|
|
|
|
|
|
|
|
for j:=1 to r do begin |
|
|
|
// Накопление суммы |
||||
Sum:=Sum+M[i,i]; |
|
|
|
|||||
if i=j then Sled:=Sled+M[i,j]; |
// Накопление следа |
|||||||
end; |
|
|
|
|
|
|
|
|
begin |
|
|
|
|
|
|
|
|
end; |
|
|
|
матриц |
не |
более '),Max); |
||
writeln(Rus('Введите размеры |
||||||||
write(Rus('Первая |
k=')); // Первая матрица |
|||||||
readLn(k); |
|
n=')); // Вторая |
матрица |
|||||
write(Rus('Вторая |
||||||||
readln(n); |
|
|
|
|
|
|
|
|
writeln; |
|
|
продолжения |
нажмите Enter')); |
||||
writeln(Rus('Спасибо. Для |
||||||||
writeln; |
|
|
|
|
|
|
|
|
readln; |
|
|
|
|
|
|
|
|
randomize; |
|
|
|
|
матрицы |
A |
||
for i:=1 to k do// Формирование |
||||||||
for j:=1 to k do A[i,j]:=0.5-random; |
|
B |
||||||
for i:=1 to n do// Формирование |
матрицы |
for j:=1 to n do B[i,j]:=0.5-random; writeln(Rus('Матрицы
заполнены случайными числами')); writeln; |
|
||
for i:=1 to k do// Вывод |
матрицы |
A |
|
begin |
|
|
|
for j:=1 to k do write(A[i,j]:8:3); |
|
|
|
writeln; |
|
|
|
end; |
|
|
|
writeln; |
матрицы |
B |
|
for i:=1 to n do// Вывод |
|
||
begin |
|
|
|
for j:=1 to n do write(B[i,j]:8:3); |
|
|
|
writeln; |
|
|
|
end; |
|
|
|
readln; |
|
процедуры для |
матрицы A |
Sum_Sled(Sum1,Sled1,A,k); // Вызов |
|||
Sum_Sled(Sum2,Sled2,B,n); // Вызов |
процедуры для |
матрицы B |
writeln(Rus('Результаты')); |
// Заголовок ответа |
writeln; |
|
writeln('Sum1=',Sum1:5:2,' Sled1= ', Sled1:5:2); writeln('Sum2=',Sum2:5:2,' Sled2= ', Sled2:5:2);
197
readln; |
// Ожидание Enter |
end. |
|
Выводы
1.Для упрощения программ используются подпрограммы. При их многократном использовании код вводится один раз.
2.Доступны два вида подпрограмм – функции и процедуры. Функция возвращает одно значение, процедура – ни одного или несколько.
3.Процедура вызывается по имени (со списком фактических параметров) в строке кода программы.
4.Функция вызывается по имени (со списком фактических параметров) в выражениях. При установленной опции расширенного синтаксиса функцию можно вызывать, как процедуру. При этом значение, возвращаемое функцией, игнорируется.
5.В подпрограмму могут передаваться параметры-значения, параметры-переменные (со словом var, это адреса с возможностью чтения/записи), параметры-константы (со словом const, это адреса с возможностью только чтения), пара- метры-выходные (со словом out, это адреса с возможностью только записи).
11. Динамическая память
Подготовка к работе
1.По рекомендуемой литературе изучить:
назначение динамической памяти,
назначение и свойства указателей,
операции с динамическими структурами,
фрагментацию данных в динамической памяти.
2.Составить программы решения задач.
Контрольные вопросы
1.Что такое динамическая память?
2.Назначение и свойства указателей.
3.Типизированные указатели.
4.Указатель Pointer.
5.Процедура выделения New(p) динамической памяти для типизированных структур.
6.Процедура освобождения Dispose(p) динамической памяти для типизированных структур.
7.Процедура выделения GetMem(p,size) динамической памяти для структур произвольного размера.
8.Процедура освобождения FreeMem(p,size) динамической памяти для структур произвольного размера.
Задание к работе
1.Программа демонстрации работы с типизированными динамическими структурами. Создать динамические структуры ds1 и ds2, выполнить над ними операцию op, после чего освободить память для указанных структур в порядке, обратном выделению. Проект – консольное приложение.
2.Программа скоростного копирования файла произвольного размера (файл prg_8_1.exe) из папки 08_01 в папку 10_02 с использованием ДП и процедур
GetMem и FreeMem.
Варианты заданий представлены в табл. 11.1.
Таблица 11.1 - Варианты заданий
198
ds1 |
ds2 |
op |
Word |
Real |
сложение |
Real |
Integer |
умножение |
Integer |
byte |
вычитание |
byte |
Word |
деление |
Word |
Real |
сложение |
Real |
Integer |
умножение |
Integer |
byte |
вычитание |
byte |
Word |
деление |
Real |
Real |
сложение |
Integer |
Integer |
умножение |
byte |
byte |
вычитание |
Word |
Word |
деление |
Real |
Real |
сложение |
Integer |
Integer |
умножение |
byte |
byte |
вычитание |
Пример выполнения Задание 1
Создать динамические структуры типов byte и word, выполнить над ними операцию сложения, после чего освободить память для указанных структур в порядке, обратном выделению. Проект – консольное приложение.
Листинг программы: |
|
|
|
|
||
program Prg_10_1; |
|
|
|
|
||
{$APPTYPE CONSOLE} |
|
|
|
|
||
uses |
|
|
|
|
|
|
SysUtils,RusTrans; |
|
|
|
|
||
const |
|
//Указатели с |
инициализацией |
|||
p1:^Byte=Nil; |
||||||
p2:^Word=Nil; |
|
|
|
|
|
|
var |
|
|
|
|
|
|
Result:real; |
|
|
|
|
|
|
begin |
|
|
p1')); |
|
|
|
writeln(Rus('Объект |
p1 |
|
||||
new(p1); |
// Выделить |
ДП под |
|
|||
writeln(Rus(' |
Размер p1='),SizeOf(p1)); |
|||||
writeln(Rus(' |
Размер p1^='),SizeOf(p1^)); |
|||||
writeln(Rus('Объект |
p2')); |
p2 |
|
|||
new(p2); |
// Выделить |
ДП под |
|
|||
writeln(Rus(' |
Размер p2='),SizeOf(p2)); |
|||||
writeln(Rus(' |
Размер p2^='),SizeOf(p2^)); |
|||||
writeln; |
|
|
операнды')); |
|
||
writeln(Rus('Введите |
|
|||||
write(' |
a='); |
//ПРисвоить значение |
р1 |
|||
readln(p1^); |
||||||
write(' |
b='); |
//ПРисвоить значение |
р2 |
|||
readln(p2^); |
||||||
Result:=p1^+p2^;//Операция с |
р1 и |
р2} |
||||
writeln('p1^=',p1^); |
|
|
|
|
||
writeln('p2^=',p2^); |
|
|
|
|
writeln(Rus('Результат операции = '),Result:5:2); readln;
Dispose(p2); |
//Освободить ДП под |
р2 |
|
199 |
|
p2:=Nil; |
//Освободить ДП под |
р1 |
|
Dispose(p1); |
|
||
p1:=Nil; writeln; write('p1='); |
|
пуст |
|
if p1=Nil then writeln('Nil'); // Указатель p2 |
|||
write('p2='); |
|
|
пуст |
if p2=Nil then writeln('Nil'); // Указатель p2 |
|||
readln; |
|
|
|
end. |
|
|
|
Задание 2 |
|
|
|
Программа скоростного копирования файла произвольного размера (файл prg_8_1.exe) из папки 08_01 в папку 10_02 с использованием ДП и процедур GetMem и FreeMem.
Листинг программы: |
|
|
|
|
|
|
|
program Prg_10_2; |
|
|
|
|
|
|
|
{$APPTYPE CONSOLE} |
|
|
|
|
|
|
|
uses |
|
|
|
|
|
|
|
SysUtils,RusTrans; |
FileDir1='c:\users\PO_11\Ivanov\08_1\'; |
||||||
const |
|||||||
FileDir2='c:\users\PO_11\Ivanov\10_2\'; |
|
|
|
|
|||
var |
|
// |
Файловые |
|
|
|
|
InFile,OutFile:file; |
к |
|
|
||||
FilePath1,FilePath2:str |
// |
Пути |
|
|
|
||
Size:Integer; |
|
// |
Число |
|
ДП |
|
|
Buffer:PChar; |
|
// |
Буфер в |
|
|
||
begin |
|
|
Путь |
к |
файлу источнику |
||
FilePath1:=FileDir1+'prg_8 |
|
||||||
AssignFile(InFile,FilePath |
|
Связь |
к |
с |
файлом |
||
FilePath2:=FileDir2+'prg_8 |
|
Путь |
файлу приемнику |
||||
AssignFile(OutFile,FilePat |
|
Связь |
|
с |
файлом |
||
Reset(InFile); |
|
|
Открыть |
InFile |
|
|
|
Rewrite(OutFile); |
|
|
Создать OutFile |
(по |
128 |
||
Size:=FileSize(InFile); |
|
Число |
записей |
||||
writeln(Rus('Размер |
входного |
файла = '),Size); |
Buffer |
(в |
|||
GetMem(Buffer,Size*128); // |
Выделить в |
|
ДП |
||||
байтах) |
|
= '),SizeOf(Buffer), |
|
|
|||
writeln(Rus('Размер буфера |
|
|
|||||
Rus(' блока по 128 байт')); |
|
|
|
|
|
|
|
readln; |
|
|
Копирование из |
Infile |
в |
||
BlockRead(InFile,Buffer^,Size);// |
|||||||
Buffer |
|
|
|
|
|
|
|
BlockWrite(OutFile,Buffer^,Size); // Копирование из Buffer
в OutFile |
|
завершено')); |
|
|
|
writeln(Rus('Копирование |
файла |
= |
|||
writeln(Rus('Размер |
выходного |
||||
'),FileSize(OutFile)); |
|
|
|
|
|
readln; |
|
|
|
|
|
FreeMem(Buffer);// Освободить Buffer |
|
|
|
||
Buffer:=Nil; |
// Сделать Buffer пустым |
|
|
|
|
Write(Rus('Буфер=')); |
|
|
|
|
|
if Buffer=Nil then writeln('Nil') |
|
// |
Закрыть |
||
else writeln(Rus('Ошибка')); CloseFile(InFile); |
|||||
файлы |
|
|
|
|
|
|
|
200 |
|
|
|