首页 考试吧论坛 Exam8视线 考试商城 网络课程 模拟考试 考友录 实用文档 求职招聘 论文下载
2011中考 | 2011高考 | 2012考研 | 考研培训 | 在职研 | 自学考试 | 成人高考 | 法律硕士 | MBA考试
MPA考试 | 中科院
四六级 | 职称英语 | 商务英语 | 公共英语 | 托福 | 雅思 | 专四专八 | 口译笔译 | 博思 | GRE GMAT
新概念英语 | 成人英语三级 | 申硕英语 | 攻硕英语 | 职称日语 | 日语学习 | 法语 | 德语 | 韩语
计算机等级考试 | 软件水平考试 | 职称计算机 | 微软认证 | 思科认证 | Oracle认证 | Linux认证
华为认证 | Java认证
公务员 | 报关员 | 银行从业资格 | 证券从业资格 | 期货从业资格 | 司法考试 | 法律顾问 | 导游资格
报检员 | 教师资格 | 社会工作者 | 外销员 | 国际商务师 | 跟单员 | 单证员 | 物流师 | 价格鉴证师
人力资源 | 管理咨询师考试 | 秘书资格 | 心理咨询师考试 | 出版专业资格 | 广告师职业水平
驾驶员 | 网络编辑
卫生资格 | 执业医师 | 执业药师 | 执业护士
会计从业资格考试会计证) | 经济师 | 会计职称 | 注册会计师 | 审计师 | 注册税务师
注册资产评估师 | 高级会计师 | ACCA | 统计师 | 精算师 | 理财规划师 | 国际内审师
一级建造师 | 二级建造师 | 造价工程师 | 造价员 | 咨询工程师 | 监理工程师 | 安全工程师
质量工程师 | 物业管理师 | 招标师 | 结构工程师 | 建筑师 | 房地产估价师 | 土地估价师 | 岩土师
设备监理师 | 房地产经纪人 | 投资项目管理师 | 土地登记代理人 | 环境影响评价师 | 环保工程师
城市规划师 | 公路监理师 | 公路造价师 | 安全评价师 | 电气工程师 | 注册测绘师 | 注册计量师
缤纷校园 | 实用文档 | 英语学习 | 作文大全 | 求职招聘 | 论文下载 | 访谈 | 游戏
您现在的位置: 考试吧(Exam8.com) > 软件水平考试 > 复习资料 > 程序员资料 > 正文

《数据结构(C++)》学习辅导系列:队列应用

 

   void PrintResult()
   {
   int tSN = 0;
   long tST = 0;
   cout << endl;
   cout << "-------------模拟结果------------------";
   cout << endl << "tellerID\tServiceNum\tServiceTime\tAverageTime" << endl;
   for (int i = 1; i <= tellerNum; i++)
   {
   cout << "TELLER " << i;
   cout << '\t' << tellers[i].totalCustomerCount << " "; tSN += ellers[i].totalCustomerCount;
   cout << '\t' << tellers[i].totalServiceTime << " "; tST += long)tellers[i].totalServiceTime;
   cout << '\t';
   if (tellers[i].totalCustomerCount)
   cout << (float)tellers[i].totalServiceTime/(float)tellers[i].totalCustomerCount;
   else cout << 0;
   cout << " " << endl;
   }
   cout << "TOTAL \t" << tSN << " \t" << tST << " \t";
   if (tSN) cout << (float)tST/(float)tSN; else cout << 0;
   cout << " " << endl;
   cout << "Customer Number:\t" << customerNum << "\tno Service:\t" << customerNum - tSN << endl;
   cout << "Customer WaitTime:\t" << customerTime << "\tAvgWaitTime:\t";
   if (tSN) cout << (float)customerTime/(float)tSN; else cout << 0;
   cout << endl;
   }
  
  private:
   int tellerNum;
   int simuTime;
   int curTime, nextTime;
   int customerNum;
   long customerTime;
   int arrivalLow, arrivalHigh, arrivalRange;
   int serviceLow, serviceHigh, serviceRange;
   Teller tellers[21];
   Queue customer;
  
   void NextArrived()
   {
   nextTime += arrivalLow + rand() % arrivalRange;
   }
  
   int NextService()
   {
   return serviceLow + rand() % serviceRange;
   }
  
   void CustomerArrived()
   {
   customerNum++;
   customer.EnQueue(nextTime);
   }
  
   void CustomerDeparture()
   {
   customerTime += (long)curTime - (long)customer.DeQueue();
   }
  
  };
  
  #endif
  几点说明
  Run()的过程是这样的:curTime是时钟,从开始营业计时,自然流逝到停止营业。当顾客到事件发生时(顾客到时间等于当前时间,小于判定是因为个别时候顾客同时到达——输入arrivalLow=0的情况,而在同一时间,只给一个顾客发号码),给这个顾客发号码(用顾客到时间标示这个顾客,入队,来到顾客数增1)。当柜台服务完毕时(柜台服务完时间等于当前时间),该柜台服务人数增1,服务时间累加,顾客离开事件发生,下一个顾客到该柜台。因为柜台开始都是空闲的,所以实际代码和这个有点出入。最后,停止营业的时候,停止发号码,还在接受服务的顾客继续到服务完,其他还在排队的就散伙了。
  模拟结果分别是:各个柜台的服务人数、服务时间、平均服务时间,总的服务人数、服务时间、平均服务时间,来的顾客总数、没被服务的数目(来的太晚了)、接受服务顾客总等待时间、平均等待时间。
  这个算法效率是比较低的,实际上可以不用队列完成这个模拟(用顾客到时间推动当前时钟,柜台直接公告服务完成时间),但这样就和实际情况有很大差别了——出纳员没等看见人就知道什么时候完?虽然结果是一样的,但是理解起来很莫名其妙,尤其是作为教学目的讲解的时候。当然了,实际中为了提高模拟效率,本文的这个算法是不值得提倡的。
  注释掉的#define PRINTPROCESS,去掉注释符后,在运行模拟的时候,能打印出每个时刻柜台的服务情况(第几个顾客,顾客到达时间,接受服务时间),但只限4个柜台以下,多了的话屏幕就满了(格式就乱了)。
  【后记】本来我没打算写这篇,后来,当我开始实现模拟的时候,竟欲罢不能了。这是数据结构这本书中第一个实际应用的例子,而且也有现实意义。你可以看出各个柜台在不同的业务密度下的工作强度(要么给哪个柜台出纳员发奖金,要么轮换柜台),各种情况下顾客的等待时间(人都是轮到自己就不着急了),还有各种情况下设立几个柜台合理(很少的空闲时间,很短的等待时间,几乎为零的未服务人数)。例如这样:
  for (int i = 1; i < 16; i++)
  {
   Simulation a(i,240,1,4,8,15);
   a.Run();
  }
  你模拟一下就会得出,在不太繁忙的银行,4~5个柜台是合适的——现在的银行大部分都是这样的。
文章搜索
软件水平考试栏目导航
版权声明:如果软件水平考试网所转载内容不慎侵犯了您的权益,请与我们联系800@exam8.com,我们将会及时处理。如转载本软件水平考试网内容,请注明出处。