基于LOOK磁盘调度算法写一个电梯运行模拟器

大四上学期的一门软件理论专题课要求课程结束之后写个大作业,在外苦逼实习一节课没上的我居然还要写这个玩意,怀着日乐购的心情随便选了一个电梯模拟系统的题。
题目拿到手,首先考虑要不就写了大一时期的字符界面的吧,转念一想字符界面还是不符合我的气质,所以我又搬出牛逼哄哄的DuiLib界面库,虽然这个界面库已经停止维护了,不过怎么说人家现在也还是微信采用的界面库啊,这里附上写的很好的一篇duilib教程
,然后仔细研究了一下电梯的运行原理,为此下班上楼时专门仔细注意了一下电梯,后来百度一下发现原来这个叫做LOOK磁盘调度算法,这里你可能会疑惑为什么电梯的运行算法扯到了磁盘调度,因为电梯运行时类似于磁盘寻道,磁盘寻道时通常是磁头运行到相应的请求的磁道再将数据读入内存,LOOK调度算法的原理是每次只运行到最外层的请求道就返回,举个例子:


假设某个磁盘磁道编号为1~200,当前磁头的位置在100, 请求序列为 : 45 、 99 、 160 、 3
这时磁头的访问顺序就是160、99、45、3


在电梯的实际运行中包含上楼的请求、下楼的请求和进入电梯之后需要前往的目标层,采用LOOK算法之后,若电梯当前处在向上运行的状态电梯会一直运行到最高的请求层之后,再调转方向,反正同理。
我采用了链表来存储请求层和目标层,上向请求层升序排列,下向请求层降序排列这样可方便拿到最高的请求层和最低的请求层,建立一个电梯对象来标识电梯的位置,在循环中监控电梯的位置是否到达目标点,话不多说直接上代码:

while(1)
    {   
        bool isArrive =false;
    if(elevator->getStatus())                  //电梯是否在运行,若在运行再看运行方向
    {
        ::PostMessage(hWnd, WM_TARBTNOPEN, 0L, 0);
        if(elevator->isUp())
        {
            elevator->Upstairs();                   
            ::PostMessage(hWnd, WM_REDRAW, 0L, 0);

            if(request_down_head != NULL)
            {
                if(request_down_head->floor == elevator->getFloor())
                {
                    ::PostMessage(hWnd, WM_CHANGEDBTNCOLOR, 0L, 0);
                    //到达了最高的一个下向请求层
                    FreeDownRequest(request_down_head);
                    ::MessageBox(NULL, _T("到达请求楼层,开门!"), _T("注意安全"), NULL);
                    isArrive = true;
                    elevator->setDown();

                }
            }
            else if(FindRequestUp(elevator->getFloor()))
            {
                ::PostMessage(hWnd, WM_CHANGEUBTNCOLOR, 0L, 0); //到达了上向请求层
                ::MessageBox(NULL, _T(&#
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值