Пример 1.Программа обработки файла, содержащего данные простого типа.При исследовании некоторого технического объекта замерены его параметры Xi и записаны в набор данных StatDan в виде вещественных чисел. Вычислить их среднее значение Mx и стандартное отклонение s по формулам:
Алгоритм для этой задачи будет следующий.
1.
Открыть файл
2. Подсчитать среднее значение Mx и стандартное отклонение s.
3. Закончить.
Уточняем алгоритм.
1.1. Связать файл из программы с набором StatDan.
1.2. Открыть файл для чтения.
2.1. Mx := 0.
2.2. s := 0.
2.3. N := 0.
2.4. Пока не конец файла выполнить
2.4.1. Считать из файла число.
2.4.2. Mx := Mx + число.
2.4.3. s := s + х2
2.4.4. N := N + 1.
2.5. Вычислить Mx и s.
2.6. Вывести Mx и s.
2.7. Закрыть файл.
3. Закончить.
Программа, реализующая этот алгоритм, может быть такой:
Program Stat;
Var
F : File Of Real;
X,M,S : Real;
N : Integer;
Begin
Assign(F,’StatDan’);{ Здесь имя набора задано в виде}
Reset(F); { строковой константы StatDan}
S := 0;
M := 0;
N := 0;
While not Eof(F) do
Begin
Read(F,X);
N := N+1;
M := M+x;
S := S+Sqr(X);
end;
M := M/N;
S := Sqrt(S-Sqr(M))/ N;
Writeln(’Количество измерений - ’,N);
Writeln(’Среднее: ’,M:8:3,’ Отклонение: ’,S:8:3);
end.
Пример 2.Последовательное создание типизированного файла, содержащего данные сложного типа
Как отмечалось выше, к таким данным можно отнести массивы и записи Паскаля. Наиболее типичными являются файлы, содержащие данные типа Record.
Задача. Сформировать и вывести на экран файл, представляющий собой ведомость успеваемости студентов 1 курса ФАИТ. Данные об одном студенте имеют структуру вида:
Фамилия, Имя, Отчество, номер зачетки, оценки по 5 предметам.
Количество студентов (n) и сведения о них вводятся с клавиатуры. Программа для решения поставленной задачи может быть такой.
Program Sozd_Fil;
Const
M=5; { Количество оценок }
Type
Stud=Record
Fam, Im, Ot : String[10];
NumZ : LongInt;
Otm : Array[1..M] Of Integer;
End;
Var
Vedom : File Of Stud;
A : Stud;
FilName : String; { имя набора данных }
j,i,n : Integer;
Begin
Writeln(’Введите имя набора данных’);
Readln(FilName);
Assign(Vedom,FilName);
Rewrite(Vedom); {Открытие файла для записи}
Writeln(’Введите количество студентов’);
Readln(n);
Writeln (’Вводите сведения о каждом студенте’);
For i:=1 to n do
Begin
With A do
Begin
Write(’Фамилия: ’);
ReadLn(Fam);
Write(’Имя: ’);
ReadLn(Im);
Write(’Отчество: ’);
ReadLn(Ot);
Write(’Номер зачетки: ’);
ReadLn(Numz);
WriteLn(’Введите оценки по одной:’);
For J := 1 to 5 do
Begin
WriteLn(’Введите ’,J,’ -ю оценку’);
ReadLn(Otm[j]);
End;
End;
Write(Vedom,A); {Запись в файл переписывается целиком}
End;
Close(Vedom);
Writeln (’Конец работы. Нажмите клавишу ENTER’);
ReadLn;
End.
Пример 3.Последовательная обработка файла Vedom
Задача. Вывести на экран сведения о неуспевающих студентах из файла Vedom предыдущего примера. Соответствующая программа будет иметь следующий вид.
Program Count_2;
Const
M=5;
Dl=10;
Type
Stud = Record
Fam, Im, Ot : String[Dl];
Numz : LongInt;
Otm : Array[1..M] Of Integer;
End;
Var
Vedom : File Of Stud;
FilName : String;{имя набора данных}
A : Stud;
i,j,kdv,K2 : Integer;
Begin
Writeln(’Введите имя набора данных’);
Readln(FilName);
Assign(Vedom,FilName);
Reset (Vedom); {открытие файла, 1-я запись - в буфере}
kdv := 0;
I := 0;
Writeln(’Список фамилий и номеров зачеток неуспевающих студентов’);
While Not Eof(Vedom) Do
Begin
K2 := 0;
Read(Vedom,A);
I := i+1;
With A Do
Begin
For j := 1 To M Do
If Otm[j] < 3 Then
K2 := K2+1;
If K2 > 0 Then
Begin
kdv := kdv+1;
Writeln(Fam:15,Numz:8);
End;
End;{Whith}
End;{While}
Writeln(’Проверено ’,i,’ студентов.’);
Writeln(’Из них неуспевающих ’,kdv,’ человек’);
WriteLn(’Нажмите Enter’);
Readln;
End.
21.2.2. Использование прямого доступа к записям типизированного файла
Прямой (произвольный) доступ – это способ обработки файла, при котором можно в любой момент выполнять обращение к любой записи файла. Как уже отмечалось, такой способ возможен для файлов всех типов, кроме текстового (т.е. для типизированных и нетипизированных). Напомним также, что в таких файлах каждой записи ставится в соответствие ее порядковый номер. Номера имеют значения 0, 1, 2, …
При использовании прямого доступа необходимо перед каждой операцией чтения (записи) задать номер записи, которая должна быть обработана. После выполнения операции указатель файла устанавливается перед следующей записью (т.е. перед записью с номером, увеличенным на 1).
Для установки указателя на нужную запись используется специальная процедура Seek, которая в общем виде записывается так: