数据结构大作业——银行排队系统

  • 离散事件模拟——银行业务处理
    • 题目分析
    • 声明部分
    • 辅助函数
      • 初始化窗口节点
      • 创建顾客节点
      • 比较四个窗口的排队人数
      • 输出离开顾客的信息
    • 主要函数
    • 完整的头文件代码

离散事件模拟——银行业务处理

假设银行有4个窗口为客户服务,某一时刻每个窗口仅能接待一位客户,客户众多时需要排队等候。 请模拟银行一天的业务活动,并统计客户在银行逗留的平均时间。

题目分析

根题目的要求,我们可以得到:

  1. 使用队列的数据结构模拟银行中顾客的行为;
  2. 利用一个指针数组来表示银行的四个窗口,并且再添加两个指针数组作为这四个队列的头指针与尾指针;
  3. 加入时间线以确定何时顾客进入,何时离开;
  4. 利用随机数生成顾客的进入与离开的时间;

声明部分

handle是用来对后续输出文本进行处理的;TIME是记录顾客在银行逗留的总时间的,用来求平均逗留时间。
柜台节点中除了一个指针链表,还存有各个柜台实时的排队人数。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
double TIME = 0.0;typedef struct Truck *Win;
typedef struct Node *Peo;
typedef struct Time *Tl;struct Truck//柜台节点
{int PeoNum[4];Peo Que[4];
};struct Node//人员节点
{int Num;int ArrTime;//到达时间int Departure;//离开时间Peo Next;
};struct Time//记录时间
{int Note;Tl Next;
};Tl Time;//创建离开时间线

辅助函数

初始化窗口节点

Win CreatWindows(Win W)
{for(int i=0;i<4;i++){W->PeoNum[i] = 0;W->Que[i] = NULL;}return W;
}

创建顾客节点

由于每次调用函数时,生成随机数的种子都会新生成一次,这是每次生成的随机数其实是一样的,我们这里在函数外生成随机数,并通过参数a和b传入,分别为到达时间与离开时间(以秒表示),num为此顾客的序号。
之后分别申请顾客节点P与时间节点T,由于我们不关注顾客的到达时间,所以其中时间节点中只储存每个顾客的离开时间。
最后将新生成的时间节点插入到离开时间线上合适的位置。

Peo CreatPeople(int a,int b,int num)
{Peo P = (Peo)malloc(sizeof(struct Node));Tl T = (Tl)malloc(sizeof(struct Time)),q = Time;P->ArrTime = a;P->Departure = b;P->Num = num;P->Next = NULL;T->Note = b;T->Next = NULL;while(q->Next != NULL){if(q->Next->Note > b)break;q = q->Next;}T->Next = q->Next;q->Next = T;return P;
}

比较四个窗口的排队人数

int Compare(Win W)
{int j = 0;for(int i = 0;i < 4;i++)if(W->PeoNum[i] < W->PeoNum[j])j = i;return j;
}

输出离开顾客的信息

这里主要是对输出信息进行了一个处理。

void ReadInformation(Peo P)
{char c[4];//存序号int m[3],n[3],//m存开始时间,n存结束时间a = P->Num,b = P->ArrTime,d = P->Departure;for(int i = 3;i >= 0;i--){c[i] = 48 + a % 10;a /= 10;}m[0] = b/3600+8;//假设8点开始营业b %= 3600;m[1] = b/60;m[2] = b%60;n[0] = d/3600+8;//假设8点开始营业d %= 3600;n[1] = d/60;n[2] = d%60;SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN);//变绿printf("\n%c%c%c%c - ArriveTime %02d:%02d:%02d - Departure %02d:%02d:%02d\n",c[0],c[1],c[2],c[3],m[0],m[1],m[2],n[0],n[1],n[2]);//输出用户信息(绿色字体)
}

主要函数

首先申请窗口节点和离开时间线的头结点并初始化:

 Win W = (Win)malloc(sizeof(struct Truck));Time = (Tl)malloc(sizeof(struct Time));Tl   pr;Time->Next = NULL;Time->Note = -1;W = CreatWindows(W);//创建窗口

声明首指针与尾指针,创建生成随机数的种子:

 Peo P,p[4],q[4];//q为首指针,p为尾指针int num = 1,min,i,j,a,b;srand((unsigned)time(NULL));

