Q를 실습해 봤습니다.

실습 내용은 은행의 창구와 대기표를 구현했습니다.

공부는 류종택님의 동영상 강의를 보면서 했습니다. 유용한 강의라 좋습니다.

 

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,TicketQueue ;

.

.

.


  private
    { Private declarations }
    FTicketQueue : TTicketQueue;
    procedure m_Display;
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.btnaddClick(Sender: TObject);
begin
   FTicketQueue.AddWaittingList;
   m_Display;
end;

procedure TfrmMain.btnTurn1Click(Sender: TObject);
var
   CurrNo : Integer;
begin
    if FTicketQueue.Empty then
    begin
       showMessage('대기하고 있는 손님이 없습니다.');
       exit;
    end;
   CurrNo := FTicketQueue.pop;
   memoDisplay.Lines.Values['[1번 창구]'] :=Format('  %d번 손님 창구로 오세요.',[CurrNo]);
   lblOne.Caption := IntToStr(CurrNo);
   m_Display;
end;

procedure TfrmMain.btnTurn2Click(Sender: TObject);
var
   CurrNo : Integer;
begin
    if FTicketQueue.Empty then
    begin
        showMessage('대기하고 있는 손님이 없습니다.');
        exit;
    end;
   CurrNo := FTicketQueue.pop;
   memoDisplay.Lines.Values['[2번 창구]'] :=Format('  %d번 손님 창구로 오세요.',[CurrNo]);
   lblTwo.Caption := IntToStr(CurrNo);
   m_Display;
end;

procedure TfrmMain.btnTurn3Click(Sender: TObject);
var
   CurrNo : Integer;
begin
    if FTicketQueue.Empty then
    begin
        showMessage('대기하고 있는 손님이 없습니다.');
       exit;
    end;
   CurrNo := FTicketQueue.pop;
   memoDisplay.Lines.Values['[3번 창구]'] :=Format('  %d번 손님 창구로 오세요.',[CurrNo]);
   lblThr.Caption := IntToStr(CurrNo);
   m_Display

end;

procedure TfrmMain.Button1Click(Sender: TObject);
begin
   FTicketQueue.Clear;
   memoDisplay.Lines.Clear;
   lblOne.Caption := '00';
   lblTwo.Caption := '00';
   lblThr.Caption := '00';
   m_Display;
end;

procedure TfrmMain.m_Display;
begin
    memoDisplay.Lines.Values['전체 대기자']:=IntToStr(FTicketQueue.Count);
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
    FTicketQueue := TTicketQueue.create;
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
    FTicketQueue.free;
end;

end.

 

 

unit TicketQueue;

interface
uses
   Classes, SysUtils;
  
type
   TTicketQueueNode = class
   private
   public
      Next : TTicketQueueNode;
      No : Integer;
   end;

   TTicketQueue = class
   private
      FHead, FTail   : TTicketQueueNode;
      FCurrentNo     : Integer;
      FCount         : Integer;
      function  GetEmpty : boolean;
   public
      procedure Clear;
      procedure AddWaittingList;
      function  pop:integer;
   published
      property Empty : Boolean read GetEmpty;
      property Count : Integer read FCount;
end;

implementation

procedure TTicketQueue.AddWaittingList;
var
   Item : TTicketQueueNode;
begin
   FCurrentNo  := FCurrentNo +1;
   FCount      := FCount + 1;

   Item := TTicketQueueNode.Create;
   Item.No := FCurrentNo;

   if FHead = nil then FHead := Item;

   if FTail <> nil then FTail.Next:= Item;
   FTail := Item;
   FTail.Next := nil;
end;

procedure TTicketQueue.Clear;
begin
   while Empty = False do pop;

   FCurrentNo  := 0;
   FCount      := 0;
end;


function TTicketQueue.GetEmpty:Boolean;
begin
   Result := FHead = nil;
end;

function TTicketQueue.pop: integer;
var
   item : TTicketQueueNode;
begin
   if Empty then raise Exception.Create('TicketQueue가 비어있습니다.');

   FCount  := FCount -1;
   item := FHead;
   FHead := FHead.Next;

   Result := item.No;

   FreeAndNil(item);
end;

end.