三木社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 334|回复: 0
打印 上一主题 下一主题

C语言数据结构-algo3-12.c

[复制链接]

1562

主题

1564

帖子

4904

积分

博士

Rank: 8Rank: 8

积分
4904
跳转到指定楼层
楼主
发表于 2017-9-1 08:26:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /* algo3-12.c 银行业务模拟。实现算法3.6、3.7的程序 */
  2. #define Qu 4 /* 客户队列数 */
  3. #define Khjg 5 /* 两相邻到达的客户的时间间隔最大值 */
  4. #define Blsj 30 /* 每个客户办理业务的时间最大值 */
  5. #include"c1.h"

  6. typedef struct /* 定义ElemType为结构体类型 */
  7. {
  8.    int OccurTime; /* 事件发生时刻 */
  9.    int NType; /* 事件类型,Qu表示到达事件,0至Qu-1表示Qu个窗口的离开事件 */
  10. }Event,ElemType; /* 事件类型,有序链表LinkList的数据元素类型 */

  11. #include"c2-5.h"
  12. typedef LinkList EventList; /* 事件链表类型,定义为有序链表 */
  13. #include"bo2-6.c" /* 使用已有的链表基本操作 */

  14. typedef struct
  15. {
  16.    int ArrivalTime; /* 到达时刻 */
  17.    int Duration; /* 办理事务所需时间 */
  18. }QElemType; /* 定义QElemType(队列的数据元素类型)为结构体类型; */

  19. #include"c3-2.h"
  20. #include"bo3-2.c" /* 使用已有的队列基本操作 */

  21. /* 程序中用到的主要变量(全局)。算法3.7 */
  22. EventList ev; /* 事件表 */
  23. Event en; /* 事件 */
  24. Event et; /* 临时变量 */
  25. LinkQueue q[Qu]; /* Qu个客户队列 */
  26. QElemType customer; /* 客户记录 */
  27. int TotalTime=0,CustomerNum=0; /* 累计客户逗留时间,客户数(初值为0) */
  28. int CloseTime; /* 银行营业时间(单位是分) */

  29. int cmp(Event a,Event b)
  30. { /* 依事件a的发生时刻<、=或>事件b的发生时刻分别返回-1、0或1 */
  31.    if(a.OccurTime==b.OccurTime)
  32.      return 0;
  33.    else
  34.      return (a.OccurTime-b.OccurTime)/abs(a.OccurTime-b.OccurTime);
  35. }

  36. void OpenForDay()
  37. { /* 初始化操作 */
  38.    int i;
  39.    InitList(&ev); /* 初始化事件链表为空 */
  40.    en.OccurTime=0; /* 设定第一个客户到达事件 */
  41.    en.NType=Qu; /* 到达 */
  42.    OrderInsert(&ev,en,cmp); /* 插入事件表 */
  43.    for(i=0;i<Qu;++i) /* 置空队列 */
  44.      InitQueue(&q[i]);
  45. }

  46. void Random(int *d,int *i)
  47. {
  48.    *d=rand()%Blsj+1; /* 1到Blsj之间的随机数 */
  49.    *i=rand()%Khjg+1; /* 1到Khjg之间的随机数 */
  50. }

  51. int Minimum(LinkQueue Q[]) /* 返回最短队列的序号 */
  52. {
  53.    int l[Qu];
  54.    int i,k;
  55.    for(i=0;i<Qu;i++)
  56.      l[i]=QueueLength(Q[i]);
  57.    k=0;
  58.    for(i=1;i<Qu;i++)
  59.      if(l[i]<l[0])
  60.      {
  61.        l[0]=l[i];
  62.        k=i;
  63.      }
  64.    return k;
  65. }

  66. void CustomerArrived()
  67. { /* 处理客户到达事件,en.NType=Qu */
  68.    QElemType f;
  69.    int durtime,intertime,i;
  70.    ++CustomerNum;
  71.    Random(&durtime,&intertime); /* 生成随机数 */
  72.    et.OccurTime=en.OccurTime+intertime; /* 下一客户到达时刻 */
  73.    et.NType=Qu; /* 队列中只有一个客户到达事件 */
  74.    if(et.OccurTime<CloseTime) /* 银行尚未关门,插入事件表 */
  75.      OrderInsert(&ev,et,cmp);
  76.    i=Minimum(q); /* 求长度最短队列的序号,等长为最小的序号 */
  77.    f.ArrivalTime=en.OccurTime;
  78.    f.Duration=durtime;
  79.    EnQueue(&q[i],f);
  80.    if(QueueLength(q[i])==1)
  81.    {
  82.      et.OccurTime=en.OccurTime+durtime;
  83.      et.NType=i;
  84.      OrderInsert(&ev,et,cmp); /* 设定第i队列的一个离开事件并插入事件表 */
  85.    }
  86. }

  87. void CustomerDeparture()
  88. { /* 处理客户离开事件,en.NTyPe<Qu */
  89.    int i;
  90.    i=en.NType;
  91.    DeQueue(&q[i],&customer); /* 删除第i队列的排头客户 */
  92.    TotalTime+=en.OccurTime-customer.ArrivalTime; /* 累计客户逗留时间 */
  93.    if(!QueueEmpty(q[i]))
  94.    { /* 设定第i队列的一个离开事件并插入事件表 */
  95.      GetHead_Q(q[i],&customer);
  96.      et.OccurTime=en.OccurTime+customer.Duration;
  97.      et.NType=i;
  98.      OrderInsert(&ev,et,cmp);
  99.    }
  100. }

  101. void Bank_Simulation()
  102. {
  103.    Link p;
  104.    OpenForDay(); /* 初始化 */
  105.    while(!ListEmpty(ev))
  106.    {
  107.      DelFirst(&ev,GetHead(ev),&p);
  108.      en.OccurTime=GetCurElem(p).OccurTime;
  109.      en.NType=GetCurElem(p).NType;
  110.      if(en.NType==Qu)
  111.        CustomerArrived(); /* 处理客户到达事件 */
  112.      else
  113.        CustomerDeparture(); /* 处理客户离开事件 */
  114.    } /* 计算并输出平均逗留时间 */
  115.    printf("顾客总数:%d, 所有顾客共耗时:%d分钟, 平均每人耗时: %d分钟\n",CustomerNum,TotalTime,TotalTime/CustomerNum);
  116. }

  117. void main()
  118. {
  119.    printf("请输入银行营业时间长度(单位:分)\n");
  120.    scanf("%d",&CloseTime);
  121.    Bank_Simulation();
  122. }
复制代码


回复

使用道具 举报

Archiver|手机版|小黑屋|三木电子社区 ( 辽ICP备11000133号-4 )

辽公网安备 21021702000620号

GMT+8, 2025-10-21 00:30 , Processed in 0.026909 second(s), 22 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表