使用for循环实现时间的流动(模拟时间线):

 for(i = 0;i < 32400;i++)//假设每天工作9个小时(=32400秒){if((i == 0 || i == a) && i<31500)//顾客进入{a = rand()%601 + i;//制造一个随机进入时间b = rand()%301 + a;//制造一个随机离开时间TIME += (b - a);P = CreatPeople(a,b,num);//开始制作顾客min = Compare(W);//找到人数最少的窗口if(W->Que[min] == NULL)//将顾客分配到最短队列中{W->Que[min] = P;q[min] = P;}elsep[min]->Next = P;p[min] = P;if(q[min] != P)//进到队列中后,需要再加上前一个人的等待时间{Bef = q[min];while(Bef->Next != P)Bef = Bef->Next;P->Departure += (Bef->Departure - i);}W->PeoNum[min]++;num++;if(a == i)//解决两人同时进入的问题i--;}if(Time->Next != NULL && i == Time->Next->Note)//顾客离开{pr = Time->Next;for(j = 0;j < 4;j++)//找到需要离开的顾客所在的窗口if(W->Que[j] != NULL && W->Que[j]->Departure == i)break;ReadInformation(q[j]);//读取离开顾客的数据W->Que[j] = q[j]->Next;//出队W->PeoNum[j]--;free(q[j]);q[j] = W->Que[j];Time->Next = pr->Next;//删除时间节点free(pr);pr = Time->Next;i--;//解决离开时间相同的问题}}

输出平均逗留时间

 printf("\nThe average time of stay : %.4f s\n",TIME/num);

完整的头文件代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
double TIME = 0.0;typedef struct Truck *Win;
typedef struct Node *Peo;
typedef struct Time *Tl;struct Truck//柜台节点
{int PeoNum[4];Peo Que[4];
};struct Node//人员节点
{int Num;int ArrTime;int Departure;Peo Next;
};struct Time//记录时间
{int Note;Tl Next;
};Tl Time;//创建时间线Win CreatWindows(Win W)
{for(int i=0;i<4;i++){W->PeoNum[i] = 0;W->Que[i] = NULL;}return W;
}Peo CreatPeople(int a,int b,int num)
{Peo P = (Peo)malloc(sizeof(struct Node));Tl T = (Tl)malloc(sizeof(struct Time)),q = Time;P->ArrTime = a;//输入P的参数P->Departure = b;P->Num = num;P->Next = NULL;T->Note = b;T->Next = NULL;while(q->Next != NULL){if(q->Next->Note > b)break;q = q->Next;}T->Next = q->Next;q->Next = T;return P;
}int Compare(Win W)
{int j = 0;for(int i = 0;i < 4;i++)if(W->PeoNum[i] < W->PeoNum[j])j = i;return j;
}void ReadInformation(Peo P)
{char c[4];//存序号int m[3],n[3],//m存开始时间,n存结束时间a = P->Num,b = P->ArrTime,d = P->Departure;for(int i = 3;i >= 0;i--){c[i] = 48 + a % 10;a /= 10;}m[0] = b/3600+8;//假设8点开始营业b %= 3600;m[1] = b/60;m[2] = b%60;n[0] = d/3600+8;//假设8点开始营业d %= 3600;n[1] = d/60;n[2] = d%60;SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN);//变绿printf("\n%c%c%c%c - ArriveTime %02d:%02d:%02d - Departure %02d:%02d:%02d\n",c[0],c[1],c[2],c[3],m[0],m[1],m[2],n[0],n[1],n[2]);//输出用户信息(绿色字体)
}void TimeLine()
{Win W = (Win)malloc(sizeof(struct Truck));Time = (Tl)malloc(sizeof(struct Time));Tl  pr;Time->Next = NULL;Time->Note = -1;SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);//变红printf("Commence business!\n\n\n");Sleep(1000);Peo P,p[4],q[4];//q为首指针,p为尾指针int num = 1,min,i,j,a,b;W = CreatWindows(W);//创建窗口
//  SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN);//变绿srand((unsigned)time(NULL));for(i = 0;i < 32400;i++)//假设每天工作9个小时(=32400秒){if((i == 0 || i == a) && i<31500)//入队{a = rand()%601 + i;//制造一个随机进入时间b = rand()%301 + a;//制造一个随机离开时间TIME += (b - a);P = CreatPeople(a,b,num);//开始制作顾客min = Compare(W);if(W->Que[min] == NULL)//将顾客分配到最短队列中{W->Que[min] = P;q[min] = P;}elsep[min]->Next = P;p[min] = P;if(q[min] != P)//进到队列中后,需要再加上前一个人的等待时间{Bef = q[min];while(Bef->Next != P)Bef = Bef->Next;P->Departure += (Bef->Departure - i);}W->PeoNum[min]++;num++;if(a == i)i--;//解决两人同时进入的问题}if(Time->Next != NULL && i == Time->Next->Note)//出队{pr = Time->Next;for(j = 0;j < 4;j++)if(W->Que[j] != NULL && W->Que[j]->Departure == i)break;Sleep(50);ReadInformation(q[j]);W->Que[j] = q[j]->Next;W->PeoNum[j]--;free(q[j]);q[j] = W->Que[j];Time->Next = pr->Next;free(pr);pr = Time->Next;i--;//解决离开时间相同的问题}}printf("\nThe average time of stay : %.4f s\n",TIME/num);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);//变红printf("\nClose the door!\n");SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY);//变白
}

