diff --git a/README.md b/README.md index 92587d2..e485d77 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ 刘彩月,刘梦琦,金雨佳,赵亚璇 摘要:针对银行营业的工作记录和计算一天中客户在银行的逗留时间的问题。实现了模拟客户排队,窗口,管理客户,队列的功能。为了有效的存储和处理客户(客户到达,客户离开)采用有序表,其主要操作是插入和删除事件,用一个单链表表示。为了有效存储和处理窗口( 客户到达时间,离开时间)采用了队列。为了解决客户找到最短等待队列,使用了排序和插入算法,为了解决客户离开事件,使用了删除算法。删除和插入的算法效率为O(n)。针对银行开门,关门,营业窗口数目,客户到达时间,采用人机交互。完成了保存银行营业的工作记录,储存客户的到达时间和离开时间;显示出在某一天整个银行系统中客户在银行逗留的平均时间。 +项目开发过程中采用Kanban (看板)进行任务管理和分工协作,并使用Git对程序代码和文档进行版本管理。 任务分工及完成情况: |任务|设计|开发|测试|文档| @@ -27,35 +28,56 @@ ## 1.1问题描述 银行有n个窗口对外接待客户,从早晨银行开门起不断有客户进入银行。由于每个窗口在某时刻只能接待一个客户,因此在客户人多时需分别在各个窗口前排队。对于刚进入银行的客户,如果某个窗口的营业员正在空闲,则可上前办理业务;反之,若n个窗口均有客户正在办理业务,新来的客户便会排在人数最少的队伍后面。 -设计一个银行业务模拟系统,模拟银行的业务运行并计算一天中客户在银行逗留的平均时间。通过人机互交的方式设定程序所需要的参数:银行的开门时间和关门时间,营业窗口数目。客户的到达时间可通过人机互交,文件导入或随机产生的方式输入。保存银行营业的工作记录,储存客户的到达时间和离开时间。显示出在某一天整个银行系统中客户在银行逗留的平均时间。要求系统运行正常,功能完整;数据结构使用得当,算法有较高的效率;代码规范,可读性高,结构清晰,具有一定的健壮性,可靠性和可维护性。 +设计一个银行业务模拟系统,模拟银行的业务运行并计算一天中客户在银行逗留的平均时间。 +(1)通过人机互交的方式设定程序所需要的参数:银行的开门时间和关门时间,营业窗口数目。 +(2)客户的到达时间可通过人机互交,文件导入或随机产生的方式输入。 +(3)保存银行营业的工作记录,储存客户的到达时间和离开时间。 +(4)显示出在某一天整个银行系统中客户在银行逗留的平均时间。 +要求系统运行正常,功能完整;数据结构使用得当,算法有较高的效率;代码规范,可读性高,结构清晰,具有一定的健壮性,可靠性和可维护性。 ## 1.2可行性分析 运用了单链表和链队列,运用了排序,插入和删除的算法。 -客户排队的过程是一个按照到达时间先到先接受服务的过程,这一过程可以通过队列实现。n个不同的窗口对应n个队列,队列中每一个元素对应一个客户。算法中处理的事件有两类:一类是客户到来事件,另一类是客户离开事件。客户到来事件发生的时刻随客户到来自然形成,客户到来后,使用排序算法找到最短的等待队列,将客户插入队列;客户离开事件发生的时刻由银行窗口为其办理业务的完成时间决定,业务办理完成后,客户从等待队列中出队,窗口为下一个客户(如果存在的话)服务。 +客户排队的过程是一个按照到达时间先到先接受服务的过程,这一过程可以通过队列实现。n个不同的窗口对应n个队列,队列中每一个元素对应一个客户。 +算法中处理的事件有两类:一类是客户到来事件,另一类是客户离开事件。客户到来事件发生的时刻随客户到来自然形成,客户到来后,使用排序算法找到最短的等待队列,将客户插入队列;客户离开事件发生的时刻由银行窗口为其办理业务的完成时间决定,业务办理完成后,客户从等待队列中出队,窗口为下一个客户(如果存在的话)服务。 本项目涉及的对象主要包括客户、银行窗口,可以设计两个数据结构实现客户和窗口的功能。此外,管理客户、队列的功能可以单独实现(类似银行进门处的接待员,引导客户在哪里排队)。 ## 1.3 需求分析 ### (1)输入和输出 -确定系统的主要输入和输出,如可以设定的参数,数据文件等,明确其主要作用。 +主要输入:银行的营业时间 +主要输出:根据随机数输出实时银行运行状态;输出在银行营业时间内客户在银行逗留的平均时间。 +随机数: +(1)客户办理业务的时间当前客户 +(2)当前客户和下一个客户到达的间隔时间 + ### (2)数据字典 描述系统中需要处理的所有数据包含的具体信息。例如: -学生 = 学号 + 姓名 + 成绩 +OccurTime表示事件发生的时间; +NType表示客户的状态(办理业务中或离开); +ArrivalTime表示客户到达时间; +CustomerNum记录客户的数目; +CloseTime银行关门时间; +durtime客户办理业务的时间; +每个客户在银行的等待时间取决于队列里前一个节点的离开时间,而不是自己的到达时间+服务时间,即en.OccurTime + intertime; +在银行营业时间内总的办理业务的时间:TotalTime += en.OccurTime - customer.ArrivalTime; + ### (3)数据文件 -系统中需要读取xx数据文件以获取xx数据,或者需要导出xx数据。举例说明xx数据文件的具体格式。 +(1)当前客户的柜台被服务时间,当前客户和下一个客户到达的间隔时间用随机产生的方式输入。 +(2)保存银行营业的工作记录,储存客户的到达时间和离开时间。 +(3)显示出在某一天整个银行系统中客户在银行逗留的平均时间。 ### (4)参数设定 -系统开始运行时,需要设置的参数。可以用户手册的形式给出设定参数的过程,如系统提示信息和用户输入等。 +提示信息:请输入银行的营业时间(min): +用户输入:银行的营业时间(min) -### (5)XX功能 -其他具体功能。 -首先简要说明该功能的主要作用,可以用户手册的形式给出系统提示信息、用户输入和系统输出等。 +### (5)链表功能 +该功能的主要作用是:给客户分配银行窗口 -### (6)XX功能 -其他功能逐项列出。 +### (6)链队列功能 +该功能的主要作用是是:让客户有序高效办理业务 @@ -125,11 +147,144 @@ void bubble_sort(T a[], int n) # 4.系统测试 -描述测试的思路和方法。比如,先用小数据量进行测试,再用真实数据进行测试。 -测试应考虑到输入数据的特殊情况。 -给出若干测试用例,包括输入、预期结果、运行结果或是否通过测试。运行结果和预期结果一致,为通过测试。 - +``` +请输入银行的营业时间(min):30 +********action******** +一个新客户在银行营业 0min后进来,办理业务花费了25min,下一个客户过了 1min后进来 +窗口 1 有 1 个客户:(到达时刻 0 min 办理业务需要花费 25 min) +窗口 2 有 0 个客户:--Is empty. +窗口 3 有 0 个客户:--Is empty. +窗口 4 有 0 个客户:--Is empty. + +Current Eventlist is: +OccurTime:1,Event Type:0 +OccurTime:25,Event Type:1 + +********action******** +一个新客户在银行营业 1min后进来,办理业务花费了 6min,下一个客户过了 7min后进来 +窗口 1 有 1 个客户:(到达时刻 0 min 办理业务需要花费 25 min) +窗口 2 有 1 个客户:(到达时刻 1 min 办理业务需要花费 6 min) +窗口 3 有 0 个客户:--Is empty. +窗口 4 有 0 个客户:--Is empty. + +Current Eventlist is: +OccurTime:7,Event Type:2 +OccurTime:8,Event Type:0 +OccurTime:25,Event Type:1 + +********action******** +窗口 1 有 1 个客户:(到达时刻 0 min 办理业务需要花费 25 min) +窗口 2 有 0 个客户:--Is empty. +窗口 3 有 0 个客户:--Is empty. +窗口 4 有 0 个客户:--Is empty. + +Current Eventlist is: +OccurTime:8,Event Type:0 +OccurTime:25,Event Type:1 + +********action******** +一个新客户在银行营业 8min后进来,办理业务花费了 6min,下一个客户过了 7min后进来 +窗口 1 有 1 个客户:(到达时刻 0 min 办理业务需要花费 25 min) +窗口 2 有 1 个客户:(到达时刻 8 min 办理业务需要花费 6 min) +窗口 3 有 0 个客户:--Is empty. +窗口 4 有 0 个客户:--Is empty. + +Current Eventlist is: +OccurTime:14,Event Type:2 +OccurTime:15,Event Type:0 +OccurTime:25,Event Type:1 + +********action******** +窗口 1 有 1 个客户:(到达时刻 0 min 办理业务需要花费 25 min) +窗口 2 有 0 个客户:--Is empty. +窗口 3 有 0 个客户:--Is empty. +窗口 4 有 0 个客户:--Is empty. + +Current Eventlist is: +OccurTime:15,Event Type:0 +OccurTime:25,Event Type:1 + +********action******** +一个新客户在银行营业15min后进来,办理业务花费了25min,下一个客户过了 0min后进来 +窗口 1 有 1 个客户:(到达时刻 0 min 办理业务需要花费 25 min) +窗口 2 有 1 个客户:(到达时刻 15 min 办理业务需要花费 25 min) +窗口 3 有 0 个客户:--Is empty. +窗口 4 有 0 个客户:--Is empty. + +Current Eventlist is: +OccurTime:15,Event Type:0 +OccurTime:25,Event Type:1 +OccurTime:40,Event Type:2 + +********action******** +一个新客户在银行营业15min后进来,办理业务花费了 5min,下一个客户过了 7min后进来 +窗口 1 有 1 个客户:(到达时刻 0 min 办理业务需要花费 25 min) +窗口 2 有 1 个客户:(到达时刻 15 min 办理业务需要花费 25 min) +窗口 3 有 1 个客户:(到达时刻 15 min 办理业务需要花费 5 min) +窗口 4 有 0 个客户:--Is empty. + +Current Eventlist is: +OccurTime:20,Event Type:3 +OccurTime:22,Event Type:0 +OccurTime:25,Event Type:1 +OccurTime:40,Event Type:2 + +********action******** +窗口 1 有 1 个客户:(到达时刻 0 min 办理业务需要花费 25 min) +窗口 2 有 1 个客户:(到达时刻 15 min 办理业务需要花费 25 min) +窗口 3 有 0 个客户:--Is empty. +窗口 4 有 0 个客户:--Is empty. + +Current Eventlist is: +OccurTime:22,Event Type:0 +OccurTime:25,Event Type:1 +OccurTime:40,Event Type:2 + +********action******** +一个新客户在银行营业22min后进来,办理业务花费了13min,下一个客户过了 3min后进来 +窗口 1 有 1 个客户:(到达时刻 0 min 办理业务需要花费 25 min) +窗口 2 有 1 个客户:(到达时刻 15 min 办理业务需要花费 25 min) +窗口 3 有 1 个客户:(到达时刻 22 min 办理业务需要花费 13 min) +窗口 4 有 0 个客户:--Is empty. + +Current Eventlist is: +OccurTime:25,Event Type:0 +OccurTime:25,Event Type:1 +OccurTime:35,Event Type:3 +OccurTime:40,Event Type:2 + +********action******** +窗口 1 有 1 个客户:(到达时刻 0 min 办理业务需要花费 25 min) +窗口 2 有 1 个客户:(到达时刻 15 min 办理业务需要花费 25 min) +窗口 3 有 1 个客户:(到达时刻 22 min 办理业务需要花费 13 min) +窗口 4 有 1 个客户:(到达时刻 25 min 办理业务需要花费 27 min) + +Current Eventlist is: +OccurTime:25,Event Type:1 +OccurTime:35,Event Type:3 +OccurTime:40,Event Type:2 +OccurTime:52,Event Type:4 + +********action******** +窗口 1 有 0 个客户:--Is empty. +窗口 2 有 1 个客户:(到达时刻 15 min 办理业务需要花费 25 min) +窗口 3 有 1 个客户:(到达时刻 22 min 办理业务需要花费 13 min) +窗口 4 有 1 个客户:(到达时刻 25 min 办理业务需要花费 27 min) + +Current Eventlist is: +OccurTime:35,Event Type:3 +OccurTime:40,Event Type:2 +OccurTime:52,Event Type:4 + +********action******** +窗口 1 有 0 个客户:--Is empty. +窗口 2 有 1 个客户:(到达时刻 15 min 办理业务需要花费 25 min) + +Current Eventlist is: +List is empty. +The Average Time is 15.285714 +``` # 5. 总结 概况项目和完成情况。 diff --git a/vscode.cpp b/vscode.cpp index ff14ede..9d91679 100644 --- a/vscode.cpp +++ b/vscode.cpp @@ -72,10 +72,9 @@ Status QueueTraverse(LinkQueue Q);//遍历队列Q  /* 系统每次随机生成的是 -1)当前顾客顾客的柜台被服务时间 -2)当前顾客和下一个顾客到达的间隔时间 -记住这2点就便于理解整个代码 -每个顾客在银行的等待时间取决于队列里前一个节点的离开时间,而不是自己的到达时间+服务时间。*/ +1)当前客户的柜台被服务时间 +2)当前客户和下一个客户到达的间隔时间 +每个客户在银行的等待时间取决于队列里前一个节点的离开时间,而不是自己的到达时间+服务时间。*/ int main() { diff --git a/vscode.exe b/vscode.exe index b8793f3..6233138 100644 Binary files a/vscode.exe and b/vscode.exe differ