本周我们完成的任务是傻瓜电梯的调度,对于那十分十分详细的指导书,我感觉想要说明白题目要求,是做不到的,所以就把指导书贴出来给大家看了,,由于在下还不会网页制作,只能通过百度网盘了,https://pan.baidu.com/s/12KLXnQa9ifh1hZQrvqhjAw/pdf争取下次用网页吧,虽然不知道什么时候才能学会。
看完题目我们开始分析吧,
从最直接的角度分析就是请求与调度的关系,直接点就是,发出请求,然后处理请求,将所有合法请求过程构成请求队列,调度器处理一个请求就是根据当前电梯状态发出一条指令,然后电梯运行该条指令,然后更新电梯的状态,然后返回状态只调度器,直到执行完最后一条指令。所以按照思想构造出五个类,但这次作业,在下并没有完全按照要求写,虽然是五个类,但是五个类的作用并不是完全按给出的建议。首先说一下几个类的功能:
- 输入我们使用主类,虽然输入是来自电梯类与楼层类,但是作为两处输入太过于麻烦,所以我们使用主类输入
- W_legal类,该类作为对于输入的第一层判断,也就是简单的过滤一些不合法输入
- Demand类,该类也是作为对于输入的判断,将所有不合法的输入过滤,得到是正确的请求队列
- Scheduler类,该类就调度器类,在该类中判断是否是同质请求,同时时间与队列是该类的关键的两个属性,时间用于判断当前类的请求时间与当前时间的大小,请求队列用于判断是否执行结束
- Elevator类,该类就是电梯类,接收来自调度器的指令,然后执行该指令,该类中的方法change()意思就是执行指令,然后改变电梯的运行状态,然后返回状态给调度类
对于该想法,本来我也觉得天衣无缝,只可惜还是有漏网之鱼,先列出自己的bug吧:
- 对于输入,我依旧采用了第一次作业方法,对输入使用find(),错误……,导致只要存在符合条件的输入就会执行,而忽略了必须是完全匹配的条件
- 对于数字的判断,题目的要求是4字节的整数,由于在java中是不存在unsigned类型的数据类型的,也就意味着,我们的数字最大位2^32-1,而不是2^31-1,所有数据类型要是long类型,我都是这么写的,但是还是错了,那么错误在哪里呢?本来在使用下面的这个方法时要注意一点时,一定要是有try catch,除非你事先确定了数据的位数
-
max = Long.parseLong("4294967295");
对于自己想法的优化:
- 最需要优化的地方当然是输入,所以第三次作业在下重写写了一个输入,具体见第三次作业,
- 如果还有什么要优化的话那就是代码风格吧
为了纪念自己第一次使用面向对象的方法来实现这个作业,容我贴一点核心代码
request_new.request_old = legal_1.num;request_new.deal(); //得到一个队列,队列中是按时间顺序的请求都是合法请求sche.request_n = request_new.request1;sche.fetch();while(sche.request_n[sche.i][0]!=0) {sche.state_c = elev.state;sche.stop_time = elev.st_time;sche.deal_t();elev.move = sche.instr_o;elev.change();sche.i++;}