Академический Документы
Профессиональный Документы
Культура Документы
ДИНАМИЧЕСКИЕ ПЕРЕМЕННЫЕ
отчет по
лабораторной работе №6
по дисциплине
ПРОГРАММИРОВАНИЕ
ВАРИАНТ 17
Тула, 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;
Инструкция пользователя 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.
12
storageText String Строка для хранения считанного текста
key Char Переменная для определения кода клавиши
клавиатуры
14
Структура данных, используемых в подпрограмме copyFile, приведены в
таблице 2.4.
Таблица 2.4 – Структуры данных, используемых в подпрограмме copyFile
имя тип предназначение
Формальные параметры
otherFile File Файл с результатом работы программы,
который необходимо скопировать
Локальные переменные
temp Char Переменная для временного хранения
считанного символа
newFile File Копия исходного файла
16
Структура данных, используемых в подпрограмме copyFile, приведены в
таблице 3.4.
Таблица 3.4 – Структуры данных, используемых в подпрограмме copyFile
имя тип предназначение
Формальные параметры
otherFile File Файл с результатом работы программы,
который необходимо скопировать
Локальные переменные
temp Char Переменная для временного хранения
считанного символа
newFile File Копия исходного файла
18
Структура данных, используемых в подпрограмме copyFile, приведены в
таблице 4.4.
Таблица 4.4 – Структуры данных, используемых в подпрограмме copyFile
имя тип предназначение
Формальные параметры
otherFile DynamicType Файл с результатом работы программы,
который необходимо скопировать
Локальные переменные
i Integer Счётчик
temp Char Переменная для временного хранения
считанного символа
newFile File Копия исходного файла
Тестовые примеры 1
19
На рисунке 1.1 изображен первый тестовый пример работы программы,
выполняющей удаление из текста всех последующих вхождений первой буквы
с использованием различных схем работы с памятью: NEW – DISPOSE,
GETMEM – FREEMEM, SETLENGTH.
Рисунок 1.1 – Первый тестовый пример работы программы для удаления из текста всех
последующих вхождений первой буквы
Рисунок 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
Конец
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 – Схема алгоритма ввода размера матрицы и заполнение её
случайными числами
22
1
Вычисление суммы элементов матрицы
Вход
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
Выход
23
На рисунке 2.4 представлена схема алгоритма для вычисления и вывода
результата пользователю.
1 Вычисление и вывод результата пользователю
Вход
Procedure Output (var sizeMatrix, sum:integer, var
Matrix:DefaultArray)
2
Calc(sizeMa
trix, sum,
Matrix)
µСумма = µ, sum
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.
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 Строка для хранения считанного текста
32
имя тип предназначение
Формальные параметры
sizeMatrix longint Размер матрицы
Matrix DynamicType Двумерный массив, в котором хранится матрица
Локальные переменные
i Integer Счётчик цикла
j Integer Счётчик цикла
str String Строка для ввода размера матрицы
code Integer Проверка ввода корректного значения
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 Проверка ввода корректного значения
34
Формальные параметры
sizeMatrix Integer Размер матрицы
Matrix DefaultArray Двумерный массив, в котором хранится матрица
sum Integer Переменная для хранения суммы элементов матрицы
Тестовые примеры 2
35
На рисунке 3.1 изображен первый тестовый пример работы программы,
выполняющей вычисление суммы элементов матрицы, выделенных символом
Х с использованием различных схем работы с памятью: NEW – DISPOSE,
GETMEM – FREEMEM, SETLENGTH.
Рисунок 3.1 – Первый тестовый пример работы программы для вычисления суммы
элементов матрицы, выделенных символом Х
Рисунок 3.2 – Второй тестовый пример работы программы для вычисления суммы элементов
матрицы, выделенных символом Х
Выводы
36
При выполнении лабораторной работы были изучены указатели, а также
способы создания, использования и уничтожения динамических переменных.
Была переделана программа, которая удаляет из текста все последующие
вхождения первой буквы, с использованием различных схем работы с памятью:
NEW – DISPOSE, GETMEM – FREEMEM, SETLENGTH. Также была написана
программа, которая вычисляет сумму элементов матрицы, выделенных
символом Х, используя различные схемы работы с памятью: NEW – DISPOSE,
GETMEM – FREEMEM, SETLENGTH.
37