寒假作业3

GitHub


各文件 调试时长 代码行数 调试的bug数
main.cpp 10-25h 249行 15-29个
elevator.h - 21行 2个
elevator.cpp - 16行 0个
control.h - 21行 0个
control.cpp - 26行 0个
总计 10-25h 333行 17-29个

进击的优化

  • 对非法输入进行警告退出处理
  • 把顺风车模式改成最近接客模式,即如果要去的地方比接下一个请求的来得远,选择接下一个
  • 更好优化的思考:加权移动:不能让电梯上一堆人下去接一个人
  • 更好优化的反思考:加权移动导致了可能错过更多下面要去上面的人
  • 更加好的想法:对历史数据进行估计,判断哪种情况更多,基于历史进行选择

1

  • 开了新的脑洞
  • 电梯分为停下和运行两个状态
  • 按里面的按钮和外面的按钮没有区别
  • 电梯向按着按钮的楼层出发
  • 到了楼层就更新状态
  • 接客和载客
  • 把状态更新

2

  • 理了一下
  • 先响应最近的乘客,再响应路途上的乘客

3

  • 更新的脑洞
  • 维护一个请求表,直接往离当前请求最近的楼层移

4

  • 写完了,尝试了一些失败的想法,上面的1,2,3可以不看了,讲讲最新的情况

思路(可以看代码,代码不难看)

  • 使用了面向对象的方法,将电梯和控制面板对象化,用到了之前笔记里的构造函数等等
  • 电梯:可以一层一层上下移动,反馈在第几层,简单地反映电梯里有几个人,上下客,无人即为空载
  • 控制面板:记录请求的人在哪让电梯去接,请求的楼层在哪让电梯去送
  • 使用函数追踪当前电梯离那个请求楼层最近即向哪层移动
  • 许多未使用函数为扩展留下空间

文档

  • 上次的文档还是可以用的,代码内加了更多的注释

问题

  • 算法不是最优,程序还有一点bug
  • 回避了对象的消息传递

样例

1

输入5个1 2 3检验同时载客+简单情况
输出为
4时,停靠在3楼
4时,停靠在3楼
4时,停靠在3楼
4时,停靠在3楼
4时,停靠在3楼
15
符合预期

2

输入
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6
模拟一楼同时上下客情况
输出
3时,停靠在2楼
5时,停靠在3楼
7时,停靠在4楼
9时,停靠在5楼
11时,停靠在6楼
20
符合预期

3

输入
1 1 0
10 5 1
50 0 3
70 0 8
100 1 9
模拟反复上下楼
输出
程序卡死表明有问题
11时,停靠在10楼
22时,停靠在1楼
67时,停靠在3楼
80时,停靠在8楼
122时,停靠在9楼
71
符合预期
是没有对0当前位置转换成10处理造成的

4

输入
1 1 0
2 1 0
3 1 0
4 1 0
5 1 0
模拟下楼载客情况
输出
15时,停靠在10楼
15时,停靠在10楼
15时,停靠在10楼
15时,停靠在10楼
15时,停靠在10楼
60
符合预期

5

输入
1 5 1
6 1 3
7 6 2
10 5 9
11 3 2
模拟小规模混乱数据
输出
10时,停靠在1楼
13时,停靠在3楼
24时,停靠在2楼
32时,停靠在9楼
24时,停靠在2楼
68
符合预期

6

输入
1 -5 1
6 1 3
7 6 2
10 5 9
11 3 2
输出
输入不合法
符合预期

log截图(ps:运行截图不放了,上面的结果拿GitHub里我程序随意复现,主要是截图太占版面)

一些额外的BB

  • 这是我写的时间最长的一次代码,中途一度想把这个丢了再写一个,还是没有完全放弃,终于写完了
  • 文件读写使用很习惯的freopen("*.*","way",mode),需要'stdio.h'(c)或cstdio(c++)头文件,“.”是需要读写的文件名(和编译后可执行文件同目录下),“way”是“w”或“r”表示write写入或者read读取,“mode”是“stdin”或“stdout”和“read”,“write”互相对应
  • Visual Studio Code是一个不错的编辑器,但是要调教成一个好的IDE还有很多步骤要做
  • 源码里额外的cout输出是bug调试用途,可以测试完整的上下楼流程,比如电梯移动到几楼,接进几个人,几个人下电梯等等
  • 本代码去掉vsc下注释经Visual Studio Code+clang编译生成代码,如果完整IDE请把多个cpp连接编译
  • commit规范由最早的混乱到现在的基本规范主要是从单看廖雪峰git到看了commit规范指南之后的转变
  • 如有纰漏或建议,请各位不吝指教
原文地址:https://www.cnblogs.com/passguan/p/8455851.html