Вы находитесь на странице: 1из 37

Министерство науки и высшего образования РФ

ФГБОУ ВО «Тульский государственный университет»

КАФЕДРА ИНФОРМАЦИОННОЙ БЕЗОПАСНОСТИ

ДИНАМИЧЕСКИЕ ПЕРЕМЕННЫЕ

отчет по

лабораторной работе №6

по дисциплине

ПРОГРАММИРОВАНИЕ

ВАРИАНТ 17

Выполнил: ст.гр.220401 Шарапов А.В.

Проверил: к.ф.-м.н., доц.каф. ИБ Середин О.С.

Тула, 2021 г.
Цель и задача работы
Изучить указатели, научиться создавать, использовать и уничтожать
динамические переменные.
В данной работе требуется реализовать:
а) лабораторную работу номер 11 «Файлы. Работа с текстом» с помощью
динамических переменных, т.е. сначала из файла считываются все данные в
память (динамический сегмент, кучу), обрабатываются и затем результат
записывается в файл;
б) лабораторную работу номер 6 «Многомерные массивы» с помощью
динамических переменных.
Продемонстрировать знание различных схем работы с памятью:
NEW – DISPOSE, GETMEM – FREEMEM, SETLENGTH с параметром-
открытым массивом. Написать 6 демонстративных программ.

Задание на работу
1) Удалить из текста все последующие вхождения первой буквы.
2) Вычислить сумму элементов матрицы (выделены символом X).
X X
X X X X
X X X X X X
X X X X X X X
X X X X X X
X X X X
X X

Теоретическая справка
____________________________________________________________________
____________________________________________________________________
2
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________

3
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Текст программы 1

