银行叫号系统

anhongsen521 2009-04-22 01:06:53
【问题描述】
模拟银行叫号系统:当客户到达银行时,先取号(显示当前的客户号,以及正在等待的客户人数),此时,若有窗口空闲,则显示信息:请XXXX号客户到YY号窗口办理;否则客户等待。当有窗口空闲时,若有等待的客户,则显示信息:请XXXX号客户到YY号窗口办理。
【测试数据】
假设有3个窗口,前后共6个客户。
【选做内容】
当有VIP客户到达时,只要有窗口空闲,该客户优先办理。
...全文
2951 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
devil_111 2012-04-26
  • 打赏
  • 举报
回复
有没有C++的代码啊?
  • 打赏
  • 举报
回复
没看懂!
  • 打赏
  • 举报
回复
没看到主函数?
kekess 2010-03-17
  • 打赏
  • 举报
回复
谢谢!!
wdgphc 2009-05-06
  • 打赏
  • 举报
回复
生产者-消费者 问题?
ametree 2009-05-06
  • 打赏
  • 举报
回复
不知道用信号量 PV操作怎么样
VIP和GoTo语句一样,破坏程序美感啊!!
pornographer 2009-05-04
  • 打赏
  • 举报
回复
自己写一下
qq675927952 2009-05-03
  • 打赏
  • 举报
回复
友情up
wuyi8808 2009-05-03
  • 打赏
  • 举报
回复
C?
liuxu2559 2009-04-29
  • 打赏
  • 举报
回复
哈哈……,不用客气!
xuezhanliang6886 2009-04-29
  • 打赏
  • 举报
回复
真强·!
anhongsen521 2009-04-29
  • 打赏
  • 举报
回复
把下边替换了还是有一处错误没找到,正在找。。。
liuxu2559 2009-04-29
  • 打赏
  • 举报
回复
不好意思,检查不充分....把GetID函数换成下面的:
/*客户取号*/
void GetID(CLIENT_TYPE client_type)
{
Customer_Type *clt,*p;

clt=(Customer_Type *)malloc(sizeof(Customer_Type));
if(clt==NULL)
{
printf("malloc new client fail\n");
return;
}
ClientCount++; /*服务的客户计数*/
Queue_Count++;
/*本次客户信息初始化*/
clt->ID=ClientCount;
clt->STimer_Need=NeedServerTime;
clt->STimer_Count=0;
clt->IsVIP=client_type;
clt->next=NULL;

if(clt->IsVIP==COMMON_CLIENT) /*普通客户*/
{
if(head==NULL && tail==NULL) /*第一个排队的*/
{
head=tail=clt;
}
else /*排队的顾客*/
{
tail->next=clt;
tail=clt;
}
}
else /*VIP客户*/
{
if(head==NULL && tail==NULL) /*还没有人排队*/
{
head=tail=clt;
}
else
{

p=head;
while(p!=tail) /*若前面没有VIP客户,该客户排第一个,否则排前面VIP客户后*/
{
if(p->IsVIP!= VIP_CLIENT)
break;
p=p->next ;
}
if(p==tail)
{
tail->next=clt;
tail=clt;
}else if(p==head)
{
clt->next=p;
head=clt;
}
else
clt->next =p;
}
}
}
liuxu2559 2009-04-29
  • 打赏
  • 举报
回复

#include "stdio.h"
#include <conio.h>
#include <malloc.h>
#include <string.h>

#define WINDOWS_MAX 3 /*柜台数*/
#define NeedServerTime 65535 /*需要服务时间*/
#define TRUE 1
#define FALSE 0
typedef enum CLIENT_TYPE
{
COMMON_CLIENT,
VIP_CLIENT
};
typedef struct _Customer_Type
{
unsigned short ID; /*从柜台那到的ID*/
unsigned long STimer_Need; /*该顾客需要服务的时间*/
unsigned long STimer_Count; /*柜台已经服务的时间*/
CLIENT_TYPE IsVIP; /*是否是VIP客户*/
struct _Customer_Type *next;
}Customer_Type;
typedef struct _Windows_Type
{
Customer_Type clientInfo; /*正在服务的客户信息*/
unsigned char IsIdlesse; /*柜台当前是否空闲*/
}Windows_Type;


