模拟银行叫号系统(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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值