4
Ниже представлен текст программы на языке программирования Free
Pascal 3.2.0 для удаления из текста всех последующих вхождений первой буквы
с использованием схемы работы с памятью NEW – DISPOSE.
program lab6_1;
uses crt; //подключение модуля для работы с консолью
Type DynamicType = ^Text; //создание пользовательского типа данных
«ссылка»
//подпрограмма для ввода названия файла для считывания текста
Procedure Input(var loadText:DynamicType);
var
code: integer; //переменная для проверки подключения файла
fileName: string; //строка для ввода названия файла
begin
repeat
write('Введите имя файла(Учитывая формат файла): ');
readln(fileName);
Assign(loadText^, fileName);
{$I-};
Reset(loadText^);
code := IOresult;
if (code <> 0) or (fileName = 'output.txt') then writeln('Файл не
найден. Попробуйте снова.');
until (code=0) and (fileName <> 'output.txt');
end;
//подпрограмма для считывания текста из текстового файла в файл прямого
доступа
Procedure formatFile(var loadText:DynamicType; var otherFile: File);
var
i: integer; //счётчик цикла
storageText: string; //строка для хранения считанного текста
begin
reset(loadText^);
while not EOF(loadText^) do readln(loadText^,storageText);
close(loadText^);
Assign(otherFile,'output.txt');
rewrite(otherFile, 1);
for i := 1 to length(storageText) do BlockWrite(otherFile,
storageText[i],1);
writeln('Исходный текст'); writeln;
writeln(storageText);
close(otherFile);
end;
//подпрограмма, удаляющая из текста все последующие вхождения первой
буквы
Procedure deleteChars(var otherFile:File; var storageText:string);
var
temp:char; //переменная, для временного хранения считанного символа
firstChar:char; //переменная, для хранения первого символа текста
begin
storageText:='';
reset(otherFile, 1);
BlockRead(otherFile, temp, 1);
firstChar := temp;
while not EOF(otherFile) do
begin
BlockRead(otherFile, temp, 1);
5
if UpCase(temp) = UpCase(firstChar) then continue
else storageText:=storageText+temp;
end;
insert(firstChar,storageText,1);
close(otherFile);
end;
//подпрограмма для создания копии файла
Procedure copyFile(var otherFile:File);
var
temp:char; //переменная для временного хранения считанного символа
newFile:file; //копия файла
begin
assign(newFile,'copy');
reset(otherFile,1);
rewrite(newFile,1);
while not EOF(otherFile) do
begin
BlockRead(otherFile,temp,1);
write(temp);
BlockWrite(newFile, temp, 1);
end;
writeln;
end;
//подпрограмма для вывода результата пользователю и сохранения его в файл
Procedure Output(var otherFile:File; var storageText:string);
var
i:integer; //счётчик цикла
begin
rewrite(otherFile,1);
for i:= 1 to length(storageText) do BlockWrite(otherFile,
storageText[i],1);
close(otherFile);
writeln;
writeln('Результат работы программы показан ниже.');
writeln;
copyFile(otherFile); //копирование результата в бестиповой файл
writeln;
writeln('Также результат записан в файл output.txt. Файл с результатами
скопирован в бестиповой файл copy.');
end;
//основная часть программы
var
loadText:DynamicType; //подключаемый текстовый файл
otherFile:File; //файл для записи преобразованного текста
storageText:string; //строка для хранения преобразованного текста
key:char; переменная, хранящая код нажатой на клавиатуре клавиши
begin
repeat
clrscr;
writeln('Программа предназначена для удаления из текста всех
последующих вхождений первой буквы.');
New(loadText); //создание динамической переменной
Input(loadText); //ввод названия файла
formatFile(loadText, otherFile); //считывание текста из текстового
файла в файл прямого доступа
deleteChars(otherFile,storageText); //удаление из текста всех
последующих вхождений первой буквы
Output(otherFile,storageText); //вывод и сохранение результата
преобразованного текста в файл
6
Dispose(loadText); //освобождение места, занятого динамической
переменной в памяти
WriteLn('Нажмите Пробел, для повторного ввода данных.');
WriteLn('Нажмите Esc, чтобы закрыть программу.');
repeat
key := readkey;
If key = #32 then break
else if key = #27 then halt
else WriteLn('Ошибка');
until key = #32;
until key = #27;
end.
Ниже представлен текст программы на языке программирования Free
Pascal 3.2.0 для удаления из текста всех последующих вхождений первой буквы
с использованием схемы работы с памятью GETMEM – FREEMEM.
program lab6_2;
uses crt; //подключение модуля для работы с консолью
type DynamicType = ^Text; //создание пользовательского типа данных
«ссылка»
//подпрограмма для ввода названия файла для считывания текста
Procedure Input(var loadText:DynamicType);
var
code: integer; //переменная для проверки подключения файла
fileName: string; //строка для ввода названия файла
begin
repeat
write('Введите имя файла(Учитывая формат файла): ');
readln(fileName);
Assign(loadText^, fileName);
{$I-};
Reset(loadText^);
code := IOresult;
if (code <> 0) or (fileName = 'output.txt') then writeln('Файл не
найден. Попробуйте снова.');
until (code=0) and (fileName <> 'output.txt');
end;
//подпрограмма для считывания текста из текстового файла в файл прямого
доступа
Procedure formatFile(var loadText:DynamicType; var otherFile: File);
var
i: integer; //счётчик цикла
storageText: string; //строка для хранения считанного текста
begin
reset(loadText^);
while not EOF(loadText^) do readln(loadText^,storageText);
Assign(otherFile,'output.txt');
rewrite(otherFile, 1);
for i := 1 to length(storageText) do BlockWrite(otherFile,
storageText[i],1);
writeln('Исходный текст');
writeln;
writeln(storageText);
close(otherFile);
close(loadText^);
end;

7
//подпрограмма для удаления из текста всех последующих вхождений первой
буквы
Procedure deleteChars(var otherFile:File; var storageText:string);
var
temp:char; //переменная для временного хранения считанного символа
firstChar:char; //переменная для хранения первого символа в тексте
begin
storageText:='';
reset(otherFile, 1);
BlockRead(otherFile, temp, 1);
firstChar := temp;
while not EOF(otherFile) do
begin
BlockRead(otherFile, temp, 1);
if UpCase(temp) = UpCase(firstChar) then continue
else storageText:=storageText+temp;
end;
insert(firstChar,storageText,1);
close(otherFile);
end;
//подпрограмма для создания копии файла
Procedure copyFile(var otherFile:File);
var
temp:char; //переменная для временного хранения считанного символа
newFile:file; //копия файла
begin
assign(newFile,'copy');
reset(otherFile,1);
rewrite(newFile,1);
while not EOF(otherFile) do
begin
BlockRead(otherFile,temp,1);
write(temp);
BlockWrite(newFile, temp, 1);
end;
writeln;
end;
//подпрограмма для вывода результата пользователю и сохранения его в файл
Procedure Output(var otherFile:File; var storageText:string);
var
i:integer; //счётчик цикла
begin
rewrite(otherFile,1);
for i:= 1 to length(storageText) do BlockWrite(otherFile,
storageText[i],1);
close(otherFile);
writeln;
writeln('Результат работы программы показан ниже.');
writeln;
copyFile(otherFile); //копирование результата в бестиповой файл
writeln;
writeln('Также результат записан в файл output.txt. Файл с результатами
скопирован в бестиповой файл copy.');
end;

//основная часть программы


var
loadText:DynamicType; //подключаемый текстовый файл
otherFile:File; //файл для записи преобразованного текста
8
storageText:string; //строка для хранения преобразованного текста
key:char; //переменная, хранящая код нажатой на клавиатуре клавиши
begin
repeat
clrscr;
writeln('Программа предназначена для удаления из текста всех
последующих вхождений первой буквы.');
getmem(loadText, length(storageText)); //создание динамической
переменной
Input(loadText); //ввод названия файла
formatFile(loadText, otherFile); //считывание текста из текстового
файла в файл прямого доступа
freemem(loadText, length(storageText)); //уничтожение динамической
переменной
deleteChars(otherFile,storageText); //удаление из текста всех
последующих вхождений первой буквы
Output(otherFile,storageText); //вывод результата пользователю и
сохранение его в файл
WriteLn('Нажмите Пробел, для повторного ввода данных.');
WriteLn('Нажмите Esc, чтобы закрыть программу.');
repeat
key := readkey;
If key = #32 then break
else if key = #27 then halt
else WriteLn('Ошибка');
until key = #32;
until key = #27;
end.
Ниже представлен текст программы на языке программирования Free
Pascal 3.2.0 для удаления из текста всех последующих вхождений первой буквы
с использованием схемы работы с памятью SETLENGTH с параметром-
открытым массивом.
program lab6_3;
uses crt; //подключение модуля для работы с консолью
type DynamicType = Array of char;
//подпрограмма для ввода названия файла
Procedure Input(var loadText:file);
var
code: integer; //переменная для проверки подключения файла
fileName: string; //строка для ввода названия файла
begin
repeat
write('Введите имя файла(Учитывая формат файла): ');
readln(fileName);
Assign(loadText, fileName);
{$I-};
Reset(loadText);
code := IOresult;
if (code <> 0) or (fileName = 'output.txt') then writeln('Файл не
найден. Попробуйте снова.');
until (code=0) and (fileName <> 'output.txt');
end;
//подпрограмма для считывания текста из текстового файла в файл прямого
доступа
Procedure formatFile(var loadText:file; var otherFile: DynamicType);
9
var
i: integer; //счётчик цикла
temp: char; //переменная для временного хранения считанного текста
storageText: string; //строка для хранения считанного текста
begin
reset(loadText,1);
while not EOF(loadText) do
begin
BlockRead(loadText, temp, 1);
storageText := storageText + temp;
end;
setlength(otherFile, length(storageText)); //задание размера
динамического массива из символов
for i := 1 to length(storageText) do otherFile[i] := storageText[i];
writeln('Исходный текст'); writeln;
writeln(storageText);
close(loadText);
end;
//подпрограмма для удаления из текста всех последующих вхождений первой
буквы
Procedure deleteChars(var otherFile:DynamicType; var storageText:string);
var
i,k:integer; //счётчики цикла
firstChar:char; //переменная, для хранения первого символа текста
begin
storageText:='';
i := 1;
k := 1;
firstChar := otherFile[1];
repeat
if UpCase(otherFile[i]) <> UpCase(firstChar) then
begin
storageText := storageText + otherFile[i];
inc(k);
end;
inc(i);
until i > length(otherFile);
insert(firstChar,storageText,1);
setlength(otherFile,length(storageText)); //задание размера массива из
символов
for i := 1 to length(storageText) do otherFile[i] := storageText[i]
end;
//подпрограмма для создания копии файла
Procedure copyFile(var otherFile:DynamicType);
var
i:integer; //счётчик цикла
temp:char; //переменная для временного хранения считанного символа
newFile:file; //копия файла
begin
assign(newFile,'copy');
rewrite(newFile,1);
for i := 1 to length(otherFile) do
begin
BlockWrite(newFile, otherFile[i], 1);
write(otherFile[i]);
end;
writeln;
end;
//подпрограмма для вывода результата пользователю и сохранения его в файл
10
Procedure Output(var otherFile:DynamicType);
var
i:integer; //счётчик цикла
outFile:file; //файловая переменная для назначения имени
begin
assign(outFile, 'output.txt');
rewrite(outFile,1);
for i:= 1 to length(otherFile) do BlockWrite(outFile, otherFile[i],1);
close(outFile);
writeln;
writeln('Результат работы программы показан ниже.');
writeln;
copyFile(otherFile);
writeln;
writeln('Также результат записан в файл output.txt. Файл с результатами
скопирован в бестиповой файл copy.');
end;
//основная часть программы
var
loadText:file; //подключаемый файл с текстом
otherFile:DynamicType; //массив для записи преобразованного текста
storageText:string; //строка для хранения преобразованного текста
key:char; //переменная, хранящая код нажатой на клавиатуре клавиши
begin
repeat
clrscr;
writeln('Программа предназначена для удаления из текста всех
последующих вхождений первой буквы.');
Input(loadText); //ввод названия файла
formatFile(loadText, otherFile); //считывание текста из текстового
файла в символьный массив
deleteChars(otherFile, storageText); //удаление из текста всех
последующих вхождений первой буквы
Output(otherFile); //вывод результата пользователю и сохранение его в
файл
WriteLn('Нажмите Пробел, для повторного ввода данных.');
WriteLn('Нажмите Esc, чтобы закрыть программу.');
repeat
key := readkey;
If key = #32 then break
else if key = #27 then halt
else WriteLn('Ошибка');
until key = #32;
until key = #27;
end.

Инструкция пользователя 1
Данная программа предназначена для удаления из текста всех
последующих вхождений первой буквы.

11
При запуске программы появляется приветственное сообщение с
предназначением программы и запрос на ввод названия файла с текстом. Если
пользователь введёт название несуществующего файла, то выведется ошибка и
пользователю необходимо ввести название заново, это продолжится до тех пор,
пока не будет введено название существующего. Названия файлов нужно
указывать вместе с типом файла(Название.txt).
После этого произойдёт копирование данных из подгруженного файла в
файл прямого доступа output.txt. Далее производится удаление из текста всех
последующих вхождений первой буквы и результат записывается в файл
output.txt. Данные из этого файла копируются в бестиповой файл с названием
copy. Пользователю выводится подсказка с местонахождением обработанного
текста.

Инструкция программиста 1
Программа предназначена для удаления из текста всех последующих
вхождений первой буквы.
Объявлены следующие типы данных:
1) Программа lab6_1:
DynamicType = ^Text
2) Программа lab6_2:
DynamicType = ^Text
3) Программа lab6_3:
DynamicType = Array of Char
Cтруктуры данных, используемых в основной программе lab6_1,
приведены в таблице 1.1.  

Таблица 1.1  Структуры данных, используемых в основной программе lab6_1


имя тип предназначение
loadText DynamicType Подключаемый текстовый файл
otherFile File Файл для записи преобразованного текста

12
storageText String Строка для хранения считанного текста
key Char Переменная для определения кода клавиши
клавиатуры

Cтруктуры данных, используемых в основной программе lab6_2,


приведены в таблице 1.2.  
Таблица 1.2  Структуры данных, используемых в основной программе lab6_2
имя тип предназначение
loadText DynamicType Подключаемый текстовый файл
otherFile File Файл для записи преобразованного текста
storageText String Строка для хранения считанного текста
key Char Переменная для определения кода клавиши
клавиатуры

Cтруктуры данных, используемых в основной программе lab6_3,


приведены в таблице 1.3.  
Таблица 1.3  Структуры данных, используемых в основной программе lab6_3
имя тип предназначение
loadText File Подключаемый текстовый файл
otherFile DynamicType Массив для записи преобразованного текста
storageText String Строка для хранения считанного текста
key Char Переменная для определения кода клавиши
клавиатуры

Программа lab6_1 разбита на 5 подпрограмм:


1) Procedure Input (var loadText: DynamicType) – подпрограмма для ввода
названия файла и считывания текста из этого файла. Выход из подпрограммы
осуществляется только в том случае, если введено название существующего
файла, в противном случае осуществляется повторный ввод.
Структуры данных, используемых в подпрограмме Input, приведены в
таблице 2.1.

Таблица 2.1 – Структуры данных, используемых в подпрограмме Input


имя тип предназначение
Формальные параметры
loadText DynamicType Текстовый файл для дальнейшего считывания
13
Локальные переменные
code Integer Параметр для проверки подключения файла
fileName String Строка для ввода названия файла

2) Procedure formatFile (var loadText: DynamicType; var otherFile: File) –


подпрограмма для считывания данных из текстового файла в файл прямого
доступа.
Структуры данных, используемых в подпрограмме formatFile приведены
в таблице 2.2.
Таблица 2.2 – Структуры данных, используемых в подпрограмме formatFile
имя тип предназначение
Формальные параметры
loadText DynamicType Текстовый файл, из которого считываются данные
otherFile File Файл прямого доступа для записи преобразованного
текста
Локальные переменные
i Integer Счётчик цикла
storageText String Строка для хранения считанного текста

3) Procedure deleteChars (var otherFile: File; var storageText: string) –


подпрограмма для удаления из текста всех последующих вхождений первой
буквы.
Структура данных, используемых в подпрограмме deleteChars, приведены
в таблице 2.3.
Таблица 2.3 – Структуры данных, используемых в подпрограмме deleteChars
имя тип предназначение
Формальные параметры
otherFile File Файл прямого доступа для записи преобразованного
текста
storageText String Строка, для хранения преобразованного текста
Локальные переменные
temp Char Переменная для временного хранения считанного
символа
firstChar Char Переменная для хранения первого символа
считанного текста

4) Procedure copyFile (var otherFile: File) – подпрограмма для создания


копии файла.

14
Структура данных, используемых в подпрограмме copyFile, приведены в
таблице 2.4.
Таблица 2.4 – Структуры данных, используемых в подпрограмме copyFile
имя тип предназначение
Формальные параметры
otherFile File Файл с результатом работы программы,
который необходимо скопировать
Локальные переменные
temp Char Переменная для временного хранения
считанного символа
newFile File Копия исходного файла

5) Procedure Output (var otherFile: File; var storageText: string) –


подпрограмма для сохранения преобразованного текста в файл.
Структура данных, используемых в подпрограмме Output приведены в
таблице 2.5.
Таблица 2.5 – Структуры данных, используемых в подпрограмме Output
имя тип предназначение
Формальные параметры
otherFile File Файл для записи результата
storageText String Преобразованный текст
Локальные параметры
i Integer Счётчик цикла

Программа lab6_2 разбита на 5 подпрограмм:


1) Procedure Input (var loadText: DynamicType) – подпрограмма для ввода
названия файла и считывания текста из этого файла. Выход из подпрограммы
осуществляется только в том случае, если введено название существующего
файла, в противном случае осуществляется повторный ввод.
Структуры данных, используемых в подпрограмме Input, приведены в
таблице 3.1.

