Программирование >_<

Discussion in 'Болталка' started by StocKeR, 11 Dec 2009.

  1. StocKeR

    StocKeR Member

    Joined:
    2 Sep 2007
    Messages:
    0
    Likes Received:
    25
    Reputations:
    0
    Может ктонибудь пожалуйста помочь с дописанием кода для задачи ? :
    Создайте алгоритм и разработайте программу для следующего сценария. В файловой системе AFS на клиентских машинах файлы кэшируются целиком. Предположим, что дисковое пространство, выделенное под кэшируемые файлы переполнено. Алгоритм должен решать проблемы при запросе нового файла.

    Сырой код есть такой ...

    program FileShed;
    uses
    crt;
    const
    clients = 5;
    MaxCash = 1000;
    MaxQueueSize = 10;
    MaxProcessedFiles = 100;

    type
    TFile = record
    FileId: integer;
    ClientId: integer;
    ProcessBegin: integer;
    ProcessTime: integer;
    size: integer;
    end;
    TVFiles = array[1..MaxProcessedFiles] of TFile;

    TPtr=^TQueue;
    Tqueue=record
    f: TFile;
    next:TPtr;
    end;

    var
    FileId: integer;
    IsNewFile: boolean;
    ProcessedFiles: integer;
    v : TVFiles;
    i: longint;
    time: integer;
    NextFileBirth: integer;
    f: TFile;
    head, tail: TPtr;

    empty, full: boolean;
    CurrCash: integer;

    var
    a,b:TPtr;

    procedure message(time: integer; f: TFile; action: integer); forward;

    procedure add(var head, tail: TPtr; f:TFile);
    var
    curr: TPtr;
    begin
    new(curr);
    curr^.f:=f;
    curr^.next:=nil;
    if head=nil then
    head:=curr
    else
    curr^.next:=tail;
    tail:=curr;
    end;

    procedure del(var head, tail: TPtr; var f: TFile);
    var
    curr : TPtr;
    begin
    f := head^.f;
    curr := tail;
    if curr^.next=nil then
    begin
    head:=nil;
    tail:=nil;
    end
    else
    if curr^.next^.next=nil then
    head:=curr
    else
    repeat
    curr:=curr^.next;
    until curr^.next^.next=nil;
    head:=curr;
    head^.next:=nil;
    end;

    procedure print(q: TPtr);
    var
    curr:TPtr;
    begin
    clrscr;
    curr:=q;
    while curr<>nil do
    begin
    writeln(curr^.f.fileid, ' ', curr^.f.clientid);
    curr:=curr^.next;
    end;
    readln;
    end;

    procedure FinishFiles(
    var v: TVFiles;
    var ProcessedFiles: integer;
    CurrTime: integer);
    var
    i: integer;
    begin
    if ProcessedFiles > 0 then
    for i:= 1 to MaxProcessedFiles do
    if (v.ProcessBegin + v.ProcessTime = CurrTime) then
    begin
    CurrCash := CurrCash + v.size;
    message(time, v, 2);
    v.Fileid := 0;
    dec(ProcessedFiles);
    end;
    end;

    procedure message(time: integer; f: TFile; action: integer);
    var
    s: string[10];
    begin
    case action of
    1: s:= 'start';
    2: s:= 'finish';
    3: s:= 'put in queue';
    4: s:= 'refuse';
    else
    s:= 'unknown';
    end;
    writeln(time:4, f.fileId:4, f.clientid:4, f.size:4,
    f.ProcessBegin:4, f.ProcessTime:4, s);
    end;

    procedure StartProcess(
    f: TFile;
    var v: TVFiles;
    var CurrCash: integer;
    var ProcessedFiles: integer;
    CurrTime: integer);
    var
    i: integer;
    begin
    i:= 1;
    while (i<=MaxProcessedFiles) and (v.FileId<>0) do
    inc(i);
    v := f;
    v.ProcessBegin := CurrTime;
    CurrCash := CurrCash - f.size;
    inc(ProcessedFiles);
    message(time, v, 1);
    end;

    begin
    head := nil;
    tail := nil;
    time := 0; { начало отсчета }
    CurrCash := MaxCash;
    FileId := 1;
    Randomize;
    NextFileBirth := random(10);
    ProcessedFiles := 0; { нет файлов }
    writeln('time id client size begin total end action');
    writeln('==========================================');
    repeat
    IsNewFile := false;
    if time = NextFileBirth then
    begin
    NextFileBirth := time + 1+random(9);
    f.FileId := FileId;
    f.ClientId := 1+random(clients-1);
    f.ProcessBegin := 0;
    f.ProcessTime := 1+random(9);
    f.size := 1+random(99);
    IsNewFile := true;
    inc(FileId);
    end;
    if ProcessedFiles>0 then
    FinishFiles(v, ProcessedFiles, time);

    if not (Empty) then
    begin
    if CurrCash>=f.size then
    StartProcess(f, v, CurrCash, ProcessedFiles, time);
    end;

    if IsNewFile then
    begin
    writeln(CurrCash, '->', f.size);
    if CurrCash>=f.size then
    StartProcess(f,v,CurrCash,ProcessedFiles,time)
    else if not(full) then
    add(head, tail,f)
    else
    message(time, f, 4);
    {message;}
    end;
    inc(time);
    {write('$');}
    delay(50000);
    until keypressed;

    {
    Randomize;
    for i:= 1 to 10 do
    writeln(i,'->', random(10), '->', random(1000));
    }
    readln;
    end.

    {
    Задать количество клиентов
    Задать минимальный размер файла
    Задать размер кэша
    Время обработки от 1 до 10 секунд
    Время поступления файла с клиента в интервале от 1 до 10 секунд
    Установить начало отсчета

    Задать массив файлов
    номер файла
    номер клиента
    занимаемое место
    время начала обработки
    требуемое время
    }