银行业务模拟:客户信息,及其银行业务

 

#include<stdio.h>
#include<stdlib.h>
#define MAX 100

struct Time//构建一个表示时间的结构体
{
	int gettime_hour;
	int gettime_minute;
	int gotime_hour;
	int gotime_minute;
	int serivetime;
};
typedef struct Array
{
	int num;
	int length;
};

typedef struct Client//构建一个客户的链队列来表示队伍
{
	Time t;
	struct Client *next;
	int num;
}*Queueptr;


typedef struct
{
	Client client;
	Queueptr front;
	Queueptr rear;
}LinkQueue;

int InitQueue(LinkQueue &Q) {    //初始化队列
	Q.front = Q.rear = new Client;
	if (!Q.front) {
		printf("初始化失败!\n");
		return NO;
	}
	Q.front->next = NULL;
	Q.client.t.gettime_hour = 0;
	Q.client.t.gettime_minute = 0;
	Q.client.t.gotime_hour = 0;
	Q.client.t.gotime_minute = 0;
	Q.client.t.serivetime = 0;
	printf("初始化成功!\n");
	return OK;
}
int EnQueue(LinkQueue &Q,int value) {//客户达到银行执行入队操作
	Client *p=new Client;
	p->num = value;
	int hour, minute;
	printf("请输入该客户的到达时间(格式为:几时几分):\n");
	scanf_s("%d%d", &hour, &minute);
	p->next = NULL;
	Q.rear->next = p;
	Q.rear = p;
	Q.client.t.gettime_hour = hour;
	Q.client.t.gettime_minute = minute;
	Q.client.num = value;
	return 1;
}
void DestroyQueue(LinkQueue &Q) {//销毁队列
	while (Q.front)
	{
		Q.rear = Q.front->next;
		delete(Q.front);
		Q.front = Q.rear;
	}
	printf("该队列已销毁\n");
}
int EmptyQueue(LinkQueue Q) {//判断队列是否为空,可以省略不写
	if (Q.front == Q.rear) {
		printf("该队列为空。\n");
		return 1;
	}
	printf("该队列不为空。\n");
	return 0;
} 

int OutQueue(LinkQueue &Q) {    //客户离开银行,执行出队操作
	int hour;
	int	mi;
	int value;
	printf("请输入第%d号客户离开的时间(几时几分):",Q.client.num);
	scanf_s("%d%d", &hour, &mi);
	Q.client.t.gotime_hour = hour;
	Q.client.t.gotime_minute = mi;
	Q.client.t.serivetime = (Q.client.t.gotime_hour - Q.client.t.gettime_hour) * 60 + Q.client.t.gotime_minute - Q.client.t.gettime_minute;
	int tt = Q.client.t.serivetime;
	if (EmptyQueue(Q) == 1)
		return 0;
	Queueptr p = Q.front->next;
	value = p->num;
	Q.front->next = p->next;
	if (Q.rear == p) {
		Q.rear = Q.front;
	}
	delete p;
	printf("第%d号客户已经离开。\n",value);
	return tt;
}

//银行开始营业
void  OpenForDay(LinkQueue &Q1, LinkQueue &Q2,LinkQueue &Q3, LinkQueue &Q4) {

	printf("初始化第一个窗口,");
	InitQueue(Q1);
	printf("初始化第二个窗口,");
	InitQueue(Q2);
	printf("初始化第三个窗口,");
	InitQueue(Q3);
	printf("初始化第四个窗口,");
	InitQueue(Q4);
}