Таблица 3.1 – Структуры данных, используемых в подпрограмме Input


имя тип предназначение
Формальные параметры
loadText DynamicType Текстовый файл для дальнейшего считывания
15
Локальные переменные
code Integer Параметр для проверки подключения файла
fileName String Строка для ввода названия файла

2) Procedure formatFile (var loadText: DynamicType; var otherFile: File) –


подпрограмма для считывания данных из текстового файла в файл прямого
доступа.
Структуры данных, используемых в подпрограмме formatFile приведены
в таблице 3.2.
Таблица 3.2 – Структуры данных, используемых в подпрограмме formatFile
имя тип предназначение
Формальные параметры
loadText DynamicType Текстовый файл, из которого считываются данные
otherFile File Файл прямого доступа для записи преобразованного
текста
Локальные переменные
i Integer Счётчик цикла
storageText String Строка для хранения считанного текста

3) Procedure deleteChars (var otherFile: File; var storageText: string) –


подпрограмма для удаления из текста всех последующих вхождений первой
буквы.
Структура данных, используемых в подпрограмме deleteChars, приведены
в таблице 3.3.
Таблица 3.3 – Структуры данных, используемых в подпрограмме deleteChars
имя тип предназначение
Формальные параметры
otherFile File Файл прямого доступа для записи преобразованного
текста
storageText String Строка, для хранения преобразованного текста
Локальные переменные
temp Char Переменная для временного хранения считанного
символа
firstChar Char Переменная для хранения первого символа
считанного текста

