Работа с структурированным файлом
фамилия ученика
его возраст
пол
оценки по 4-ём испытаниям
1.Описать программу, которая формирует исходный файл
2.Описать процедуру, которая выводит в файл фамилии учеников, которые имеют средний балл выше заданного.
1. Программа, которая формирует исходный файл
Текст программы
program newfile;type ekz = record
matan,dmat,prog,linalg:1..5;
end;
st = record
name:string[20];
age:byte;
st:char;
e:ekz;
end;
tf=file of st;
var i:byte;
f:tf;
stud:st;
fname:string[20];
q:char;
begin
writeln('Введите имя файла:');
readln(fname);
assign(f,fname);
rewrite(f);
i:=0;
repeat
inc(i);
with stud do begin
write('фамилия ',i,' ученика:');readln(name);
write('век:');readln(age);
write('пол:');readln(st);
writeln('оценки:');
with e do begin
write('математика ');readln(matan);
write('физика ');readln(dmat);
write('химия ');readln(prog);
write('литература ');readln(linalg)
end
end;
write(f,stud);
writeln('Продолжать ?');
readln(q);
until (q<>'Y' )and(q<>'y');
close(f);
end.
Результат работы программы
1)Введите имя файла:
file1.txt
фамилия 1 ученика:Иванов
век:18
пол:м
оценки:
математика 3
физика 3
химия 3
литература 3
Продолжать ?
y
фамилия 2 ученика:Петров
век:17
пол:ж
оценки:
математика 4
физика 4
химия 4
литература 4
Продолжать ?
y
фамилия 3 ученика:Сидоров
век:18
пол:м
оценки:
математика 4
физика 4
химия 3
литература 4
Продолжать ?
y
фамилия 4 ученика:Васильев
век:17
пол:м
оценки:
математика 5
физика 4
химия 5
литература 4
Продолжать ?
n
2)
Введите имя файла:
file2.txt
фамилия 1 ученика:Сергеев
век:18
пол:ж
оценки:
математика 3
физика 3
химия 3
литература 3
Продолжать ?
y
фамилия 2 ученика:Николаев
век:18
пол:ж
оценки:
математика 5
физика 5
химия 5
литература 4
Продолжать ?
фамилия 3 ученика:Пугачев
век:18
пол:м
оценки:
математика 5
физика 4
химия 5
литература 5
Продолжать ?
y
фамилия 4 ученика:Белов
век:17
пол:м
оценки:
математика 4
физика 4
химия 4
литература 5
Продолжать ?
y
фамилия 5 ученика:Смирнов
век:3
пол:м
оценки:
математика 3
физика 4
химия 4
литература 3
Продолжать ?
n
{mospagebreak}
2. Программа, которая содержит процедуру, которая выводит к файлу фамилии учеников, которые имеют средний балл выше заданного
Текст программы
program Prg10;{ http://nataliya.kiev.ua }
type ekz = record
matan,dmat,prog,linalg:1..5;
end;
st = record
name:string[20];
age:byte;
st:char;
e:ekz;
end;
tf=file of st;
var fname1,fname2:string;
q:char;
sr:real;
procedure p(fname1,fname2:string; sr:real);
var stud:st;
f1,f2:tf;
begin
assign(f1,fname1);
reset(f1);
assign(f2,fname2);
rewrite(f2);
while not eof(f1)do begin
read(f1,stud);
if (stud.e.matan+stud.e.dmat+stud.
e.linalg+stud.e.prog)/4>=sr
then
write(f2,stud)
end;
close(f1);close(f2);
end;
procedure displ(fname:string);
var f:tf;
s:st;
begin
assign(f,fname);
reset(f);
writeln('фамилия':10,'Возраст':7,'Пол':7,
'Математика':10,'Физика':10,
'Химия':10,'Литература':10);
while not eof(f) do begin
read(f,s);
with s do
writeln(name:9,age:7,st:7,e.matan:10,e.dmat:10
,e.prog:10,e.linalg:10);
end;
close(f);
end;
begin
writeln('Введите имя файла1:');
readln(fname1);
writeln('Введите имя файла2:');
readln(fname2);
writeln('Введите средний балл:');
readln(sr);
p(fname1,fname2,sr);
writeln('Вывести на экран первый файл?');
readln(q);
if (q='Y')or(q='y') then displ(fname1);
writeln('Вывести на экран второй файл?');
readln(q);
if (q='Y')or(q='y') then begin
writeln('Ученики с средним баллом высшим за ',sr:0:3);
displ(fname2);
end;
end.
Результат работы программы
1)Введите имя файла1:
file1.txt
Введите имя файла2:
temp
Введите имя файла:
4
Вывести на экран первый файл?
y
фамилия Возраст Пол Математика Физика Химия Литература
Иванов 18 м 3 3 3 3
Петров 17 ж 4 4 4 4
Сидоров 18 м 4 4 3 4
Васильев 17 м 5 4 5 4
Вывести на экран второй файл?
y
Ученики с средним баллом высшим за 4.000
фамилия Возраст Пол Математика Физика Химия Литература
Петров 17 ж 4 4 4 4
Васильев 17 м 5 4 5 4
2)
Введите имя файла1:
file2.txt
Введите имя файла2:
t.txt
Введите средний балл:
4
Вывести на экран первый файл?
y
фамилия Возраст Пол Математика Физика Химия Литература
Сергеев 18 ж 3 3 3 3
Николаев 18 ж 5 5 5 4
Пугачев 18 м 5 5 5 5
Белов 17 м 4 4 4 5
Смирнов 3 м 3 4 4 3
Вывести на экран второй файл?
y
Ученики с средним баллом высшим за 4.000
фамилия Возраст Пол Математика Физика Химия Литература
Николаев 18 ж 5 5 5 4
Пугачев 18 м 5 5 5 5
Белов 17 м 4 4 4 5
3)
Введите имя файла1:
file2.txt
Введите имя файла2:
f
Введите средний балл:
5
Вывести на экран первый файл?
n
Вывести на экран второй файл?
y
Ученики с средним баллом высшим за 5.000
фамилия Возраст Пол Математика Физика Химия Литература
Пугачев 18 м 5 5 5 5
Теория к программе
Работа с структурированным файлом.Структурированный тип - запись
Тип запись содержит отдельные поля, количество и тип которых должны быть определенными. Типы отдельных полей могут быть разными. Описание записи содержит перечень идентификаторов всех полей и их типов. Запись может иметь постоянную и переменную части
Общий вид записи, которая имеет только постоянную часть:
TYPE <идентификатор типа>=RECORD
<идентификатор поля 1>:<тип поля 1>;
:
<идентификатор поля N>:<тип поля N>
end;
Если некоторые поля имеют одинаковые типы, их идентификаторы могут быть перечислены через запятую:
TYPE <идентификатор типа>=RECORD
<идентификатор поля 1>:<тип поля 1>;
<идентификатор поля 2>,<идентификатор поля 3>:<тип полей 2, 3>;
vend;
Рядом с фиксированной запись может иметь переменную часть, которая имеет вид:
case <идентификатор признака>:<тип> of
<константа 1>:(<список полей и их типов 1>);
:
<константа k>:(<список полей и их типов k>);
где <идентификатор признака> может быть переменной только перечислимого типа. В зависимости от ее значения принимается тот или другой перечень полей. Соответствующие списки полей имеют общее расположение в памяти, длина переменной части определяется по длине наибольшего из списков. Переменные типа запись описываются общим порядком.
Обращение к полю записи:
<идентификатор переменной>.<идентификатор поля>
Значение признака при обращении к полям не проверяется, поэтому за корректностью данных нужно следить самостоятельно:
f.size:=5; => f.height:= 5; => f.radius:=5;
Поле записи в свою очередь тоже может быть структурированного типа
Обращение к полю в таком случае:
r.m.p:=true;
Обращение к элементу массива:
v.date[3]:=5;
Оператор присоединения WITH
Общий вид:
WITH <ссылка на переменную> do <оператор>;
где <ссылка на переменную> - идентификатор переменной типа запись. Если эта запись есть составной частью (полем) другой записи, то идентификаторы можно перечислять через запятую последовательно от внешнего уровня к внутреннего
Оператор используется для сокращенного обращения к полям записи. При этом можно указывать только идентификаторы полей, опуская идентификатор самой переменной.
Ссылка на несколько вложенных переменных типа запись имеет общий вид:
WITH V1,V2,..,Vn do S;
что эквивалентно
WITH V1 do
WITH V2 do
:
WITH Vn do S;
Массивы записей могут использоваться для образования "баз данных".
Типизированные файлы
var f: file of <тип элементов>
Типизированный файл - это файл, каждая запись которого имеет структуру и размер, которые определяются <типом элемента>.
Ввод / вывод
READ(f:file_type;var S1,..,Sn:type_of_zap);
Последовательно считываются записи S1, ...,Sn, указатель текущей записи устанавливается на очередную после Sn запись
type_of_zap - тип элемента типизированного файла, который определяется описанием соответствующей файловой переменной
WRITE(var f:file_type;var S1,...,Sn:type_of_zap);
Записи поочередно записываются в файл. Каждая запись типизированного файла обрабатывается по общим правилам работы в соответствии с его типом (типом элемента).
Внутренняя организация файла определяется при его создании и о ней надлежит помнить при обработке файла, в особенности при изменении типа файловой переменной
Процедуры и функции, связанные с позиционированием паказателя текущей записи
Для выполнения любой из этих процедур и функций файл надо открыть
seek(var f:file_type;n:longint);
- найти запись с номером n и установить на него указатель текущей записи
filepos(var f:file_type):longint;
- функция возвращает номер текущей записи (на который установлен указатель).
filesize(var f:file_type):longint;
- функция возвращает количество записей в файле. Пустой файл имеет 0 записей
truncate(var f:file_type);
- файл усекается в соответствии с текущим положением указателя, в это место записывается метка конца файла. <