这是一个简单的模拟银行叫号系统,用c语言实现的。我的专业只学过C,翻阅学习了些数据机构的知识,然后开始编写的。一个初学程序的新手。往多多指点! 实现的功能:根据先来先服务的原则,模拟实现一个银行业务服务叫号系统(系统需求:客户到达银行首先取号,然后根据先来先服务的原则等待空闲业务服务窗口叫号,最后业务处理完离开) 系统主要分为3个功能模块,分别是:客户取号(客户创建)、叫号系统(业务服务安排)、退出。 客户取号界面:当客户到达时,在主菜单输入“1”,进入“客户到达界面”。此时界面会显示:客户的排队序号、到达时间。 叫号系统界面:在主菜单输入“2”,进入“叫号系统界面”。此时界面会显示“请耐心等待”,等待柜台客户业务处理的结束,直到柜台客户业务处理结束时,叫号系统界面会显示结束服务客户的客户信息(包括:序号、到达时间、等待时间、服务时间),若还有等待的客户就显示下一位服务客户的序号、服务的柜台号及客户等待的时间;若没有等待的客户就显示“已无等待客户”。 退出界面:在主菜单输入“0”,进入退出界面,显示“谢谢您的使用”后退出银行叫号模拟系统。
#include <stdio.h>
#include <malloc.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <windows.h>
int first = 1;//用于生成随机到达时间模块,判断是否第一次生成随机到达时间;
int hour;//用于生成随机到达时间,记入到达的小时;
int minute;//用于生成随机到达时间,记入到达的分钟;
int oldminute[10];//用于计算客户的等待时间的计数量,记入上一个客户到达时间的分钟;
int n = 1;//标志oldminute[]的索引位置;
int oldsever[10];//用于计算客户的等待时间的计数量,记入上一个客户的服务时间;
int tice = 1;//标记计算等待时间是索引位置;
int num = 1;//客户序号累加计数
typedef struct qnode
{
int custmerNumber;//客户序号;
char arriveTime[10];//客户到达时间;
char waitTime[10];//客户等待时间;
char serveTime[10];//客户服务时间;
struct qnode *next;
}CustmerQNode;
typedef struct
{
CustmerQNode *front;//队列头指针,指向队头元素;
CustmerQNode *rear;//队列胃指针,指向队尾元素;
}LiQueue;
/初始化队列,不带头结点的队列链表;/
void InitQueue(LiQueue *&q)
{
q=(LiQueue*)malloc(sizeof(LiQueue));
q->front=q->rear=NULL;
}
/实现队列的入队;/
void enQueue(LiQueue *q)
{
//封装结点;
CustmerQNode *s;
s=(CustmerQNode*)malloc(sizeof(CustmerQNode));
s->custmerNumber = num++;
/生成随机到达时间/
char time2[10];
char time3[10];
int ad;
if(first == 1)
{
for(int k = 0 ; k<5; k++)
{
hour = ((int)(4*(rand()/(RAND_MAX+1.0)))+8);
}
first = 0;
}
itoa(hour,time3,10);//itoa:把整数转换为字符串;
strcat(time3,"点");
for(int m = 0; m<5; m++)
{
ad = ((int)(4*rand()/(RAND_MAX+1.0)));
}
minute += ad;
minute += 2;
oldminute[n++] = minute;
itoa(minute,time2,10);//itoa:把整数转换为字符串;
strcat(time3,time2);
strcat(time3,"分");
strcpy(s->arriveTime,time3);
s->next=NULL;
if(q->rear==NULL)
{
q->front =s;
q->rear =s;
}
else
{
q->rear->next =s;
q->rear =s;
}
}
/修改客户信息:完成客户等待时间和服务时间的修改;/
int revamp(LiQueue *q)
{
if(q->rear == NULL)
return 0;
else
{
//随机生成服务时间
int sertime = 0;
int temp;
int wait;
for(int i = 0; i<5; i++)
{
temp = ((int)(4*rand()/(RAND_MAX+1.0))+5);
}
sertime += temp;
oldsever[tice] = sertime;
itoa(sertime,q->front->serveTime,10);
if(tice == 1)
{
wait = 0;
itoa(wait,q->front->waitTime,10);
strcat(q->front->waitTime,"分钟");
}
else
{
wait = oldsever[tice-1]-(oldminute[tice] - oldminute[tice - 1]);
if(wait < 0)
{
itoa(0,q->front->waitTime,10);
strcat(q->front->waitTime,"分钟");
}
else
{
itoa(wait,q->front->waitTime,10);
strcat(q->front->waitTime,"分钟");
}
}
tice++;
return 1;
}
}
/出队函数:删除客户信息,并返回删除的客户的基本信息/
int deQueue(LiQueue *q,int &DecCustmerNumber, char *DecArriveTime, char *DecServeTime,char *DecWaitTime)
{
CustmerQNode *t;
if(q->rear ==NULL)
return 0;
if(q->front == q->rear )//只有一个结点
{
t=q->front ;
q->front =NULL;
q->rear =NULL;
}
else
{
t=q->front;
q->front=q->front->next;
}
DecCustmerNumber = t->custmerNumber;
strcpy(DecArriveTime,t->arriveTime);
strcpy(DecServeTime,t->serveTime);
strcpy(DecWaitTime,t->waitTime);
free(t);
return 1;
}
void main()
{
LiQueue *q;
int id;//deQueue函数返回的客户序号;
char decarrive[10];//deQueue函数返回的客户到达时间;
char decserve[10];//deQueue函数返回的客户服务时间;
char decwait[10];//deQueue函数返回的客户等待时间;
char choose;//服务选项;
int bar = 1;//柜台号;
int second;//延时程序的循环计数;
InitQueue(q);
srand(time(0));
printf("银行叫号模拟系统\n");//创建3个业务服务窗口,通过7个客户来测试模拟系统;
printf("\n");
printf("=====================================\n");
printf("1. 客户取号(客户创建)\n");
printf("2. 叫号模拟(业务服务安排)\n");
printf("0. 退出\n");
printf("(按数字1、2、0,选择操作)\n");
printf("=====================================\n");
printf("\n");
while(1)
{
printf("请您输入服务选项:");
scanf("%c",&choose);
getchar();
switch (choose)
{
case '1'://1. 客户取号(客户创建)
enQueue(q);//客户加入队列;
printf("客户号%d\t到达时间:%s\n",q->rear->custmerNumber,q->rear->arriveTime);
printf("\n");
break;
case '2'://2. 叫号模拟(业务服务安排)
printf("请耐心等待...\n");
for(second = 0 ; second<5 ; second++)
{
Sleep(1000);//延时1秒
}
revamp(q);//修改客户的服务时间和等待时间;
deQueue(q,id,decarrive,decserve,decwait);//将完成服务的客户移出队列;
//客户业务处理完后,输出客户的状态信息(序号、到达时间、等待时间、服务时间)
printf("第%d位客户, 到达时间为:%s, 服务时间为:%s, 等待时间为:%s\n",id,decarrive,decserve,decwait);
if(q->front != NULL)//判断队列中是否还有等待的客户;
{
printf("请%d客户到第%d柜台\n",q->front->custmerNumber,bar++);
}
else
{
printf("已无等待客户\n");
}
printf("\n");
if(bar == 4)
{
bar = 1;
}
break;
case '0'://0. 退出
printf("谢谢您的使用!\n");
exit(1);
default :
printf("您输入的选择有误,请重新输入。\n");
break;
}
}
}
效果图截图: