6)测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。进行程序测试,以保证程序的稳定。
2. 模块结构
系统主要由2个模块组成,分别是:
① 主程序模块
② 队列模块--实现队列抽象数据类型
模块之间的结构如下:
各模块相互调用关系如下:
主程序模块
队列模块
3. 解题思路
各模块的实现步骤为
(1). 实现步骤
首先,分析题目要求划分实现模块、画出大致的流程图,定义基本数据类型,诸如结构体、队列等;
其次,考虑基本大致的操作,比如要拟定开门的时间、顾客到来为其提供服务以及离开时的操作等;
6
再次,针对上述的基本操作实现具体需要进行的操作,具体实现每个环节需要进行的基本操作,即具体编写每个小函数实现功能;
最后,编写主函数对每个实现进行按需调用,实现操作。
(2). 流程图
开始 客户到达
选择服务窗口
是 窗口忙
排队
服务并展开 否 队列空 队头取客户
窗口闲置 处理并离开 否 时间到
结束 图-1 事件流程图
7
结束 输出结果 队列是否为空 开始 main() Customerarrive() 进入or 离开 CutomDepation() () 图-2 主函数流程图
三、 实现
代码及注释 #define OK 1 #define TRUE 1 #define FALSE 0 #define ERROR 0
8
#define INFEASIBLE -1 #define OVERFLOW -2
typedef int Status;
//-----------------银行排队模拟 //事件和事件表 typedef struct QCuEvent { int OccurTime; int NType;
struct QCuEvent *next;
}QCuEvent, *EventList; //窗口前队列元素 typedef struct QCuElem { int ArrivalTime; int Duration;
struct QCuElem *next;
}QCuElem,*QEptr; //窗口指针 typedef struct { QEptr front;
QEptr rear;
}QCustomerp,*QCupp; //主要操作函数
9
Status OpenForDay(EventList &ev, QCuEvent en, QCupp &q);//开门 Status CustomerArrived(EventList &ev, QCupp &q, QCuEvent en);//顾客到达 Status CustomerDeparture(EventList &ev, QCupp &q, QCuEvent en);//顾客离开 void CloseForDay(); //基本操作函数
Status OrderInser(EventList &ev, QCuEvent en);//按时间顺序插入事件到事件表 int QLength(QCustomerp qn);//求窗口队列长度 int MinCuQueue(QCupp q);//求队最短的窗口
Status DelFirstEvent(EventList &ev);//删除事件表中的第一个事件 Status InitCuQueue(QCustomerp &qn);//初始化窗口队列 Status EnCuQueue(QCustomerp &qn,QEptr Q);//进入队列
Status DeCuQueue(QCustomerp &qn,QCuElem &Q);//删除队列中的元素 Status GetQHead(QCustomerp qn,QCuElem &Q);//获得队列中的第一个元素 Status DestoryQueue(QCustomerp qn);//销毁队列 void Ptint_QStatus(QCustomerp QCu[]);//打印队列长度 void Bank_SimulationFunc(); void test(char str[]);
#include \#include \#include \
int i=0,e=0,counter=0;
int TotalTime=0,CustomerNum=0; //累计客户逗留时间,客户数
10