unsigned short ClientCount=0; /*已经接待客户计数*/
unsigned short Queue_Count=0; /*排队客户计数*/
Customer_Type *head,*tail;
Windows_Type windows[WINDOWS_MAX];

void Init(void); /*初始化程序*/
int GetInput(void); /*检测是否有键盘输入,及取号客户类型*/
void GetID(CLIENT_TYPE); /*客户取号*/
void IsIdlesseWindow(void); /*是否有柜台空闲*/
void CallClient(int ); /*柜台叫号*/
void PrintStatus(void); /*打印当前窗口服务信息*/


/*检测是否有键盘输入,并范围操作类型*/
int GetInput()
{
if(kbhit()) /*是否有键盘输入*/
{
char input;

input=getch();
switch(input)
{
case 'E':case 'e': /*退出程序*/
return 1;
break;
case 'V':case 'v': /*VIP客户*/
GetID(VIP_CLIENT);
break;
default: /*普通客户*/
GetID(COMMON_CLIENT);
break;
}
}
return 0;
}
/*客户取号*/
void GetID(CLIENT_TYPE client_type)
{
Customer_Type *clt,*p;

clt=(Customer_Type *)malloc(sizeof(Customer_Type));
if(clt==NULL)
{
printf("malloc new client fail\n");
return;
}
ClientCount++; /*服务的客户计数*/
Queue_Count++;
/*本次客户信息初始化*/
clt->ID=ClientCount;
clt->STimer_Need=NeedServerTime;
clt->STimer_Count=0;
clt->IsVIP=client_type;
clt->next=NULL;

if(clt->IsVIP==COMMON_CLIENT) /*普通客户*/
{
if(head==NULL && tail==NULL) /*第一个排队的*/
{
head=tail=clt;
}
else /*排队的顾客*/
{
tail->next=clt;
tail=clt;
}
}
else /*VIP客户*/
{
if(head==NULL && tail==NULL) /*还没有人排队*/
{
head=tail=clt;
}
else
{
p=head;
while(p->next !=NULL) /*若前面没有VIP客户,该客户排第一个,否则排前面VIP客户后*/
{
if(p->IsVIP!= VIP_CLIENT)
break;
p=p->next ;
}
clt->next =p;
if(p==head)
head=clt;
if(p==tail)
tail=clt;
}
}
}
/*打印窗口服务信息*/
void PrintStatus(void)
{
char buff[300];
char *p;

p=buff;
sprintf(p,"Queue[%d] ",Queue_Count-1);
p+=strlen(p);
for(int i=0;i<WINDOWS_MAX;i++)
{
if(windows[i].IsIdlesse==TRUE)
{
sprintf(p,"WIN%1d-IDLESSE \t",i+1);
}
else
{
if(windows[i].clientInfo.IsVIP)
sprintf(p,"WIN%1d-Client[%04d][VIP] \t",i+1,windows[i].clientInfo.ID );
else
sprintf(p,"WIN%1d-Client[%04d] \t",i+1,windows[i].clientInfo.ID );
}
p+=strlen(p);
}
printf("%s\n",buff);
}
/*是否有柜台空闲*/
void IsIdlesseWindow(void)
{
for(int i=0;i<WINDOWS_MAX;i++)
{
if(windows[i].IsIdlesse==TRUE)
{
CallClient(i); /*叫下一个客户*/
}
else
{
windows[i].clientInfo.STimer_Count++;
if(windows[i].clientInfo.STimer_Count == windows[i].clientInfo.STimer_Need)/*该客户业务完成*/
{
windows[i].IsIdlesse=TRUE;
CallClient(i); /*叫下一个客户*/
}
}
}
}
/*叫下一个客户*/
void CallClient(int IdlesseWindow)
{
if(head==NULL && tail==NULL)/*没有客户在排队*/
return;
if(head==tail)/*最后一个在排队的客户*/
{
memcpy(&windows[IdlesseWindow].clientInfo.ID,head,sizeof(Customer_Type));
free(head);
head=tail=NULL;
windows[IdlesseWindow].IsIdlesse=FALSE;
PrintStatus(); /*打印窗口服务信息*/
printf("********************[No queue]*******************\n");
Queue_Count--;
return;
}
if(head!=tail)
{
Customer_Type *p;

p=head;
memcpy(&windows[IdlesseWindow].clientInfo.ID,head,sizeof(Customer_Type));
head=head->next ;
free(p);
windows[IdlesseWindow].IsIdlesse=FALSE;
PrintStatus(); /*打印窗口服务信息*/
Queue_Count--;
}
return;
}
/*初始化变量*/
void Init(void)
{
for(int i=0;i<WINDOWS_MAX;i++)
windows[i].IsIdlesse=TRUE;
head=tail=NULL;
}
int main(int argc, char* argv[])
{
Init(); /*初始化信息*/
while(1)
{
if(GetInput()) /*退出程序*/
break;
IsIdlesseWindow();
}
return 0;
}

