1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Задача на сортировку динамического списка., (по мере добавления)
Прошу посмотреть код на предмет логичности. Задача: Scheduling policy по методу "shortest job first".
1. Создание списка: {ПРОЦЕСС}-{ВРЕМЯ ВЫПОЛНЕНИЯ} и его сортировка по времени от меньшего к большему. 2. Вывод списка.
p.s.> так же реализованы функции "выполнить" задачу и создать список рандомных процессов, чтобы не забивать список вручную.
Код:
program STF;
uses crt,sysutils;
type
TData = record NAME: string; TIM_S: string; TIME: longint; end;
LINK = ^LIST;
LIST = record REC: TData; NEXT: LINK; end;
var i,H,M,S: integer; {счетчик, время в секундах } HH,MM,SS: string[2]; {время текстом} TimS: string[8]; sp, spN: LINK; {указатель на элемент и начало списка} z: LIST; {запись} menu: byte;
{-------------------} procedure Add(var L,Nach:link; R:list); {добавление записи в порядке} var p:link;
begin new(p); p^:=R;
{если список пуст} if L=nil then begin L:=p; Nach:=p; exit; end
else begin {вставка в начало} if R.rec.time<L^.rec.time then begin p^.next:=L; L:=p; Nach:=p; exit; end
else {вставка в середину} while L^.next<>nil do begin if ((R.rec.time>=L^.rec.time) and (R.rec.time<L^.next^.rec.time)) then begin p^.next:=L^.next; L^.next:=p; L:=Nach; exit; end;{if}
L:=L^.next; end;{while} {вставка в конец} L^.next:=p; end; {else} L:=Nach; {идем в начало списка} end;
procedure EXECUTE(var L:link); {"выполнение" процесса} begin L:=L^.next; writeln('TOP PRIORITY PROCESS HAS BEEN EXECUTED...'); readln; end;
procedure PRINT(L:link); {печать списка процессов} begin
if L<>nil then begin clrscr; while L<>nil do begin writeln('NAME: [',L^.rec.name:9,'] TIME: ',L^.rec.tim_s); L:=L^.next; end;
readln; end else begin writeln('SORRY, THERE IS NOTHING TO PRINT.'); readln; end; end;
{-------------------}
BEGIN {основной блок}
repeat clrscr;
writeln('1 - ADD PROCESS'); writeln('2 - EXECUTE TOP PRIORITY PROCESS'); writeln('3 - PRINT PROCESS LIST'); writeln('4 - LOAD THE SAMPLE LIST');writeln; writeln('0 - EXIT');writeln;
write('MENU = ');readln(menu);writeln;
case menu of 1:begin clrscr; write('NEW PROCESS NAME [e.g. calc]: ');readln(z.rec.name); write('NEW PROCESS TIME [xx:xx:xx]: ');readln(z.rec.tim_S);writeln; tims:=z.rec.tim_s;
for i:=1 to 20 do begin z.rec.name:='Process'+inttostr(i); H:=random(24);if H <10 then HH:='0'+inttostr(H) else HH:=inttostr(H); M:=random(60);if M <10 then MM:='0'+inttostr(M) else MM:=inttostr(M); S:=random(60);if S <10 then SS:='0'+inttostr(S) else SS:=inttostr(S);
z.rec.time:=H*3600+M*60+S; z.rec.tim_s:=HH+':'+MM+':'+SS; z.next:=nil; Add(sp,spN,z); end; writeln('LIST HAS BEEN LOADED...'); readln; end;