4) Procedure copyFile (var otherFile: File) – подпрограмма для создания


копии файла.

16
Структура данных, используемых в подпрограмме copyFile, приведены в
таблице 3.4.
Таблица 3.4 – Структуры данных, используемых в подпрограмме copyFile
имя тип предназначение
Формальные параметры
otherFile File Файл с результатом работы программы,
который необходимо скопировать
Локальные переменные
temp Char Переменная для временного хранения
считанного символа
newFile File Копия исходного файла

5) Procedure Output (var otherFile: File; var storageText: string) –


подпрограмма для сохранения преобразованного текста в файл.
Структура данных, используемых в подпрограмме Output приведены в
таблице 3.5.
Таблица 3.5 – Структуры данных, используемых в подпрограмме Output
имя тип предназначение
Формальные параметры
otherFile DynamicType Файл для записи результата
storageText String Преобразованный текст
Локальные параметры
i Integer Счётчик цикла

Программа lab6_3 разбита на 5 подпрограмм:


1) Procedure Input (var loadText: file) – подпрограмма для ввода названия
файла и считывания текста из этого файла. Выход из подпрограммы
осуществляется только в том случае, если введено название существующего
файла, в противном случае осуществляется повторный ввод.
Структуры данных, используемых в подпрограмме Input, приведены в
таблице 4.1.

Таблица 4.1 – Структуры данных, используемых в подпрограмме Input


имя тип предназначение
Формальные параметры
loadText File Текстовый файл для дальнейшего считывания
17
Локальные переменные
code Integer Параметр для проверки подключения файла
fileName String Строка для ввода названия файла

2) Procedure formatFile (var loadText:file; var otherFile: DynamicType) –


подпрограмма для считывания данных из текстового файла в файл прямого
доступа.
Структуры данных, используемых в подпрограмме formatFile приведены
в таблице 4.2.
Таблица 4.2 – Структуры данных, используемых в подпрограмме formatFile
имя тип предназначение
Формальные параметры
loadText File Текстовый файл, из которого считываются данные
otherFile DynamicType Файл прямого доступа для записи преобразованного
текста
Локальные переменные
i Integer Счётчик цикла
temp Char Переменная для временного хранения считанного
символа
storageText String Строка для хранения считанного текста

3) Procedure deleteChars (var otherFile: DynamicType; var storageText:


string) – подпрограмма для удаления из текста всех последующих вхождений
первой буквы.
Структура данных, используемых в подпрограмме deleteChars, приведены
в таблице 4.3.
Таблица 4.3 – Структуры данных, используемых в подпрограмме deleteChars
имя тип предназначение
Формальные параметры
otherFile DynamicType Файл прямого доступа для записи преобразованного
текста
storageText String Строка, для хранения преобразованного текста
Локальные переменные
i Integer Счётчик
k Integer Счётчик
firstChar Char Переменная для хранения первого символа
считанного текста

