вторник, 15 октября 2013 г.

Структуры данных в Pasсal: список, очередь.

Материалы

Список. Создание списка путем добавления элементов в конец списка. Просмотр списка

Задание

В кассу на почте выстраивается очередь. Пока кассир обслуживает одного клиента, в очередь подходят еще трое. На обслуживание одного клиента уходит K секунд.
Кассир работает ровно T часов, потом идет обедать. Определите, сколько клиентов останется в очереди к началу обеда? Кто будет находится на кассе а начало обеда? Какой id будет у клиента, который окажется последним в очереди к началу обеда?
Формат входных данных
на ввод подаются сперва K - количество секунд на обслуживание одного клиента, затем T - время работы кассира в часах.

Формат выходных данных
В первой строчке вывести количество клиентов в очереди.
Во второй строчке вывести номер клиента, который окажется в начале очереди.
В третьей строчке вывести номер клиента, который окажется в конце очереди.
Клиенты нумеруются по порядку, начиная с 1.

Разбор задания
В цикле будем отсчитывать время работы кассира шагами по K секунд, пока оно будет меньше чем введенное значение T.
На каждой итерации цикла в очередь будут подходить три человека, а обслуживаться - один. Значит на каждой итерации нам следует добавить три элемента в очередь и удалить один, стоящий первым. При этом номер добавляемого клиента каждый раз будет увеличиваться на 1.
По окончании времени работы, выведем номер, хранящийся по указателю на первый и последний элемент.
Подсчитаем количество элементов в очереди и выведем его.

{Процедура добавления элемента в очередь}

{Объявление типа очередь}
Type
  PQueue = ^Queue;
  Queue = record
       Data : integer;
       Next : PQueue;

  end;

{Процедура добавления элемента в очередь}
Procedure AddElement(Var BeginQ, EndQ : PQueue; c : integer);
Var
  u : PQueue;
Begin
  new(u);
  u^.Data := c;
  u^.Next := Nil;
  if BeginQ = Nil {проверяем, пуста ли очередь}
    then
      BeginQ := u {ставим указатель начала очереди на первый созданный элемент}
    else
      EndQ^.Next := u; {ставим созданный элемент в конец очереди}
  EndQ := u; {переносим указатель конца очереди на последний элемент}
End;    

{Процедура удаления элемента из очереди}
procedure RemoveElement(Var BeginQ, EndQ : PQueue);
Var
  u, v : PQueue;
Begin
  u := BeginQ;
  if BeginQ = Nil {проверяем, пуста ли очередь}
    then
      writeln('Очередь пуста')
    else
    begin
      u:=BeginQ;
      BeginQ := BeginQ^.Next;
      dispose(u);
      if BeginQ = nil then EndQ := nil;
    end;
End;   

Домашнее задание

В кассу на почте выстроилась очередь. Пока кассир обслуживает одного клиента, в очередь подходят еще трое. На обслуживание одного клиента уходит K секунд.
Кассир работает ровно T часов, потом идет обедать. Определите, сколько клиентов останется в очереди к началу обеда? Кто будет находится на кассе а начало обеда? Какой id будет у клиента, который окажется последним в очереди к началу обеда?
Формат входных данных
на ввод подаются сперва K - количество секунд на обслуживание одного клиента, затем T - время работы кассира в часах.
После этого начинают вводится id клиентов пока не кончится время. (id - строка из букв латинского алфавита и цифр длиной не более 5 символов)


Формат выходных данных
В первой строчке вывести количество клиентов в очереди.
Во второй строчке вывести id клиента, который окажется в начале очереди.
В третьей строчке вывести id клиента, который окажется в конце очереди.



