银行排队系统
【问题描述】
试设计一个银行排队系统,模拟一般银行的日常对外营业服务,包括顾客到达、等待、办理业务及离开等事件。要求体现“先来先服务”的原则,将传统物理的多个顾客排队队列变为一个逻辑队列处理,顾客只需取票(即刻进队,排队),等待叫号即可。
【基本要求】
设计程序,要求能够实现以下功能:
(1)顾客到达银行时能拿到排队号码,并能知道需要等待的人数。如果是VIP顾客,那么能直接进入VIP窗口办理,无需加入普通顾客的等待;
(2)可以查看每个银行窗口正在给第几号顾客办理业务;
(3)顾客离开银行时,可以对银行窗口职员的服务进行评价。
感谢以下两位大佬,salute!
VS2022版:
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#include<conio.h>
static int i = 1;
void date();
void CustomerReview();
typedef struct QNode
{
int bianhao;//队内成员取到的号码
struct QNode* next;
}QNode, * QueuePtr;
typedef struct
{
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}Queue;//创建链式队列
void initQueue(Queue* q)//队列的初始化
{
q->front = q->rear = (QNode*)malloc(sizeof(QNode));
if (!q->front)//初始化失败退出
{
return;
}
q->front->next = NULL;
}
Queue s1, s2, s3;//创建三个队列窗口
int shows1()//显示1窗口人员
{
QNode* p = (QNode*)malloc(sizeof(QNode));
if (s1.front == s1.rear)
{//队列为空队列
printf("当前无排队人员 *\n");
return 0;
}
p = s1.front->next;
while (p)
{
printf("%d ", p->bianhao);
p = p->next;
}
printf("\n");
}
int shows2()//显示2窗口人员
{
QNode* p = (QNode*)malloc(sizeof(QNode));
if (s2.front == s2.rear)
{//队列为空队列
printf("当前无排队人员 *\n");
return 0;
}
p = s2.front->next;
while (p)
{
printf("%d ", p->bianhao);
p = p->next;
}
printf("\n");
}
int shows3()//显示3窗口人员
{
QNode* p = (QNode*)malloc(sizeof(QNode));
if (s3.front == s3.rear)
{//队列为空队列
printf("当前无排队人员 *\n");
return 0;
}
p = s3.front->next;
while (p)
{
printf("%d ", p->bianhao);
p = p->next;
}
printf("\n");
}
void show()//总显示窗口
{
printf("\n\t\t\t\t\t*1号窗口排队人员:");
shows1();
printf("\n\t\t\t\t\t*2号窗口排队人员:");
shows2();
printf("\n\t\t\t\t\t*3号窗口排队人员:");
shows3();
printf("\t\t\t\t\t");
system("pause");
}
void EnQueue1(Queue* q, int i)//队列插入
{
QNode* p = (QNode*)malloc(sizeof(QNode));
p->bianhao = i;
p->next = NULL;
q->rear->next = p;
q->rear = p;
}
int DeQueue(Queue* q, int e)//队列删除
{
if (q->front == q->rear)
{//队列为空队列
return 1;
}
QNode* p = (QNode*)malloc(sizeof(QNode));
p = q->front->next;
e = p->bianhao;
q->front->next = p->next;
if (q->rear == p)
{
q->rear = q->front;
}
free(p);
}
void EnQueue()//选择窗口插入
{
show();
printf("\t\t\t\t\t*********************************\n");
printf("\t\t\t\t\t*请选择窗口服务:\t\t*\n");
printf("\t\t\t\t\t*\t 1.1号窗口 *\n");
printf("\t\t\t\t\t*\t 2.2号窗口 *\n");
printf("\t\t\t\t\t*\t 3.3号窗口 *\n");
printf("\t\t\t\t\t*********************************\n");
int a;
printf("\t\t\t\t\t");
scanf_s("%d", &a);
switch (a)
{
case 1:
{
EnQueue1(&s1, i);
printf("\t\t\t\t\t*取号成功,你是1号窗口%d号,请等待办理*\n\t\t\t\t\t", i);
i++;
break;
}
case 2:
{
EnQueue1(&s2, i);
printf("\t\t\t\t\t*取号成功,你是2号窗口%d号,请等待办理*\n\t\t\t\t\t", i);
i++;
break;
}
case 3:
{
EnQueue1(&s3, i);
printf("\t\t\t\t\t*取号成功,你是3号窗口%d号,请等待办理*\n\t\t\t\t\t", i);
i++;
break;
}
default:
{
printf("\t\t\t\t\t* 无效窗口