这下满意不?
anhongsen521 2009-04-29
  • 打赏
  • 举报
回复
我晕那!可能是我的错,我想要数据结构or c语言做出来!才在这里发表的,vb也做出来了,真是辛苦你了@_@
绿色夹克衫 2009-04-28
  • 打赏
  • 举报
回复
如果逻辑很复杂的话,比如优先级有多个,可以用多个队列来做,同一优先级的push到同一个队列,
叫号的时候,需要按照优先级从高到低,判断队列是否为空,一旦不为空,就pop该元素,分配到当前窗口!
fenix124 2009-04-28
  • 打赏
  • 举报
回复
之前去银行的时候一会儿就想通了这个事怎么做的了,很简单的
WizardOz 2009-04-28
  • 打赏
  • 举报
回复
【选做内容】
当有VIP客户到达时,只要有窗口空闲,该客户优先办理。
==============================

银行真讨厌,VIP就可以不排队。歧视咱穷人了。
liuxu2559 2009-04-28
  • 打赏
  • 举报
回复

Public Enum BANK_WINDOWS
UnServed '未被服务
WINDOW_1 '窗口1
WINDOW_2 '窗口2
WINDOW_3 '窗口3
End Enum
Public Enum CUSTOMER_CLASS
NORMAL_CUSTOMER
VIP_CUSTOMER
End Enum
Public Type Customer_Type
ID As Long '取的号
Service_Timer As Long '顾客需要服务的时间
Servied_Timer As Long '已经服务的时间
Window_ID As BANK_WINDOWS '所在窗口ID
Customer_Cls As CUSTOMER_CLASS '用户类型
End Type

Public Type Window_Type
Window_ID As Integer '窗口序号
Customer As Customer_Type '当前服务顾客
Is_Empty As Boolean '是否空闲
End Type

Const WINDOW_MAX = 3 '最大窗口数
Const SERVICE_TIME = 30 '每位顾客服务时间