4) Procedure copyFile (var otherFile: DynamicType) – подпрограмма для


создания копии файла.

18
Структура данных, используемых в подпрограмме copyFile, приведены в
таблице 4.4.
Таблица 4.4 – Структуры данных, используемых в подпрограмме copyFile
имя тип предназначение
Формальные параметры
otherFile DynamicType Файл с результатом работы программы,
который необходимо скопировать
Локальные переменные
i Integer Счётчик
temp Char Переменная для временного хранения
считанного символа
newFile File Копия исходного файла

5) Procedure Output (var otherFile: DynamicType) – подпрограмма для


сохранения преобразованного текста в файл.
Структура данных, используемых в подпрограмме Output приведены в
таблице 4.5.
Таблица 4.5 – Структуры данных, используемых в подпрограмме Output
имя тип предназначение
Формальные параметры
otherFile DynamicType Файл для записи результата
Локальные параметры
i Integer Счётчик цикла
outFile File Файл, хранящий результат работы
программы

Тестовые примеры 1

19
На рисунке 1.1 изображен первый тестовый пример работы программы,
выполняющей удаление из текста всех последующих вхождений первой буквы
с использованием различных схем работы с памятью: NEW – DISPOSE,
GETMEM – FREEMEM, SETLENGTH.

Рисунок 1.1 – Первый тестовый пример работы программы для удаления из текста всех
последующих вхождений первой буквы

На рисунке 1.2 изображен второй тестовый пример работы программы,


выполняющей удаление из текста всех последующих вхождений первой буквы
с использованием различных схем работы с памятью: NEW – DISPOSE,
GETMEM – FREEMEM, SETLENGTH.

Рисунок 1.2 – Второй тестовый пример работы программы для удаления из текста всех
последующих вхождений первой буквы

Схема алгоритма 2
20
На рисунке 2.1 представлена схема алгоритма программы, которая
вычисляет сумму элементов матрицы, выделенных символом Х.
1
Начало

2
Приветствие Программа для вычисления суммы элементов матрицы,
выделенных символом Х.

3
generateMat
rix(sizeMat Ввод размера матрицы и заполнение её случайными числами
rix,
Matrix)

4
Output(size
Matrix,sum, Вычисление суммы и вывод результата
Matrix)

key:=readkey;
Цикл для возможности повторного ввода данных
нажатием клавиши пробел, или выхода из программы
нажатием клавиши «Esc»

8
6
Да
key:=#32 µОшибка¶

Нет

7
Нет
key:=#27

Да
9
Конец

Рисунок 2.1 – Схема алгоритма вычисления суммы элементов матрицы,


выделенных символом Х

На рисунке 2.2 представлена схема алгоритма для ввода размера матрицы


и заполнение её случайными числами.

21
Ввод размера матрицы и заполнение её случайными
1 числами
Вход
procedure generateMatrix (var sizeMatrix:Integer; var
Matrix:DefaultArray);

2 Локальные переменные:
µВведите i,j: integer - Счётчики цикла
размер
матрицы: µ

str

6
4
val(str, µОшибка¶
sizeMatrix,
code)

5
Да
code < > 0

Нет
7
i:=1 to
Нет
sizeMat
rix

Да
8
j:=1 to
Нет
sizeMat
rix

Да
9
Matrix[i,j]
:=
random(10);

10
Выход
Р
исунок 2.2 – Схема алгоритма ввода размера матрицы и заполнение её
случайными числами

На рисунке 2.3 представлена схема алгоритма для вычисления суммы


элементов матрицы, выделенных символом Х.

22
1
Вычисление суммы элементов матрицы
Вход

procedure Calc (var sizeMatrix, sum:integer; var


2 Matrix: DefaultArray)

Sum := 0
локальные переменные:
i,j: integer – счетчик цикла

3
i:=1 to Нет
sizeMat
rix

Да
4

Нет j:=1 to
sizeMat
rix

Да

5 (i in
[j..sizeMatrix-
j+1]) or (i in Нет
[sizeMatrix-
j+1..j])

Да
6

sum:=sum+Matrix
[i,j]

Textcolor(1
0)

Matrix[i,j]:4

9
Выход

Рисунок 2.3 – Схема алгоритма вычисления суммы элементов матрицы,


выделенных символом Х

23
На рисунке 2.4 представлена схема алгоритма для вычисления и вывода
результата пользователю.
1 Вычисление и вывод результата пользователю
Вход
Procedure Output (var sizeMatrix, sum:integer, var
Matrix:DefaultArray)
2
Calc(sizeMa
trix, sum,
Matrix)

µСумма = µ, sum

4
Выход

Рисунок 2.4 – Схема алгоритма вывода результата пользователю