数据结构大作业——银行排队系统相关推荐

  1. 数据结构实验二(C语言):银行排队系统

    银行排队系统 [问题描述]假设银行只有2个窗口对外营业,顾客到银行办理业务,首先要取一个顺序号,然后排队等待叫号.被叫到号的顾客到柜台接受服务,服务完毕后离开.到了下班时间不再接收新来的顾客.顾客分为 ...

  2. QT4.7下的UI图形界面设计用例——银行排队系统

    这里写自定义目录标题 QT4.7的UI界面设计功能 效果展示 文件机制 UI功能详述 信号与槽机制(非常重要) 添加新文件 顶部菜单栏设定 菜单界面与点击下拉栏选项后界面切换 弹窗显示 主界面与弹窗界 ...

  3. 银行排队系统的设计与实现(源代码)

    (该系统在DEV编译器中不出现问题,在VC6.0中,要注意这样子设置就可以了,在"工程"->"设置"->"C/C++"-> ...

  4. 数据结构大作业-班级考勤管理系统

    简介 此程序是本人大二时期的数据结构大作业,初学数据结构和算法后所编写的一个程序,是一个班级考勤管理系统,可实现班级考勤信息的管理. 本程序使用C语言编写,使用Visual Studio 2019进行 ...

  5. 数据结构大作业之停车场管理系统

    数据结构大作业之停车场管理系统 安排: 1. 分析停车场的数据属性,并依据停车场管理的功能要求,确定模拟系统设计方案: 2. 完成停车场管理的数据结构设计工作,包括栈和队列的逻辑结构和存储结构等: 3 ...

  6. 用c语言银行队列系统,C语言学习之用队列实现银行排队系统

    队列操作的接口:http://blog..net/qlx846852708/article/details/43666927 数据结构C语言实现:http://blog..net/qlx8468527 ...

  7. C/C++《数据结构大作业》

    C/C++<数据结构大作业> 要求 一.作业目的 1. 掌握用数据结构的知识进行程序设计. 2. 应用所学的数据结构完成一个具有一定实际意义的应用程序的设计.编码.调试,锻炼实践动手能力, ...

  8. CC++《数据结构大作业》

    C/C++<数据结构大作业> 要求 一.作业目的 1. 掌握用数据结构的知识进行程序设计. 2. 应用所学的数据结构完成一个具有一定实际意义的应用程序的设计.编码.调试,锻炼实践动手能力, ...

  9. 校园导航系统java具有gui,[数据结构大作业]HBU Guide 河北大学校园导航

    [数据结构大作业]HBU Guide 河北大学校园导航 校园导航问题 实验报告介绍: 博客园 https://www.cnblogs.com/hx97/p/11967398.html CSDN htt ...

最新文章

  1. c 与java的区别_C/C++与java的区别
  2. ios iphonex适配
  3. java中可以作为GC Roots的对象
  4. 计算机网络(16)-计算机网络应用示例
  5. 超大杯来了!一加10 Ultra将在第三季度登场:或搭载OPPO 自研影像芯片
  6. 美国红帽软件公司是做什么的
  7. win7录屏_win7系统自带的录屏工具你用过吗?
  8. Mac Crack路欧词典(所有版本)
  9. 巧记肖特基二极管BAT54A(共阳),BAT54 C(共阴),BAT54 S(串联)
  10. OpManager如何解除五大网络丢包隐患?
  11. 论文查重究竟查的是什么?其核心算法是怎样的?
  12. 如何在 Windows 中删除运行历史记录
  13. Diligent收购领先的批判性见解和分析SaaS提供商Insightia
  14. C++内部链接与外部链接
  15. Anomalies,Factors,andMultiFactorModels
  16. 处nm是什么意思_nm是什么意思
  17. Oracle 19c遇到ORA-XXXX:????的问题的解决方案
  18. C语言 —— 函数(一)
  19. CAD看图软件中怎么镜像图形?CAD镜像应用实例
  20. 2021第三届长安杯检材三复盘

热门文章

  1. 【新知实验室】TRTC腾讯实时音视频动手实验
  2. SQL语句查询拼音码
  3. java 遍历出d盘所有文件_JAVA遍历一个文件夹中的所有文件
  4. IntelliJ IDEA使用教程(动图详解):实时代码模板的使用
  5. 【爬坑】解决“ImportError: cannot import name ‘soft_unicode‘ from ‘markupsafe‘ ”的问题
  6. 世界500强公司要求员工必须熟练掌握的七种工作方法
  7. abd连接手机的三种方法
  8. SpringBoot POI Word合并
  9. 备份恢复Lesson 06.Performing Backups
  10. 优化策略5 Label Smoothing Regularization_LSR原理分析