
- •Лабораторная работа №8
- •1. Теоретическая часть
- •1.1. Описание файлов в языке программирования Pascal.
- •1.2. Чтение и запись файлов в языке программирования Pascal.
- •1.3 Пример составления алгоритма и программы на языке Pascal для обработки одномерных массивов с использованием внешних файлов.
- •2. Практическая часть
- •2.1 Требования к выполнению работы:
- •2.2 Варианты индивидуальных заданий.
Лабораторная работа №8
“Программирование с использованием внешних файлов”
Цель работы: Освоение методов составления программ с использованием внешних файлов, а также закрепление навыков разработки и отладки программ, которые обеспечивают создание файлов, занесение в них информации и чтение информации из файлов.
1. Теоретическая часть
1.1. Описание файлов в языке программирования Pascal.
В Паскале файлы делятся по типу информации, которая заносится в файл:
– типизированные
– текстовые
– нетипизированные
Типизированный файл содержит последовательность компонент любого заданного типа.
Нетипизированный файл содержит последовательность компонент произвольного типа.
Текстовый файл содержит набор любых символов.
Доступ к файлу в программе происходит с помощью переменных файлового типа. В зависимости от типа файла переменную файлового типа описывают одним из трех способов:
file of тип – типизированный файл;
text – текстовый файл;
file – нетипизированный файл.
Примеры описания файловых переменных:
var
f1: file of char;
f2: file of integer;
f3: file;
t: text;
До начала работы с файлами необходимо установить связь между файловой переменной и именем физического дискового файла. Это осуществляется с помощью процедуры Assign(f,’ff’). При этом устанавливается связь между файловой переменной с именем f и физическим файлом с именем ‘ff’.
После связи файловой переменной с именем файла в программе нужно указать направление передачи данных (открыть файл). Процедура Reset(f) открывает для чтения файл, с которым связана файловая переменная f. После успешного выполнения процедуры Reset файл готов к чтению из него первого элемента. Процедура Rewrite(f) открывает для записи файл, с которым связана файловая переменная f. После успешного выполнения этой процедуры файл готов к записи в него первого элемента. Если указанный файл уже существовал, то все данные из него уничтожаются.
После окончания работы с файлами на Паскале, они должны быть закрыты с помощью процедуры Close(f).
1.2. Чтение и запись файлов в языке программирования Pascal.
Чтение из текстового файла осуществляется с помощью процедур:
– Read(f, список переменных),
– ReadLn(f, список переменных).
Эти процедуры читают информацию из файла f в переменные. Отличие ReadLn от Read в том, что при использовании ReadLn после прочтения данных, указанных внутри скобок в списке переменных пропускаются все оставшиеся символы в данной строке.
Запись в текстовый файл осуществляется с помощью процедур:
– Write(f, список переменных),
– WriteLn(f, список переменных).
При записи учитывается формат вывода. WriteLn от Write отличается тем, что после записи всех значений из переменных записывается еще и метка конца строки (формируется законченная строка файла).
Добавление информации к концу файла осуществляется с помощью процедуры Append(f), которая открывает текстовый файл для добавления информации к его концу.
1.3 Пример составления алгоритма и программы на языке Pascal для обработки одномерных массивов с использованием внешних файлов.
Задание: Для массива вещественных чисел A(40) выполнить ввод элементов из текстового файла. Вывести на экран все элементы массива. Разделить в массиве все элементы на среднее арифметическое значение, вывести результат в текстовый файл и на экран.
Решение.
Для объявления массива A опишем в разделе Type тип массива из 40 вещественных чисел. Для обозначения количества элементов массива A введем переменную n.
Для решения задачи организуем в программе 4 процедуры:
– ввод элементов массива из файла,
– вывод элементов массива на экран,
– вывод элементов массива в файл,
– поиск среднего значения в массиве и деление всех элементов массива на среднее значение.
Процедуру ввода элементов массива из файла назовем EnterMassivFile, в списке формальных параметров укажем следующие переменные: количество элементов в массиве N и массив X. При этом в списке формальных параметров массив должен быть указан со служебным словом var, поскольку значения элементов массива изменяются в процедуре и возвращаются в основную программу. Внутри процедуры введем локальную переменную файлового типа f:text, которую свяжем с файлом с именем MassivA.txt. Для считывания данных из файла откроем его с помощью процедуры reset(f).
Процедуру вывода элементов массива на экран назовем PrintMassiv, и будем в нее передавать те же переменные: количество элементов в массиве N и массив X.
Процедуру вывода элементов массива в файл назовем PrintMassivFile, будем в нее передавать те же переменные: количество элементов в массиве N и массив X. Внутри процедуры введем локальную переменную файлового типа f:text, которую свяжем с файлом с именем ResultA.txt. Для записи данных в файл откроем его с помощью процедуры rewrite(f).
Функцию поиска среднего значения и деления на него всех элементов массива назовем ChangeMassiv, и будем в нее также передавать массив X и количество элементов в массиве N. Внутри функции будем использовать локальную переменную Sred для подсчета среднего значения. После вычисления среднего значения проверим его на равенство 0. Если условие Sred = 0 не выполнится, разделим все элементы массива A на Sred, иначе выведем на экран сообщение, что деление элементов на 0 невозможно, и не будем изменять элементы массива.
Решение задачи можно организовать также без использования подпрограмм. В этом случае, поскольку в программе используются два разных текстовых файла, необходимо описать две файловые переменные f1,f2:text.
1.3.1 Блок-схема алгоритма решения данной задачи выглядит следующим образом:
Блок схема подпрограммы EnterMassivFile
Блок схема подпрограммы PrintMassivFile
Блок схема подпрограммы PrintMassiv
Блок схема подпрограммы ChangeMassiv
Блок схема основной программы
1.3.2 Текст программы с использованием подпрограмм на языке Pascal выглядит следующим образом:
program primer81;
uses crt;
type
mas=array[1..40] of real;
var
n:byte;
A:mas;
procedure EnterMassivFile(n:byte; var X:mas);
var
i:byte;
f:text;
begin
assign(f,'MassivA.txt');
reset(f);
for i:=1 to n do read(f,A[i]);
close(f);
end;
procedure PrintMassivFile(n:byte; X:mas);
var
i:byte;
f:text;
begin
assign(f,'ResultA.txt');
rewrite(f);
for i:=1 to n do
begin
write(f,A[i]:7:2);
if i mod 10=0 then writeln(f);
end;
close(f);
end;
procedure PrintMassiv(n:byte; X:mas);
var
i:byte;
begin
for i:=1 to n do
begin
write(A[i]:7:2);
if i mod 10=0 then writeln;
end;
end;
procedure ChangeMassiv(n:byte;var X:mas);
var
Sred:real;
i:byte;
begin
Sred:=0;
for i:=1 to n do Sred:=Sred+A[i];
Sred:=Sred/n;
writeln('Srednee znachenie v massive A ', Sred:7:2);
if Sred<>0 then
for i:=1 to n do A[i]:=A[i]/Sred
else writeln('Srednee znachenie ravno 0. Delenie nevozmojno.');
end;
Begin
clrscr;
n:=40;
EnterMassivFile(n,A);
writeln('Isxodniy massiv A:');
PrintMassiv(n,A);
ChangeMassiv(n,A);
writeln('Resultat:');
PrintMassiv(n,A);
PrintMassivFile(n,A);
readkey;
end.
1.3.3 Текст программы без использования подпрограмм на языке Pascal выглядит следующим образом:
program primer82;
uses crt;
type
mas=array[1..40] of real;
var
i,n:byte;
A:mas;
Sred:real;
f1,f2:text;
begin
clrscr;
n:=40;
assign(f1,'MassivA.txt');
reset(f1);
for i:=1 to n do
read(f1,A[i]);
close(f1);
writeln('Isxodniy massiv A:');
for i:=1 to n do
begin
write(A[i]:7:2);
if i mod 10=0 then writeln;
end;
Sred:=0;
for i:=1 to n do
Sred:=Sred+A[i];
Sred:=Sred/n;
writeln('Srednee znachenie v massive A ', Sred:7:2);
if Sred<>0 then for i:=1 to n do A[i]:=A[i]/Sred
else writeln('Srednee znachenie ravno 0. Delenie nevozmojno.');
writeln('Resultat: ');
for i:=1 to n do
begin
write(A[i]:7:2);
if i mod 10=0 then writeln;
end;
assign(f2,'ResultA.txt');
rewrite(f2);
for i:=1 to n do
begin
write(f2,A[i]:7:2);
if i mod 10=0 then writeln(f2);
end;
close(f2);
readkey;
end.
1.3.4 Результаты работы программы:
Результаты с экрана
Isxodniy massiv A:
1.50 0.00 23.00 15.00 100.00 10.00 -8.20 11.00 -0.90 0.10
22.00 33.00 30.50 1.00 7.90 -94.00 30.00 5.00 -1.90 -3.00
10.00 1.00 23.00 2.00 8.00 6.00 -5.00 0.00 0.40 7.60
-3.00 2.00 -5.50 0.00 9.00 19.00 27.50 11.00 20.10 1.00
Srednee znachenie v massive A 7.90
Resultat: Kajdiy element massiva A razdelen na srednee znachenie
0.19 0.00 2.91 1.90 12.65 1.27 -1.04 1.39 -0.11 0.01
2.78 4.18 3.86 0.13 1.00 -11.89 3.80 0.63 -0.24 -0.38
1.27 0.13 2.91 0.25 1.01 0.76 -0.63 0.00 0.05 0.96
-0.38 0.25 -0.70 0.00 1.14 2.40 3.48 1.39 2.54 0.13
Файл MassivA.txt
1.5 0 23 15 100 10 -8.2 11 -0.9 0.1
22 33 30.5 1 7.9 -94 30 5 -1.9 -3
10 1 23 2 8 6 -5 0 0.4 7.6
-3 2 -5.5 0 9 19 27.5 11 20.1 1
Файл ResultA.txt
0.19 0.00 2.91 1.90 12.65 1.27 -1.04 1.39 -0.11 0.01
2.78 4.18 3.86 0.13 1.00 -11.89 3.80 0.63 -0.24 -0.38
1.27 0.13 2.91 0.25 1.01 0.76 -0.63 0.00 0.05 0.96
-0.38 0.25 -0.70 0.00 1.14 2.40 3.48 1.39 2.54 0.13