9 комментариев:

  1. Сулейманов Алексей15 октября 2013 г. в 15:55

    begin
    read (K,T);
    n:=T*3600;
    N:=N div K;
    dd:=1;
    E:=nil;
    B:=nil;
    for i:=1 to n do begin
    add(B,E,dd);
    add(B,E,dd);
    add(B,E,dd);
    remove(B);
    dd:=dd+3;
    end;
    s:=e-b;
    writeln (s+1);
    writeln (b^.data);
    writeln (e^.data);
    readln(k);
    end.

    ОтветитьУдалить
  2. var t,i,k,a,dd,l,s:integer; //tatarinzev
    var bq, eq:Plist;
    begin
    Readln(k,t);
    t:=t*3600;
    a:=t div k;
    bq:=nil;
    eq:=nil;
    dd:=1;
    for i:=1 to a do begin
    for l:=1 to 3 do
    add(bq,eq,dd);
    remove(bq);
    dd:=dd+3;
    end;
    s:=eq-bq;
    writeln(s);
    writeln(bq^.data);
    writeln(eq^.data);
    readln();
    end.

    ОтветитьУдалить
  3. Type
    PList = ^List;
    List = record
    Data : integer;
    Next : PList;

    end;

    Procedure AddElement(Var BeginQ, EndQ : PList; c : integer);
    Var
    u : PList;
    Begin
    new(u);
    u^.Data := c;
    u^.Next := Nil;
    if BeginQ = Nil
    then
    BeginQ := u
    else
    EndQ^.Next := u;
    EndQ := u;
    End;

    procedure RemoveElement(Var BeginQ, EndQ : PList);
    Var
    u, v : PList;
    Begin
    u := BeginQ;
    if BeginQ = Nil
    then
    writeln('Очередь пуста')
    else
    begin
    u:=BeginQ;
    BeginQ := BeginQ^.Next;
    dispose(u);
    end;
    End;
    var k,t,i,w,q:integer; B,E:Tlist

    begin
    writeln(k);
    writeln(t);
    w:=t*3600;
    while k<w do begin



    end. Москаленко Александр 11б

    ОтветитьУдалить
  4. Денцов Дмитрий15 октября 2013 г. в 15:58

    begin
    readln(k,t);
    n:=0;
    s:=k;
    new(beginq);
    new(endq);
    beginq^.data:=0;
    beginq^.next:=nil;
    endq^.data:=0;
    endq^.next:=nil;
    while t>s do begin
    for i:=1 to 3 do
    adde(beginq,endq,n+i);
    reme(beginq);
    n:=n+3;
    s:=s+k;
    end;
    writeln(beginq^.data-1);
    writeln(endq^.data+3);
    readln();
    end.

    ОтветитьУдалить
  5. begin
    readln(k);
    readln(t);
    t:=t*3600;
    n:=0;
    s:=k;
    new(beginq);
    new(endq);
    beginq^.data:=0;
    beginq^.next:=nil;
    endq^.data:=0;
    endq^.next:=nil;
    while t>s do
    begin
    for i:=1 to 3 do
    addel(beginq,endq,n+i);
    delel(beginq);
    n:=n+3;
    s:=s+k;
    end;
    writeln(beginq^.data-1);
    writeln(endq^.data+3);
    readln
    end.

    ОтветитьУдалить
  6. Type PList:^TList;
    TList = record
    data:integer;
    Next:PList;
    var BeginQ, EndQ, tmp:PList;
    procedure AddElement (var beginQ, EndQ:PList, d:integer)
    begin
    new(tmp);
    tmp^.data := d;
    tmp^.next := nil;
    if beginQ=nil then
    begin
    BeginQ := tmp;
    EndQ := tmp;
    end;
    else begin
    EndQ^.next := d;
    EndQ := tmp;
    end ;
    end;
    procedure remoE (var BeginQ: PList);
    var tmp;PList;
    begin
    if BeginQ><nil then
    begin
    tmp := beginq;
    BeginQ := tmp^.next;
    Dispose(tmp);

    begin
    end.

    ОтветитьУдалить
  7. Коваленко Елизавета15 октября 2013 г. в 16:01

    begin
    readln(k,t);
    t:=3600*t;
    n:=0;
    beginq.data:=0;
    beginq:=nil;
    endq.data:=0;
    endq.next:=nil;
    while t>k do begin
    for i:=1 to 3 do
    AddElement(beginq,endq,n+i);
    remoelement(beginq) ;
    n:=n+3;
    s:=s+k;
    end;
    writeln(beginq.data);
    writeln(endq.data) ;
    readln()

    ОтветитьУдалить
  8. begin
    write('k=');
    readln(k);
    write('t=');
    readln(t);
    n:=t*3600;
    n:=n div k;
    for i:= 1 to n do
    begin
    addelement(a,b,c);
    inc(c);
    addelement(a,b,c);
    inc(c);
    addelement(a,b,c);
    inc(c);
    delelement(a);

    ОтветитьУдалить
  9. Харламов Андрей15 октября 2013 г. в 16:02

    begin
    write('k=');
    readln(k);
    write('t=');
    readln(t);
    n:=0;
    s:=k;
    new(beginq);
    new(endq);
    beginq^.data:=0;
    beginq^.next:=nil;
    endq^.data:=0;
    endq^.next:=nil;
    while t>s do begin
    for i:=1 to 3 do
    addelement(beginq,endq,n+i);
    removeelement(beginq);
    n:=n+3;
    s:=s+k;
    end;
    writeln(beginq^.data-1);
    writeln(endq^.data+3);
    readln();
    end.

    ОтветитьУдалить