//每当要执行操作命令时,执行该函数
int EventDrived(LinkQueue &Q1, LinkQueue &Q2, LinkQueue &Q3, LinkQueue &Q4, double *NumOfClients, double *tot_time,int *flag) {
	printf("+----------------------------------+\n");
	printf("|                                  |\n");
	printf("|     1->新客户到来                |\n");
	printf("|     2->客户离开                  |\n");
	printf("|     3->停止营业                  |\n");
	printf("|                                  |\n");
	printf("+----------------------------------+\n");
	int action=0;

	printf("请输入:");
	fflush(stdin);
	scanf_s("%d", &action);
	while (action <= 0 || action > 3) {
		printf("不符合要求,请重新输入:");
		scanf_s("%d", &action);
	}
	switch (action) {
	case 1:
		if (Q1.rear - Q1.front == 0) {
			printf("请客户去1号窗口排队!");
			*NumOfClients = *NumOfClients + 1;
			EnQueue(Q1, *NumOfClients);
			break;
		}
		else if (Q2.rear - Q2.front == 0) {
			printf("请客户去2号窗口排队!");
			*NumOfClients = *NumOfClients + 1;
			EnQueue(Q2, *NumOfClients);
			break;
		}
		else if (Q3.rear - Q3.front == 0) {
			printf("请客户去3号窗口排队!");
			*NumOfClients = *NumOfClients + 1;
			EnQueue(Q3, *NumOfClients);
			break;
		}
		else if (Q4.rear - Q4.front == 0) {
			printf("请客户去4号窗口排队!");
			*NumOfClients = *NumOfClients + 1;
			EnQueue(Q4, *NumOfClients);
			break;
		}
		else if (Q1.rear - Q1.front <= Q2.rear - Q2.front&&Q1.rear - Q1.front <= Q3.rear - Q3.front&&Q1.rear - Q1.front <= Q4.rear - Q4.front)
		{
			printf("请客户去1号窗口排队!");
			*NumOfClients = *NumOfClients + 1;
			EnQueue(Q1, *NumOfClients);
			break;
		}
		else if (Q2.rear - Q2.front < Q1.rear - Q1.front&&Q2.rear - Q2.front <= Q3.rear - Q3.front&&Q2.rear - Q2.front <= Q4.rear - Q4.front)
		{
			printf("请客户去2号窗口排队!");
			*NumOfClients = *NumOfClients + 1;
			EnQueue(Q2, *NumOfClients);
			break;
		}
		else if ((Q3.rear - Q3.front < Q1.rear - Q1.front&&Q3.rear - Q3.front < Q1.rear - Q1.front&&Q3.rear - Q3.front <= Q4.rear - Q4.front))
		{
			printf("请客户去3号窗口排队!");
			*NumOfClients = *NumOfClients + 1;
			EnQueue(Q3, *NumOfClients);
			break;
		}
		else if (Q4.rear - Q4.front < Q1.rear - Q1.front&&Q4.rear - Q4.front < Q3.rear - Q3.front&&Q4.rear - Q4.front < Q2.rear - Q2.front)
		{
			printf("请客户去4号窗口排队!");
			*NumOfClients = *NumOfClients + 1;
			EnQueue(Q4, *NumOfClients);
			break;
		}
	case 2:
		int a;
		printf("请输入第几号窗口的客户离开:");
		scanf_s("%d", &a);
		if (a == 1)
		{
			
			*tot_time = *tot_time + OutQueue(Q1);
			break;
		}
		else if (a == 2)
		{
			*tot_time = *tot_time + OutQueue(Q2);
			break;
		}
		else if (a == 3)
		{
			*tot_time = *tot_time + OutQueue(Q3);
			break;
		}
		else if (a == 4)
		{
			*tot_time = *tot_time + OutQueue(Q4);
			break;
		}
		else
		{
			printf("输入错误!\n");
			break;
		}
	case 3:
		*flag = 1;
		return 1;
	}
	return 0;
}

//关门停止营业操作,并计算每个客户平均逗留的时间
double CloseForDay(LinkQueue &Q1, LinkQueue &Q2, LinkQueue &Q3, LinkQueue &Q4, double *NumOfClients, double *tot_time)
{
	DestroyQueue(Q1);
	DestroyQueue(Q2);
	DestroyQueue(Q3);
	DestroyQueue(Q4);
	double T;
	double N;
	T = *tot_time;
	N = *NumOfClients;
	double AVE = T / N;

	printf("停止营业,今天银行里的客户平均逗留时间为:%f\n",AVE);
	return 0;
}

	int main()
	{
		LinkQueue Q1;
		LinkQueue Q2;
		LinkQueue Q3;
		LinkQueue Q4;
		int InitQueue(LinkQueue &Q);
		int EnQueue(LinkQueue &Q, int value);
		void DestroyQueue(LinkQueue &Q);
		int EmptyQueue(LinkQueue Q);
		int OutQueue(LinkQueue &Q);
		double NumOfClients = 0;
		double tot_time = 0;
		
		int flag=0;
		int EventDrived(LinkQueue &Q1, LinkQueue &Q2, LinkQueue &Q3, LinkQueue &Q4, double *NumOfClients, double *tot_time, int *flag);
		void OpenForDay(LinkQueue &Q1, LinkQueue &Q2, LinkQueue &Q3, LinkQueue &Q4);
		double CloseForDay(LinkQueue &Q1, LinkQueue &Q2, LinkQueue &Q3, LinkQueue &Q4, double *NumOfClients, double *tot_time);
		OpenForDay(Q1, Q2, Q3, Q4);
		while (flag==0) {
			EventDrived(Q1, Q2, Q3, Q4, &NumOfClients, &tot_time, &flag);
		}
		 CloseForDay(Q1, Q2, Q3, Q4,&NumOfClients, &tot_time);
		
		system("pause");
		return 0;
	}

 

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps: 问答会员年卡【8折】购 ,限时加赠IT实体书,即可 享受50次 有问必答服务,了解详情>>>https://t.csdnimg.cn/RW5m