24
Текст программы 2
Ниже представлен текст программы на языке программирования Free
Pascal 3.2.0 для вычисления суммы элементов матрицы, выделенных символом
Х с использованием схемы работы с памятью NEW – DISPOSE.
Program lab6_4;
uses crt; //подключение модуля для работы с консолью
type //задание пользовательских типов
DefaultArray = array of array of integer;
DynamicType = ^DefaultArray;
//подпрограмма для ввода размера матрицы и заполнение её случайными
числами
Procedure generateMatrix(var sizeMatrix:integer; var Matrix:DynamicType);
var
i,j:integer; //счётчики цикла
str:string; //строка для ввода размера матрицы
code:integer; //проверка ввода корректного значения
begin
randomize;
write('Введите размер матрицы: ');
readln(str);
val(str, sizeMatrix, code);
while (code<>0) or (sizeMatrix < 0) do
begin
writeln(‘Ошибка. Введено некорректное значение.’);
write(‘Введите размер матрицы: ‘);
readln(str);
val(str, sizeMatrix, code);
end;
setlength(Matrix^, sizeMatrix+1, sizeMatrix+1);
for i:=1 to sizeMatrix do
for j:=1 to sizeMatrix do
Matrix^[i,j]:=random(10);
end;
//подпрограмма для вычисления суммы элементов матрицы, выделенных
символом Х
Procedure Calc(var sizeMatrix,sum:integer; var Matrix:DynamicType);
var
i,j:integer; //счётчики цикла
begin
sum := 0;
writeln('Матрица:');
for i:=1 to sizeMatrix do
begin
for j:=1 to sizeMatrix do
begin
if (i in [j..sizeMatrix-j+1]) or (i in [sizeMatrix-j+1..j]) then
begin
textcolor(10);
sum:=sum+Matrix^[i,j];
end
else textcolor(15);
write(Matrix^[i,j]:4);
end;
textcolor(15);
writeln;
25
end;
end;
//подпрограмма для вывода результата пользователю
Procedure Output(var sizeMatrix,sum:integer; var Matrix:DynamicType);
begin
Calc(sizeMatrix,sum,Matrix);
writeln('Сумма = ', sum);
end;
//основная часть программы
var
Matrix:DynamicType; //двумерный массив, в котором хранится матрица
sizeMatrix:integer; //размер матрицы
sum:integer; //переменная для хранения суммы элементов
key:char; //переменная, хранящая код нажатой на клавиатуре клавиши
begin
repeat
clrscr;
writeln('Программа для вычисления суммы элементов матрицы, выделенных
символом Х.');
New(Matrix); //создание динамической переменной
GenerateMatrix(sizeMatrix,Matrix); //задание размера матрицы и
заполнение её случайными числами
Output(sizeMatrix,sum,Matrix); //вычисление суммы и вывод результата
пользователю
Dispose(Matrix); //освобождение места в памяти, занятого динамической
переменной
WriteLn('Нажмите Пробел, для повторного ввода данных.');
WriteLn('Нажмите Esc, чтобы закрыть программу.');
repeat
key := readkey;
If key = #32 then break
else if key = #27 then halt
else WriteLn('Ошибка');
until key = #32;
until key = #27;
end.

Ниже представлен текст программы на языке программирования Free


Pascal 3.2.0 для вычисления суммы элементов матрицы, выделенных символом
Х с использованием схемы работы с памятью GETMEM – FREEMEM.
Program lab6_5;
uses crt; //подключение модуля для работы с консолью
type //задание пользовательских типов
TypeArray = array[1..1] of longint;
DefaultArray = ^TypeArray;
MatrixType = array[1..1] of DefaultArray;
DynamicType = ^MatrixType;
//подпрограмма для задания размера массива и заполнения его случайными
числами
Procedure generateMatrix(var sizeMatrix:longint; var Matrix:DynamicType);
var
i,j:integer; //счётчики цикла
str:string; //строка для ввода размера матрицы
code:integer; //переменная для проверки корректности ввода
begin
randomize;
26
write('Введите размер матрицы: ');
ReadLn(str);
val(str, sizeMatrix, code);
while (code<>0) or (sizeMatrix < 0) do
begin
Writeln('Ошибка. Введено некорректное значение.');
Write('Введите размер матрицы: ');
ReadLn(str);
val(str, sizeMatrix, code);
end;
Getmem(Matrix,sizeMatrix*SizeOf(DefaultArray)); //создание
динамического массива
for i:= 1 to sizeMatrix do GetMem(Matrix^[i],
sizeMatrix*SizeOf(longint)); //создание динамического массива
for i:= 1 to sizeMatrix do
for j:= 1 to sizeMatrix do
Matrix^[i]^[j]:=random(10);
end;
//подпрограмма для вычисления суммы элементов массива, выделенных
символом X
Procedure Calc(var sizeMatrix,sum:longint; var Matrix:DynamicType);
var
i,j:integer; //счётчики цикла
begin
sum := 0;
writeln('Матрица:');
for i:=1 to sizeMatrix do
begin
for j:=1 to sizeMatrix do
begin
if (i in [j..sizeMatrix-j+1]) or (i in [sizeMatrix-j+1..j]) then
begin
textcolor(10);
sum:=sum+Matrix^[i]^[j];
end
else textcolor(15);
write(Matrix^[i]^[j]:4);
end;
textcolor(15);
writeln;
end;
end;
//подпрограмма для вывода результата пользователю
Procedure Output(var sizeMatrix,sum:longint; var Matrix:DynamicType);
begin
Calc(sizeMatrix,sum,Matrix);
writeln('Сумма = ', sum);
end;
//основная часть программы
var
Matrix:DynamicType; //двумерный массив, в котором хранится матрица
sizeMatrix:longint; //размер матрицы
sum:longint; //переменная, хранящая сумму элементов матрицы
key:char; //переменная, хранящая код нажатой на клавиатуре клавиши
begin
repeat
clrscr; //очистка экрана ввода/вывода
writeln('Программа для вычисления суммы элементов матрицы, выделенных
символом Х.');
27
GenerateMatrix(sizeMatrix,Matrix); //задание размера массива и
заполнение его случайными числами
Output(sizeMatrix,sum,Matrix); //вычисление суммы и вывод результата
пользователю
FreeMem(Matrix,sizeMatrix*SizeOf(DefaultArray));//уничтожение
динамической перменной
WriteLn('Нажмите Пробел, для повторного ввода данных.');
WriteLn('Нажмите Esc, чтобы закрыть программу.');
repeat
key := readkey;
If key = #32 then break
else if key = #27 then halt
else WriteLn('Ошибка');
until key = #32;
until key = #27;
end.

Ниже представлен текст программы на языке программирования Free


Pascal 3.2.0 для вычисления суммы элементов матрицы, выделенных символом
Х с использованием схемы работы с памятью SETLENGTH с параметром-
открытым массивом.

Program lab6_6;
uses crt; //подключение модуля для работы с консолью
type //задание пользовательского типа «массив»
DefaultArray = array of array of integer;
//подпрограмма для задания размера матрицы и заполнение её случайными
числами
Procedure generateMatrix(var sizeMatrix: integer; var Matrix:
DefaultArray);
var
i,j:integer; //счётчики цикла
str:string; //строка для ввода размера матрицы
code:integer; //переменная для проверки корректности ввода
begin
randomize;
write('Размер матрицы: ');
ReadLn(str);
val(str, sizeMatrix, code);
while (code<>0) or (sizeMatrix < 0) do
begin
Writeln('Ошибка. Введено некорректное значение.');
Write('Введите размер матрицы: ');
ReadLn(str);
val(str, sizeMatrix, code);
end;
setlength(Matrix,sizeMatrix+1,sizeMatrix+1); //задание размера
двумерного массива
for i:=1 to sizeMatrix do
for j:=1 to sizeMatrix do
Matrix[i,j]:=random(10);
end;
//подпрограмма для вычисления суммы элементов массива, которые выделены
символом Х
28
Procedure Calc(var sizeMatrix,sum:integer; var Matrix:DefaultArray);
var
i,j:integer; //счётчики цикла
begin
sum := 0;
writeln('Матрица:');
for i:=1 to sizeMatrix do
begin
for j:=1 to sizeMatrix do
begin
if (i in [j..sizeMatrix-j+1]) or (i in [sizeMatrix-j+1..j]) then
begin
textcolor(10);
sum:=sum+Matrix[i,j];
end
else textcolor(15);
write(Matrix[i,j]:4);
end;
textcolor(15);
writeln;
end;
end;
//подпрограмма для вывода результата пользователю
Procedure Output(var sizeMatrix,sum:integer; var Matrix:DefaultArray);
begin
Calc(sizeMatrix,sum,Matrix);
writeln('Сумма = ', sum);
end;
//основная часть программы
var
Matrix:DefaultArray; //двумерный массив, в котором хранится матрица
sizeMatrix:integer; //размер матрицы
sum:integer; //переменная в которой хранится сумма элементов матрицы
key:char; //переменная, хранящая код нажатой на клавиатуре клавиши
begin
repeat
clrscr; //очистка экрана ввода/вывода
writeln('Программа для вычисления суммы элементов матрицы, выделенных
символом Х');
generateMatrix(sizeMatrix,Matrix); //задание размера матрицы и
заполнение её случайными числами
Output(sizeMatrix,sum,Matrix); //вычисление суммы и вывод результата
пользователю
WriteLn('Нажмите Пробел, для повторного ввода данных.');
WriteLn('Нажмите Esc, чтобы закрыть программу.');
repeat
key := readkey;
If key = #32 then break
else if key = #27 then halt
else WriteLn('Ошибка');
until key = #32;
until key = #27;
end.

Инструкция пользователя 2

29
Данная программа предназначена для вычисления суммы элементов
матрицы, выделенных символом Х.
X X
X X X X
X X X X X X
X X X X X X X
X X X X X X
X X X X
X X
При запуске программы появляется приветственное сообщение с
предназначением программы и запрос на ввод размера матрицы.
После этого пользователю выведется сама матрица, заполненная
случайными числами, а элементы в матрице, которые необходимо
суммировать, будут выделены зелёным цветом. После вывода матрицы
пользователю будет выведена строка, где написана сумма этих элементов.
После этого пользователю будет предложено либо начать ввод заново
нажатием клавиши «Пробел», либо закрыть программу клавишей «Esc».

Инструкция программиста 2
Программа предназначена для вычисления суммы элементов матрицы,
выделенных символом Х.
Объявлены следующие типы данных:
1) Программа lab6_4:
DefaultArray = array of array of integer;
DynamicType = ^DefaultArray
2) Программа lab6_5:
TypeArray = array[1..1] of longint;
DefaultArray = ^TypeArray;
MatrixType = array[1..1] of DefaultArray;
DynamicType = ^MatrixType
3) Программа lab6_6:
DefaultArray = Array of Array of Integer

