{
В системе регистрации заявок сервисного центра
составляется список заявок в зависимости от
приоритета отправителя (если клиент постоянный
и важный приоритет - 0, если постоянный,
но можно ненадолго отложить - 1 и т.д.).
Сформировать список заявок, начиная с наивысшего
приоритета и вывести его на экран.
}
Program Requests;
Type
PRequestList = ^TRequest; { список заявок }
TRequest = Record { описание элемента списка}
req_text : string; { текст заявки }
req_rank : Byte; { приоритет заявки }
next : PRequestList; { следующая заявка в списке }
end;
TRankPosition = Record { диапазон заявок }
first : PRequestList; { начальная заявка в диапазоне }
last : PRequestList; { конечная заявка в диапазоне }
end;
TRankPosArray = array [0..255] of TRankPosition; { массив диапазонов по приоритетам }
Var
p : PRequestList; { указатель на список заявок }
rPos : TRankPosArray; { указатели на диапазоны заявок по приоритетам }
i : Byte; { переменная цикла }
{ Процедура аварийного завершения программы с описанием причины }
Procedure Fatal (msg : string);
begin
writeln;
writeln ('Ошибка: ', msg);
Halt (1);
end;
{ процедура считывания списка заявок из текстового файла }
{ файл содержит список заявок по одной на строке в виде <приоритет>-<текст заявки>}
Function LoadList (fname : string) : PRequestList;
var
f : text; { файловая переменная }
p : PRequestList; { указатель на начало списка }
q : PRequestList; { указатель на элемент списка }
s : string; { строка из файла }
r : Byte; { приоритет заявки }
i : Byte; { позиция разделителя в строке }
j : Byte; { переменная цикла }
ff : Boolean; { флаг успешного поиска }
e : Integer; { переменная для получения ошибки выполнения функции Val }
begin
{ Открытие файла с обработкой ошибок }
{$I-}
Assign (f, fname); Reset (f);
{$I+}
if IOResult <> 0 then Fatal ('Не могу открыть файл ' + fname + '!');
p := nil;
while not eof (f) do { вначале списка нет }
begin
readln (f, s); { читаем строку файла }
i := Pos ('-', s); { определяем позицию разделителя }
if i = 0 then continue; { игнорируем строки без раздилителя }
New (q); { создаем новую заявку }
Val (Copy (s, 1, i-1), r, e); { выбираем из строки приоритет }
q^.req_rank := r; { сохраняем его в заявку }
q^.req_text := Copy (s, i+1, length (s) - i); { записываем текст заявки }
ff := false;
if rPos [r].first = nil then begin { первая заявка с данным приоритетом }
rPos [r].first := q; { устанавливаем позиции начала }
rPos [r].last := q; { и конца диапазона с данным приоритетом }
if r > 0 then { если приоритет не высший }
for j := r - 1 downto 0 do { ищем ближайший не пустой диапазон заявок }
if rPos [j].last <> nil then begin { с более высоким приоритетом }
q^.next := rPos [j].last^.next; { добавляем новую заявку после }
rPos [j].last^.next := q; { последней в найденном диапазоне }
ff := true;
break; { и выходим из поиска }
end;
if not ff then begin { если ничего не нашли }
q^.next := p; { добавляем заявку }
p := q; { в начало списка }
end;
end
else begin { не первая заявка с данным приоритетом }
q^.next := rPos [r].last^.next; { корректируем границы диапазона заявок }
rPos [r].last^.next := q; { с данным приоритетом}
rPos [r].last := q;
end;
end;
Close (f); { закрываем файл }
LoadList := p; { возвращаем сформированный список }
end;
{ Процедура очистки экрана (вместо использования аналогичной процедуры из модуля Crt) }
Procedure ClrScr; assembler;
asm
mov ax, 3
int 10h
end;
{ Процедура вывода списка согласно приоритетам }
Procedure PrintList (a : TRankPosArray);
var
q : PRequestList; { указатель на элемент списка }
req_num : Byte; { количество выведенных заявок на текущем экране }
r : Byte;
{ Локальная процедура вывода информации о приоритете }
procedure PrintRank (r : Byte);
begin
ClrScr;
writeln ('Заявки с приоритетом ', r);
writeln ('------------------------');
req_num := 0;
end;
{ Локальная процедура вывода подсказки для пользователя после заполнения экрана }
procedure PrintQuery;
begin
writeln;
write ('Нажмите Enter...');
readln;
end;
begin
for r := 0 to 255 do
begin
if a [r].first <> nil then begin
PrintRank (r);
req_num := 0; { количество отображенных заявок - 0 }
q := a [r].first;
while q <> a [r].last^.next do { пока элементы не закончились }
begin
writeln (q^.req_text); { выводим текст заявки }
Inc (req_num); { увеличиваем число выведенных заявок }
if req_num = 20 then begin { если вывели 21 заявку - ждем реакцию пользователя }
PrintQuery; { реакция }
PrintRank (r); { выводим информацию о приоритете }
end;
q := q^.next; { переходим к следующему элементу }
end;
if req_num <> 0 then PrintQuery; { если были выведены элементы - ждем реакцию пользователя }
end;
end;
end;
{ Основная программа }
Begin
{ проверяем то, что при вызове задано имя файла }
if ParamCount = 0 then Fatal ('Должен быть задан параметр - имя файла со списком заявок!');
{ инициализация массива диапазонов }
for i := 0 to 255 do
begin
rPos [i].first := nil;
rPos [i].last := nil;
end;
p := LoadList (ParamStr (1)); { получить список заявок }
PrintList (rPos); { вывести список на экран }
End.
0-Q1-P0
1-Q1-P1
4-Q1-P4
3-Q1-P3
0-Q2-P0
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.