Сейчас еще раз скопировал код из Ответов в программу. Выдает 97. Редакция Ответов - 12.5
В коде менял только название исходного файла - вместо Disk.in указал p_53_d.txt
Вот код из программы (к сожалению, отступы при копировании сохранить не получается):
var F: Text; { входной файл,
в первой строке - период опроса входной очереди,
в последующих - списки запросов }
Period: integer; { период опроса входной очереди }
TimeOut: integer; { таймаут чтения входной очереди }
Track: integer; { текущий запрос из внутренней очереди }
Position: integer; { текущая позиция головки }
ProgramResult: integer; { общее время работы программы }
{----------------------------------------------------------}
{ Постановка в очередь и извлечение из нее }
var Que: string; { очередь }
procedure PutInQue(aTrack: integer); { Постановка в очередь }
begin
Que:= Que + Char(aTrack); { добавляем в конец строки}
end;
function GetFromQue: integer; { Выбор из очереди }
begin
if Length(Que) = 0 { если очередь пуста }
then GetFromQue:= -1
else begin
GetFromQue:= Ord(Que[1]); { возвращаем первый элемент }
Delete (Que, 1, 1); { и удаляем его из очереди }
end
end;
{----------------------------------------------------------}
{ Проверка истечения таймаута
и чтение очередной порции запросов из строки файла }
procedure TimeOutHandler;
var N: integer;
begin
if TimeOut>0 then begin
Inc(ProgramResult); { общее время }
Dec(TimeOut);
end
else begin
TimeOut:= Period;
{ Если истек таймаут, читаем порцию из файла }
if not EoF(F) then begin
while not Eoln(F) do begin
Read(F, N);
PutInQue(N)
end;
Readln(F);
end;
end;
end;
{----------------------------------------------------------}
{ Обработка запроса на чтение-запись дорожки }
procedure QueryHandler (aTrack: integer);
begin
{ Write(aTrack:4); }
{ продвигаем головку в требуемую позицию }
while Position<>aTrack do begin
if Position<aTrack
then Inc(Position)
else Dec(Position);
TimeOutHandler; { таймаут чтения из файла }
end;
{ Один квант тратим на чтение-запись }
TimeOutHandler; { таймаут чтения из файла }
end;
{----------------------------------------------------------}
begin { Main }
ProgramResult:=0; { Общее время }
Position:=0; { позиция головки }
TimeOut:= 0; { таймаут }
Que:=''; { внутренняя очередь пуста }
Assign(F, 'p_53_d.txt'); Reset(F);
Readln(F,Period); { в первой строке - период опроса очереди }
repeat
Track:= GetFromQue; { извлекаем из внутр. очереди }
if Track>0
then QueryHandler(Track) { выполнить запрос }
else if Eof(F) { если входной файл пуст }
then Break { то выход }
else TimeOutHandler;{ а иначе отрабатываем таймаут
и читаем строку файла }
until false;
Write('Result= ',ProgramResult); Readln;
end.
Файл p_53_d.txt
20
100
Еще раз спасибо за книгу. Это просто потрясающе!