Задание 8. работа с внешними файлами
Подготовить данные об абитуриентах, поступающих в техникум. Информацию о каждом абитуриенте оформить в виде записи, содержащей следующие поля:
1. Фамилия, имя, отчество.
2. Год рождения.
3. Год окончания школы.
4. Оценки в аттестате.
5. Признак - нуждается ли в общежитии.
6. Оценки вступительных экзаменов.
Разработать программу записи подготовленных данных во внешний файл и программу обработки созданного внешнего файла.
I. Удалить из внешнего файла все записи абитуриентов, имеющих средний балл меньше 4 и хотя бы одну оценку 3 в аттестате, и распечатать информацию, оставшуюся в файле.
II. Добавить N записей в начало (конец) внешнего файла и распечатать записи абитуриентов, имеющих средний балл больше 4,5; N=4.
Program dom8;
type ev=record
alg:1..5;
ist:1..5;
evm:1..5;
end;
type zap=record
fio: string;
birthdae:1980..2000;
date:2000..2015;
attestat: ev;
need_hostel: boolean;
entrance: ev;
sredniy: real;
end;
fpk=file of zap;
type
TMyFuncType = function(a:zap): boolean;
var fizap,rb:fpk; s1,a,b:zap; i,j:integer; fio, s: string;
function all(a:zap): boolean;
begin
result:=true;
end;
function condition1(a:zap): boolean;
begin
if ((a.sredniy<4) and ((a.attestat.alg=3) or (a.attestat.ist=3) or (a.attestat.evm=3))) then result:=true
else result:=false;
end;
function condition2(a:zap): boolean;
begin
if ((a.sredniy>4.5)) then result:=true
else result:=false;
end;
function Delete(fizap:fpk): boolean;
var i, num:integer;
temp: zap;
begin
i:=1; num:=0;
reset(fizap);
repeat
read(fizap,a);
if (condition1(a)) then begin num:=i; break; end;
i:=i+1;
until eof(fizap);
result:=false;
if(num<>0) then begin
writeln('удаляем запись № ',num,' из ',filesize(fizap),' вторым способом');
seek(fizap, filesize(fizap) - 1);
read(fizap, temp);
seek(fizap, i - 1);
write(fizap, temp);
seek(fizap, filesize(fizap) - 1);
truncate(fizap);
close(fizap);
result:=true;
end;
end;
procedure PrintFile(fizap:fpk; p: TMyFuncType);
var a:zap; i:integer; s:string;
begin
i:=1;
reset(fizap);
writeln('======= вывод ===========');
repeat
read(fizap,a);
if p(a) then begin
s:='да';
if(a.need_hostel) then s:='нет';
writeln(i:2,' Фамилия: ',a.fio:9,', дата рождения: ',a.birthdae,', дата поступления: ',a.date,', общежитие: ', s: 3,
', аттестат: ',a.attestat.alg,',',a.attestat.ist,',',a.attestat.evm,'(',a.sredniy:1:2,'), экзамены: ',a.entrance.alg,',',a.entrance.ist,',',a.entrance.evm);
i:=i+1;
end;
until eof(fizap);
writeln('=======================================');
close(fizap);
end;
begin
{clrscr;}
assign(fizap,'res.dat');
assign(rb,'tmp.dat');
rewrite(fizap);
s1.fio:='Иванов';
s1.birthdae:=1996;
s1.date:=2013;
s1.attestat.alg:=5;
s1.attestat.ist:=5;
s1.attestat.evm:=5;
s1.need_hostel:=true;
s1.entrance.alg:=3;
s1.entrance.ist:=4;
s1.entrance.evm:=3;
s1.sredniy := (s1.attestat.alg+s1.attestat.ist+s1.attestat.evm)/3;
write(fizap,s1);
s1.fio:='Петров';
s1.birthdae:=1995;
s1.date:=2014;
s1.attestat.alg:=3;
s1.attestat.ist:=4;
s1.attestat.evm:=3;
s1.need_hostel:=false;
s1.entrance.alg:=5;
s1.entrance.ist:=4;
s1.entrance.evm:=4;
s1.sredniy := (s1.attestat.alg+s1.attestat.ist+s1.attestat.evm)/3;
write(fizap,s1);
s1.fio:='Сидоров';
s1.birthdae:=1997;
s1.date:=2012;
s1.attestat.alg:=3;
s1.attestat.ist:=2;
s1.attestat.evm:=5;
s1.need_hostel:=true;
s1.entrance.alg:=5;
s1.entrance.ist:=5;
s1.entrance.evm:=3;
s1.sredniy := (s1.attestat.alg+s1.attestat.ist+s1.attestat.evm)/3;
write(fizap,s1);
s1.fio:='Гришин';
s1.birthdae:=1998;
s1.date:=2012;
s1.attestat.alg:=5;
s1.attestat.ist:=3;
s1.attestat.evm:=4;
s1.need_hostel:=true;
s1.entrance.alg:=5;
s1.entrance.ist:=5;
s1.entrance.evm:=5;
s1.sredniy := (s1.attestat.alg+s1.attestat.ist+s1.attestat.evm)/3;
write(fizap,s1);
s1.fio:='Рыжков';
s1.birthdae:=1994;
s1.date:=2012;
s1.attestat.alg:=5;
s1.attestat.ist:=5;
s1.attestat.evm:=5;
s1.need_hostel:=true;
s1.entrance.alg:=5;
s1.entrance.ist:=5;
s1.entrance.evm:=5;
s1.sredniy := (s1.attestat.alg+s1.attestat.ist+s1.attestat.evm)/3;
write(fizap,s1);
s1.fio:='Николаев';
s1.birthdae:=1999;
s1.date:=2014;
s1.attestat.alg:=4;
s1.attestat.ist:=4;
s1.attestat.evm:=4;
s1.need_hostel:=false;
s1.entrance.alg:=3;
s1.entrance.ist:=2;
s1.entrance.evm:=3;
s1.sredniy := (s1.attestat.alg+s1.attestat.ist+s1.attestat.evm)/3;
write(fizap,s1);
s1.fio:='Васечкин';
s1.birthdae:=1996;
s1.date:=2014;
s1.attestat.alg:=5;
s1.attestat.ist:=4;
s1.attestat.evm:=3;
s1.need_hostel:=true;
s1.entrance.alg:=4;
s1.entrance.ist:=4;
s1.entrance.evm:=3;
s1.sredniy := (s1.attestat.alg+s1.attestat.ist+s1.attestat.evm)/3;
write(fizap,s1);
s1.fio:='Сыроежкин';
s1.birthdae:=1995;
s1.date:=2014;
s1.attestat.alg:=3;
s1.attestat.ist:=4;
s1.attestat.evm:=2;
s1.need_hostel:=false;
s1.entrance.alg:=5;
s1.entrance.ist:=2;
s1.entrance.evm:=3;
s1.sredniy := (s1.attestat.alg+s1.attestat.ist+s1.attestat.evm)/3;
write(fizap,s1);
s1.fio:='Соколов';
s1.birthdae:=1997;
s1.date:=2012;
s1.attestat.alg:=3;
s1.attestat.ist:=2;
s1.attestat.evm:=2;
s1.need_hostel:=true;
s1.entrance.alg:=2;
s1.entrance.ist:=5;
s1.entrance.evm:=3;
s1.sredniy := (s1.attestat.alg+s1.attestat.ist+s1.attestat.evm)/3;
write(fizap,s1);
close(fizap);
writeln('файл изначально:');
PrintFile(fizap, all);
writeln('записи для удаления');
writeln('(имеющим средний балл меньше 4 и хотя бы одну оценку 3 в аттестате):');
PrintFile(fizap, condition1);
rewrite(rb);
reset(fizap);
repeat
read(fizap,a);
if not(condition1(a)) then write(rb,a);
until eof(fizap);
rewrite(fizap);
reset(rb);
repeat
read(rb,a);
write(fizap,a);
until eof(rb);
close(rb);
close(fizap);
writeln('файл после удаления первым способом:');
PrintFile(fizap, all);
reset(fizap);
seek(fizap,FileSize(fizap));
s1.fio:='Жуков';
s1.birthdae:=1994;
s1.date:=2014;
s1.attestat.alg:=5;
s1.attestat.ist:=3;
s1.attestat.evm:=4;
s1.need_hostel:=false;
s1.entrance.alg:=3;
s1.entrance.ist:=4;
s1.entrance.evm:=3;
s1.sredniy := (s1.attestat.alg+s1.attestat.ist+s1.attestat.evm)/3;
write(fizap,s1);
s1.fio:='Фролов';
s1.birthdae:=1996;
s1.date:=2013;
s1.attestat.alg:=5;
s1.attestat.ist:=5;
s1.attestat.evm:=5;
s1.need_hostel:=true;
s1.entrance.alg:=3;
s1.entrance.ist:=5;
s1.entrance.evm:=5;
s1.sredniy := (s1.attestat.alg+s1.attestat.ist+s1.attestat.evm)/3;
write(fizap,s1);
s1.fio:='Журавлёв';
s1.birthdae:=1998;
s1.date:=2014;
s1.attestat.alg:=3;
s1.attestat.ist:=3;
s1.attestat.evm:=5;
s1.need_hostel:=false;
s1.entrance.alg:=3;
s1.entrance.ist:=4;
s1.entrance.evm:=5;
s1.sredniy := (s1.attestat.alg+s1.attestat.ist+s1.attestat.evm)/3;
write(fizap,s1);
s1.fio:='Симонов';
s1.birthdae:=1999;
s1.date:=2014;
s1.attestat.alg:=3;
s1.attestat.ist:=4;
s1.attestat.evm:=5;
s1.need_hostel:=false;
s1.entrance.alg:=4;
s1.entrance.ist:=4;
s1.entrance.evm:=5;
s1.sredniy := (s1.attestat.alg+s1.attestat.ist+s1.attestat.evm)/3;
write(fizap,s1);
close(fizap);
writeln('файл после добавления(Жуков, Фролов, Журавлёв, Симонов)');
PrintFile(fizap, all);
writeln('записи для удаления вторым способом');
writeln('(имеющим средний балл меньше 4 и хотя бы одну оценку 3 в аттестате):');
PrintFile(fizap, condition1);
repeat until not(Delete(fizap));
writeln('файл после удаления вторым способом:');
PrintFile(fizap, all);
writeln('вывод абитуриентов по второму условию');
writeln('(список абитуриентов, имеющих средний балл больше 4,5):');
PrintFile(fizap, condition2);
writeln('введите фамилию для поиска:');
read(fio);
reset(fizap);
writeln('результаты поиска:');
repeat
read(fizap,a);
if (a.fio = fio) then begin
s:='не нужно';
if(a.need_hostel) then s:='нужно';
writeln(' Фамилия: ',a.fio:9,', дата рождения: ',a.birthdae,', дата поступления: ',a.date,', общежитие: ', s: 8,
', аттестат: ',a.attestat.alg,',',a.attestat.ist,',',a.attestat.evm,', экзамены: ',a.entrance.alg,',',a.entrance.ist,',',a.entrance.evm);
end;
until eof(fizap);
close(fizap);
writeln('поиск завершен');
erase(rb);
end.
Результаты выполнения программы: