- // func3-1.cpp algo3-5.cpp、algo3-9.cpp和algo3-11.cpp要调用的函数、结构和全局变量
- struct PosType // 迷宫坐标位置类型
- {
- int x; // 行值
- int y; // 列值
- };
- #define MAXLENGTH 25 // 设迷宫的最大行列为25
- typedef int MazeType[MAXLENGTH][MAXLENGTH]; // 迷宫数组类型[行][列]
- // 全局变量
- MazeType m; // 迷宫数组
- int x,y; // 迷宫的行数,列数
- PosType begin,end; // 迷宫的入口坐标,出口坐标
- void Print()
- { // 输出迷宫的解(m数组)
- int i,j;
- for(i=0;i<x;i++)
- {
- for(j=0;j<y;j++)
- printf("%3d",m[i][j]);
- printf("/n");
- }
- }
- void Init(int k)
- { // 设定迷宫布局(墙为值0,通道值为k)
- int i,j,x1,y1;
- printf("请输入迷宫的行数,列数(包括外墙):");
- scanf("%d,%d",&x,&y);
- for(i=0;i<x;i++) // 定义周边值为0(外墙)
- {
- m[0][i]=0; // 行周边
- m[x-1][i]=0;
- }
- for(i=0;i<y-1;i++)
- {
- m[i][0]=0; // 列周边
- m[i][y-1]=0;
- }
- for(i=1;i<x-1;i++)
- for(j=1;j<y-1;j++)
- m[i][j]=k; // 定义除外墙,其余都是通道,初值为k
- printf("请输入迷宫内墙单元数:");
- scanf("%d",&j);
- printf("请依次输入迷宫内墙每个单元的行数,列数:/n");
- for(i=1;i<=j;i++)
- {
- scanf("%d,%d",&x1,&y1);
- m[x1][y1]=0; // 修改墙的值为0
- }
- printf("迷宫结构如下:/n");
- Print();
- printf("请输入入口的行数,列数:");
- scanf("%d,%d",&begin.x,&begin.y);
- printf("请输入出口的行数,列数:");
- scanf("%d,%d",&end.x,&end.y);
- }
- // func3-2.cpp algo3-6.cpp和algo3-7.cpp要调用的函数
- char Precede(SElemType t1,SElemType t2)
- { // 根据教科书表3.1,判断t1,t2两符号的优先关系('#'用'/n'代替)
- char f;
- switch(t2)
- {
- case '+':
- case '-':if(t1=='('||t1=='/n')
- f='<'; // t1<t2
- else
- f='>'; // t1>t2
- break;
- case '*':
- case '/':if(t1=='*'||t1=='/'||t1==')')
- f='>'; // t1>t2
- else
- f='<'; // t1<t2
- break;
- case '(':if(t1==')')
- {
- printf("括号不匹配/n");
- exit(ERROR);
- }
- else
- f='<'; // t1<t2
- break;
- case ')':switch(t1)
- {
- case '(':f='='; // t1=t2
- break;
- case'/n':printf("缺乏左括号/n");
- exit(ERROR);
- default :f='>'; // t1>t2
- }
- break;
- case'/n':switch(t1)
- {
- case'/n':f='='; // t1=t2
- break;
- case'(' :printf("缺乏右括号/n");
- exit(ERROR);
- default :f='>'; // t1>t2
- }
- }
- return f;
- }
- Status In(SElemType c)
- { // 判断c是否为7种运算符之一
- switch(c)
- {
- case'+' :
- case'-' :
- case'*' :
- case'/' :
- case'(' :
- case')' :
- case'/n':return TRUE;
- default :return FALSE;
- }
- }
- SElemType Operate(SElemType a,SElemType theta,SElemType b)
- { // 做四则运算a theta b,返回运算结果
- switch(theta)
- {
- case'+':return a+b;
- case'-':return a-b;
- case'*':return a*b;
- }
- return a/b;
- }
- // func3-3.cpp algo3-12.cpp和algo3-13.cpp用到的函数及变量等
- #include"c1.h"
- typedef struct // 定义ElemType为结构体类型
- {
- int OccurTime; // 事件发生时刻
- int NType; // 事件类型,Qu表示到达事件,0至Qu-1表示Qu个窗口的离开事件
- }Event,ElemType; // 事件类型,有序链表LinkList的数据元素类型
- #include"c2-5.h" // 从实际应用角度出发重新定义的线性链表结构
- typedef LinkList EventList; // 事件链表指针类型,定义为有序链表
- #include"bo2-6.cpp" // 基于c2-5.h存储结构的基本操作
- typedef struct
- {
- int ArrivalTime; // 到达时刻
- int Duration; // 办理事务所需时间
- }QElemType; // 定义队列的数据元素类型QElemType为结构体类型
- #include"c3-2.h" // 链队列存储结构
- #include"bo3-2.cpp" // 链队列基本操作
- // 程序中用到的主要变量(全局)
- EventList ev; // 事件表头指针
- Event en,et; // 事件,临时变量
- //FILE *fp; // 文件型指针,用于指向b.txt或d.txt文件
- long int TotalTime=0; // 累计客户逗留时间(初值为0)
- int CloseTime,CustomerNum=0; // 银行营业时间(单位是分),客户数(初值为0)
- int cmp(Event a,Event b)
- { // 依事件a的发生时刻<、=或>事件b的发生时刻分别返回-1、0或1
- if(a.OccurTime==b.OccurTime)
- return 0;
- else
- return (a.OccurTime-b.OccurTime)/abs(a.OccurTime-b.OccurTime);
- }
- void Random(int &d,int &i)
- { // 生成两个随机数
- d=rand()%Blsj+1; // 1到Blsj之间的随机数(办理业务的时间)
- i=rand()%(Khjg+1); // 0到Khjg之间的随机数(客户到达的时间间隔)
- }
- void OpenForDay();
- void CustomerArrived();
- void CustomerDeparture();
- void Bank_Simulation()
- { // 银行业务模拟函数
- Link p;
- OpenForDay(); // 初始化事件表ev且插入第1个到达事件,初始化队列
- while(!ListEmpty(ev)) // 事件表ev不空
- {
- DelFirst(ev,ev.head,p); // 删除事件表ev的第1个结点,并由p返回其指针,在bo2-6.cpp中
- // if(p->data.OccurTime<50) // 输出前50分钟内发生的事件到文件d.txt中
- // fprintf(fp,"p->data.OccurTime=%3d p->data.NType=%d/n",p->data.OccurTime,p->data.NType);
- en.OccurTime=GetCurElem(p).OccurTime; // GetCurElem()在bo2-6.cpp中,返回p->data(ElemType类型)
- en.NType=GetCurElem(p).NType;
- if(en.NType==Qu) // 到达事件
- CustomerArrived(); // 处理客户到达事件
- else // 由某窗口离开的事件
- CustomerDeparture(); // 处理客户离开事件
- } // 计算并输出平均逗留时间
- printf("窗口数=%d 两相邻到达的客户的时间间隔=0~%d分钟 每个客户办理业务的时间=1~%d分钟/n",Qu,Khjg,Blsj);
- printf("客户总数:%d, 所有客户共耗时:%ld分钟,平均每人耗时:%d分钟,",CustomerNum,TotalTime,TotalTime/CustomerNum);
- printf("最后一个客户离开的时间:%d分/n",en.OccurTime);
- }