);
BAD_BALL = 3.3; {верхний предел балла кандидата на отчисление}
VERY_BAD_BALL = 2.7; {верхний предел балла отчисленного студента}
VAR
Student : Document; {переменная для чтения из входного файла} BadStudent : Kandidat; {переменная для записи в выходной список }
i,j,k : integer;
Fin : file of Document; {исходный файл документов студентов}
Fout : file of Kandidat; {создаваемый файл списка кандидатов }
BEGIN
Assign (Fin,'STUDENT.DAT');
Reset (Fin); {открытие исходного файла документов }
Assign (Fout,'BAD_STUD.DAT');
Rewrite(Fout); {открытие нового файла для списка }
i:=0; { i - старый номер студента в исходном файле }
j:=0; { j - новый номер студента в исходном файле после исключений }
while not SeekEof(Fin) do { пока не достигли конца файла }
Begin
Seek(Fin,i); { выбираем очередной номер из исходного файла }
Read(Fin,Student); { и считываем его в рабочую структуру }
if Student.Ball > VERY_BAD_BALL then {если балл выше критерия
на отчисление }
Begin
Seek(Fin,j); { ищем, куда этот документ надо записать в }
Write(Fin,Student); { исходный файл и записываем }
j:=j+1; { подсчет оставленных студентов
if Student.Ball < BAD_BALL then { если балл оставленного студента ниже критерия предупреждения }
Begin
BadStudent.Name := Student.Name; { формируем элемент } BadStudent.Groop := Student.Groop; { списка кандидатов }
Write(Fout, BadStudent); { и выводим очередную запись в файл }
end;
end;
i:=i+1; { подсчет просмотренных документов студентов }
end;
Close(Fout); { закрыли файл со списком кандидатов }
if i>j then { если кого-то исключили }
for k:=j+1 to i do { начиная со следующего документа за последним }
begin { оставленным студентом и до конца файла }
Seek(Fin,k) { подводим указатель на нужное место в файле }
Write(Fin, EMPTY); { и записываем туда пустой документ - вакансию } end;
Close(Fin); { закрытие исправленного исходного файла документов }
END.