30
Cтруктуры данных, используемых в основной программе lab6_4,
приведены в таблице 5.1.  
Таблица 5.1  Структуры данных, используемых в основной программе lab6_4
имя тип предназначение
Matrix DynamicType Двумерный массив, в котором хранится матрица
sizeMatrix Integer Размер матрицы
sum Integer Переменная, в которой хранится сумма элементов
key Char Строка для хранения считанного текста

Cтруктуры данных, используемых в основной программе lab6_5,


приведены в таблице 5.2.  
Таблица 5.2  Структуры данных, используемых в основной программе lab6_5
имя тип предназначение
Matrix DynamicType Двумерный массив, в котором хранится матрица
sizeMatrix Longint Размер матрицы
sum Longint Переменная, в которой хранится сумма элементов
key Char Строка для хранения считанного текста

Cтруктуры данных, используемых в основной программе lab6_6,


приведены в таблице 5.3.  
Таблица 5.3  Структуры данных, используемых в основной программе lab6_6
имя тип предназначение
Matrix DefaultArray Двумерный массив, в котором хранится матрица
sizeMatrix Integer Размер матрицы
sum Integer Переменная, в которой хранится сумма элементов
key Char Строка для хранения считанного текста

Программа lab6_4 разбита на 3 подпрограммы:


1) Procedure generateMatrix (var sizeMatrix: integer; var Matrix:
DynamicType) – подпрограмма для задания размера матрицы и заполнения её
случайными числами.
Структуры данных, используемых в подпрограмме generateMatrix
приведены в таблице 6.1.

Таблица 6.1 – Структуры данных, используемых в подпрограмме generateMatrix


имя тип предназначение
Формальные параметры
sizeMatrix Integer Размер матрицы
Matrix DynamicType Двумерный массив, в котором хранится матрица
31
Локальные переменные
i Integer Счётчик цикла
j Integer Счётчик цикла
str String Строка для ввода размера матрицы
code Integer Проверка ввода корректного значения

2) Procedure Calc (var sizeMatrix, sum: integer; var Matrix: DynamicType) –