Public Windows(1 To WINDOW_MAX) As Window_Type '窗口队列
Public Customer_Queue() As Customer_Type '顾客队列
Public Customer_Count As Long '接待客户计数

Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef saArray() As Any) As Long 'API判断数组为空
'******************************************************************************
'点击取号按钮取号
'取号
Public Function Entry_Queue(ByVal IsVip As Boolean)
Customer_Count = Customer_Count + 1
If SafeArrayGetDim(Customer_Queue) = 0 Then '第一个排队的顾客
ReDim Customer_Queue(0)
Customer_Queue(UBound(Customer_Queue)).ID = Customer_Count '该客户拿到的号码
If IsVip Then
Customer_Queue(UBound(Customer_Queue)).Customer_Cls = VIP_CUSTOMER 'VIP
Else
Customer_Queue(UBound(Customer_Queue)).Customer_Cls = NORMAL_CUSTOMER '非VIP
End If
Customer_Queue(UBound(Customer_Queue)).Service_Timer = SERVICE_TIME '顾客需要服务时间
Else '非第一个排队的顾客
ReDim Preserve Customer_Queue(UBound(Customer_Queue) + 1)
If IsVip Then 'VIP
Dim i
For i = 0 To UBound(Customer_Queue)
If Customer_Queue(i).Customer_Cls <> VIP_CUSTOMER Then
Dim j
For j = 0 To UBound(Customer_Queue) - i - 1
Customer_Queue(UBound(Customer_Queue) - j) = Customer_Queue(UBound(Customer_Queue) - j - 1)
Next j
Customer_Queue(i).ID = Customer_Count
Customer_Queue(i).Customer_Cls = VIP_CUSTOMER
Customer_Queue(i).Service_Timer = SERVICE_TIME
Exit For
End If
Next i
Else '非VIP
Customer_Queue(UBound(Customer_Queue)).ID = Customer_Count
Customer_Queue(UBound(Customer_Queue)).Customer_Cls = NORMAL_CUSTOMER
Customer_Queue(UBound(Customer_Queue)).Service_Timer = SERVICE_TIME
End If
End If
End Function
'********************************************************************************
'界面的显示部分
Private Function DisplayConent()
Dim i

For i = 1 To WINDOW_MAX
If Windows(i).Is_Empty = False Then
Dim idstr As String

idstr = Format(Windows(i).Customer.ID, "000000")
If Windows(i).Customer.Customer_Cls = VIP_CUSTOMER Then
idstr = idstr & " VIP"
End If
Form1.Label1(i - 1).Caption = "柜台" & i & " 客户:" & idstr & vbCrLf & Windows(i).Customer.Servied_Timer & "S"
Else
Form1.Label1(i - 1).Caption = "柜台" & i & "空闲"
End If
Next i
Form1.txt_Queue.Text = ""
If SafeArrayGetDim(Customer_Queue) = 0 Then Exit Function
For i = 0 To UBound(Customer_Queue)
Form1.txt_Queue.Text = Form1.txt_Queue.Text & Format(Customer_Queue(i).ID, "000000") & vbCrLf
Next i
End Function
'********************************************************************************
'叫号
Private Function CallCustomer(ByVal Empty_Window As Integer)
Dim i

If SafeArrayGetDim(Customer_Queue) = 0 Then Exit Function
Windows(Empty_Window).Is_Empty = False
Windows(Empty_Window).Customer = Customer_Queue(0)
If UBound(Customer_Queue) = 0 Then
Erase Customer_Queue
Exit Function
End If
For i = 0 To UBound(Customer_Queue) - 1
Customer_Queue(i) = Customer_Queue(i + 1)
Next i
ReDim Preserve Customer_Queue(UBound(Customer_Queue) - 1)
End Function
'********************************************************************************
'定时器处理,每隔一秒判断一次
Public Function Second_Handle()
Dim i

For i = 1 To WINDOW_MAX
If Windows(i).Is_Empty = True Then '柜台空闲,叫下一个顾客
Call CallCustomer(i)
Else
Windows(i).Customer.Servied_Timer = Windows(i).Customer.Servied_Timer + 1
If Windows(i).Customer.Servied_Timer = Windows(i).Customer.Service_Timer Then '顾客业务办理完
Windows(i).Is_Empty = True
End If
End If
Next i
Call DisplayConent '显示界面信息
End Function
'*********************************************************************************
'初试化部分
Private Function init()
Dim i
For i = 1 To WINDOW_MAX
Windows(i).Is_Empty = True
Next
CustomerCount = 0
End Function
'*********************************************************************************
'主程序
Sub Main()
Call init
Form1.Show
Form1.Timer1.Enabled = True
End Sub

