模拟银行叫号系统(c代码)

这是一个简单的模拟银行叫号系统,用c语言实现的。我的专业只学过C,翻阅学习了些数据机构的知识,然后开始编写的。一个初学程序的新手。往多多指点! 实现的功能:根据先来先服务的原则,模拟实现一个银行业务服务叫号系统(系统需求:客户到达银行首先取号,然后根据先来先服务的原则等待空闲业务服务窗口叫号,最后业务处理完离开)   系统主要分为3个功能模块,分别是:客户取号(客户创建)、叫号系统(业务服务安排)、退出。   客户取号界面:当客户到达时,在主菜单输入“1”,进入“客户到达界面”。此时界面会显示:客户的排队序号、到达时间。   叫号系统界面:在主菜单输入“2”,进入“叫号系统界面”。此时界面会显示“请耐心等待”,等待柜台客户业务处理的结束,直到柜台客户业务处理结束时,叫号系统界面会显示结束服务客户的客户信息(包括:序号、到达时间、等待时间、服务时间),若还有等待的客户就显示下一位服务客户的序号、服务的柜台号及客户等待的时间;若没有等待的客户就显示“已无等待客户”。   退出界面:在主菜单输入“0”,进入退出界面,显示“谢谢您的使用”后退出银行叫号模拟系统。

<!-- lang: cpp -->

#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;

}

}

}

效果图截图: 在此输入图片描述

在此输入图片描述

转载于:https://my.oschina.net/u/998693/blog/125465

  • 9
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.问题的定义即分析 银行叫号系统中大概能分成两个对象:一个为来的顾客,一个为银行本身 顾客(Customer)里面需要包含有数据: 【1】每个顾客都应该有一个标签以用来区分,因此需要一个ID(cID) 【2】问题中有求等待的间,而有关等待间的两个变量即为进入银行间以及接受服务间(enterTime和startTime) 【3】由于题目中说明顾客的服务间不是固定的,因此每个顾客的服务间又有区别,所以需要有一个变量来进行表示(serTime) 【4】顾客接受服务完后离开的间(endTime) 综上:Customer中所需要的私有成员有(cID,enterTime,startTime,serTime,endTime) 而Customer的成员函数其实只是对以上数据进行输入输出,所以有成员函数有: 一系列的Set函数,一系列的Get函数,以及构造函数,复制函数,=的重载函数以及Reset函数 银行(bank)里面需要包含的数据: 银行中的人有两种状态,一是等待,二是接受服务,而这等待状态遵循先到先得的原则,因此,采用队列这种结构来表示这些状态比较合适,已经接受过服务的要反复输入输出,用容易遍历的数据类型vector 【1】处于等待状态的人(waiting) 【2】处于服务状态或已经接受过服务的人(serving) 由于经常要对waiting以及serving进行操作,所以不考虑将其作为私有成员(省去了Set以及Get函数) 考虑一下所含有的成员函数:Reset函数(保证银行是空的),Display函数(对已经接受过服务的以及正在服务的顾客进行展示),Assign()(断某个窗口是否是空的利用每次都改变的endTime - startTime == 随机生成的serTime判断 添加功能函数:查看最大等待间以及其对应的人数的函数Maxwaiting 2.类与算法设计 类设计: class Customer { private: int enterTime; //进入银行间 int startTime; //开始服务间 int cID; //顾客的编 int endTime; //顾客停止服务间 int serTime; //顾客服务从开始到结束服务所需要的间(随机的) public: Customer(); //默认构造函数 Customer(const Customer &new;_customer); //复制函数 Customer &operator;=(const Customer&old;_customer); //=重载函数 void Reset(); //重置,将所有数据归零 int GetServDurance(); //返回等待间 int GetEndTime(); //返回离开银行间 int GetSerTime(); //返回接受服务间 int GetStartTime();//返回开始接受服务间 int GetID(); //返回ID void SetEnterTime(int new_enter); void SetStartTime(int new_start); void SetEndTime(int new_end); void SetID(int new_ID); void SetSerTime(int new_sertime); }; class Bank { public: vector<Customer> serving; //在服务窗口接受过服务的人 queue<Customer> waiting; //在银行内等待的人 bool Assign(Customer customer); //判断第i个窗口的顾客是否服务完成 void Display(); //将在等待的人或者是已经接受了服务的人展示到屏幕上 void MaxWaiting(); void Reset(); }; 算法设计 随机数的产生: 【1】由于需要对过程进行模拟,所以需要一整套的模拟系统,包括产生随机人数,随机服务间等等 【2】事实上,银行服务窗口的更新是按照一定的间(即每隔几秒刷新一次),同样的人也是类似,因此需要几个单位间已确定进行这些随机事件发生的间隔 几个变量如下: const int UnitTime = 10;//单位间为10 const int ServTime = 5;//服务间为5-10 const int UnitTimePeo = 5;//单位间进来的人数为5-10; const int StopEnterTime = TimeSlot - 2 * UnitTime;//为了保证所有顾客能完成服务,顾客进入的间为0-80 const int PerTime = 5;//每隔5秒显示一次窗口信息 int TimeOfServing = 0;//随机生成的服务间(5-10) int Number = 0; //随机生成的人数(5-10) 通过这些变量以及srand((unsigned)time(0)),rand()即可产生一系列的随机数以便进行模拟 过程的模拟 每当产生一系列随机的人,就将他们放进waiting的队列中去,接着遍历各个窗口,若窗口为空,则先来的人可以去那个窗口(即push到serving,pop掉waiting),若不为空,则改变结束间,之后Present + 1 显示内容:剩余的间,各窗口的情况,以及已经接受了服务的人的等待间 注意:该程序为每五刷新一次,每十随机进入一些人

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值