подпрограмма для вычисления суммы элементов матрицы, выделенных
символом X.
Структуры данных, используемых в подпрограмме Calc приведены в
таблице 6.2.
Таблица 6.2 – Структуры данных, используемых в подпрограмме Calc
имя тип предназначение
Формальные параметры
sizeMatrix Integer Размер матрицы
Matrix DynamicType Двумерный массив, в котором хранится матрица
sum Integer Переменная для хранения суммы элементов матрицы
Локальные переменные
i Integer Счётчик цикла
j Integer Счётчик цикла

3) Procedure Output (var sizeMatrix, sum:integer; var Matrix: DynamicType)


– подпрограмма для вывода результата пользователю.
Структура данных, используемых в подпрограмме Output приведены в
таблице 6.3.
Таблица 6.3 – Структуры данных, используемых в подпрограмме Output
имя тип предназначение
Формальные параметры
sizeMatrix Integer Размер матрицы
Matrix DynamicType Двумерный массив, в котором хранится матрица
sum Integer Переменная для хранения суммы элементов матрицы

Программа lab6_5 разбита на 3 подпрограммы:


1) Procedure generateMatrix (var sizeMatrix: longint; var Matrix:
DynamicType) – подпрограмма для задания размера матрицы и заполнения её
случайными числами.
Структуры данных, используемых в подпрограмме generateMatrix
приведены в таблице 7.1.
Таблица 7.1 – Структуры данных, используемых в подпрограмме generateMatrix

32
имя тип предназначение
Формальные параметры
sizeMatrix longint Размер матрицы
Matrix DynamicType Двумерный массив, в котором хранится матрица
Локальные переменные
i Integer Счётчик цикла
j Integer Счётчик цикла
str String Строка для ввода размера матрицы
code Integer Проверка ввода корректного значения

2) Procedure Calc (var sizeMatrix, sum: longint; var Matrix: DynamicType) –


подпрограмма для вычисления суммы элементов матрицы, выделенных
символом X.
Структуры данных, используемых в подпрограмме Calc приведены в
таблице 7.2.
Таблица 7.2 – Структуры данных, используемых в подпрограмме Calc
имя тип предназначение
Формальные параметры
sizeMatrix Longint Размер матрицы
Matrix DynamicType Двумерный массив, в котором хранится матрица
sum Longint Переменная для хранения суммы элементов матрицы
Локальные переменные
i Integer Счётчик цикла
j Integer Счётчик цикла

3) Procedure Output (var sizeMatrix, sum: longint; var Matrix: DynamicType)


– подпрограмма для вывода результата пользователю.
Структура данных, используемых в подпрограмме Output приведены в
таблице 7.3.
Таблица 7.3 – Структуры данных, используемых в подпрограмме Output
имя тип предназначение
Формальные параметры
sizeMatrix Longint Размер матрицы
Matrix DynamicType Двумерный массив, в котором хранится матрица
sum Longint Переменная для хранения суммы элементов матрицы

Программа lab6_6 разбита на 3 подпрограммы:

33
1) Procedure generateMatrix (var sizeMatrix: integer; var Matrix:
DefaultArray) – подпрограмма для задания размера матрицы и заполнения её
случайными числами.
Структуры данных, используемых в подпрограмме generateMatrix
приведены в таблице 8.1.
Таблица 8.1 – Структуры данных, используемых в подпрограмме generateMatrix
имя тип предназначение
Формальные параметры
sizeMatrix Integer Размер матрицы
Matrix DefaultArray Двумерный массив, в котором хранится матрица
Локальные переменные
i Integer Счётчик цикла
j Integer Счётчик цикла
str String Строка для ввода размера матрицы
code Integer Проверка ввода корректного значения

2) Procedure Calc (var sizeMatrix, sum: integer; var Matrix: DefaultArray) –


подпрограмма для вычисления суммы элементов матрицы, выделенных
символом X.
Структуры данных, используемых в подпрограмме Calc приведены в
таблице 8.2.
Таблица 8.2 – Структуры данных, используемых в подпрограмме Calc
имя тип предназначение
Формальные параметры
sizeMatrix Integer Размер матрицы
Matrix DefaultArray Двумерный массив, в котором хранится матрица
sum Integer Переменная для хранения суммы элементов матрицы
Локальные переменные
i Integer Счётчик цикла
j Integer Счётчик цикла

3) Procedure Output (var sizeMatrix, sum: integer; var Matrix: DefaultArray) –


подпрограмма для вывода результата пользователю.
Структура данных, используемых в подпрограмме Output приведены в
таблице 8.3.

Таблица 8.3 – Структуры данных, используемых в подпрограмме Output


имя тип предназначение

34
Формальные параметры
sizeMatrix Integer Размер матрицы
Matrix DefaultArray Двумерный массив, в котором хранится матрица
sum Integer Переменная для хранения суммы элементов матрицы

Тестовые примеры 2
35
На рисунке 3.1 изображен первый тестовый пример работы программы,
выполняющей вычисление суммы элементов матрицы, выделенных символом
Х с использованием различных схем работы с памятью: NEW – DISPOSE,
GETMEM – FREEMEM, SETLENGTH.

Рисунок 3.1 – Первый тестовый пример работы программы для вычисления суммы
элементов матрицы, выделенных символом Х

На рисунке 3.2 изображен второй тестовый пример работы программы,


выполняющей вычисление суммы элементов матрицы, выделенных символом
Х с использованием различных схем работы с памятью: NEW – DISPOSE,
GETMEM – FREEMEM, SETLENGTH.

Рисунок 3.2 – Второй тестовый пример работы программы для вычисления суммы элементов
матрицы, выделенных символом Х

Выводы
36
При выполнении лабораторной работы были изучены указатели, а также
способы создания, использования и уничтожения динамических переменных.
Была переделана программа, которая удаляет из текста все последующие
вхождения первой буквы, с использованием различных схем работы с памятью:
NEW – DISPOSE, GETMEM – FREEMEM, SETLENGTH. Также была написана
программа, которая вычисляет сумму элементов матрицы, выделенных
символом Х, используя различные схемы работы с памятью: NEW – DISPOSE,
GETMEM – FREEMEM, SETLENGTH.

37