界面窗体上放一个Timer,1个有3个元素的Label1控件数组和一个Textbox控件,一个Checkbox控件和一个按钮
绿色夹克衫 2009-04-24
  • 打赏
  • 举报
回复
可以用stl提供的优先队列来做,vip的编号从0开始,普通用户从10000开始!
加载更多回复(11)
技术选型1,前端微信小程序原生框架cssJavaScript2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云数据库云存储 1,小程序端1-1,首页首页有以下几个功能点点餐菜单浏览排号等位拨打电话顶部轮播图搜索菜品这里点餐分两种1,可以设置直接点餐直接点餐:适合小型饭店,或者奶茶类的快餐店。直接就可以下单,不用识别桌号2,也可设置扫码点餐扫码点餐适合中大型饭店,可以区分桌号,方便管理我后面会教大家如何生成桌号二维码,只需要把对应桌号的二维码贴在餐桌上,用户点击 扫码点餐 识别二维码,即可获取到桌号信息。1-2,菜品浏览页菜品浏览分两种1,不带分类适合菜品少的时候2,带分类菜品多的时候,带分类更方便客户选择不带分类 带分类 1-3,搜索功能我们这里搜索有两个触发方式1,直接点击搜索图标2,点击键盘上的搜索键1-4,搜索结果,支持模糊查询如我这里只搜‘鱼’,那么菜品中所有包含鱼的都可以搜索到 1-5,购物车首先菜品列表页可以直接添加商品到购物车购物车弹起后可以做如下操作1,增删单个菜品2,清空购物车3,删除菜品这些操作都和菜品列表是联动的,也就是菜品列表和购物车里增删个数,都是可以同步的。我会在项目预览章节的视频里做具体演示。1-6,下单页下单页就是确认订单后进行下单支付的。有以下功能1,点餐明细2,价格计算3,桌号地址4,就餐人数5,添加备注6,点击下单1-7,支付页支付页分两种方式1,模拟支付适合前期学习,毕业设计等演示类的场景。2,真实微信支付适合商用,但是使用微信支付必须要有营业执照,所以前期如果只是学习的话,建议使用模拟支付。 1-8,我的订单页我的订单页分以下几个状态1,新下单待上餐2,已上餐待评价3,订单完成4,订单取消1-9,提交评论页我们可以对店家进行评论。 1-10,评价列表页可以查看所有评价和自己的评价 1-11,排号等位可以看出,我们可以选择就餐人数,排大桌或者小桌。我这里已排小桌为例通过上图可以看出1,当前排号情况2,我的排号3,可以重新排号4,到号时会有到号提示后面我会把订阅消息功能加进来,这样到号后会有订阅消息提示。 1-12,个人中心个人中心分登录和未登录两种状态未登录已登录 1-13,微信授权登录小程序 2,后厨端和排号管理端2-1,后厨端主要供后厨的厨师使用1,可以查看当前新下单2,完成后可以操作菜品完成3,可以监听用户新下单4,有新订单时会有语音提示5,厨师登录页语音提示我会在视频课里具体演示厨师登录页 厨师管理页可以查看待制作订单用户新下单后,会有语音提示 2-2,排号管理页同样也有登录页,和上面厨师登录一样,这里重点看下排号管理页管理员可以查看当前排号情况,可以叫号。3,cms管理后台我们这里的可视化网页后台使用的时云开发自带的cms(内容管理)3-1,登录页 3-2,管理后台我们可以在这里 1,添加轮播图,删除轮播图,修改轮播图2,添加菜品,删除菜品,修改菜品,上架下架菜品3,管理订单4,查看评价5,管理后厨和排号管理员6,查看排号数据  比如我查询某个用户的所有订单 查询所有新下单还未上菜的订单 还有更多的功能,我会在视频课里给大家用视频来演示,这样更直观。 4,数据库数据库我们这里用云开发自带的云数据库餐厅管理员查看趋势图

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