车辆管理
问题: 车辆管理
问题简介
某单位最多100辆车辆,每辆车的基本信息包括:车号、车型、购买日期、购 买价格、驾驶员名称、违章记录等。其中,各辆车的违章次数可能差别很大(有的一次没有,有的可能有数十次)。每次违章记录中包括:违章时间、违章地点、违章代码(如闯红灯、违规停车等)、违章处理等。
问题理解
需要实现的功能包括:
- 查找某辆车的违章信息
- 统计某个时间段内的所有车的违章记录
- 统计某个地点的所有违章记录
- 统计某一个违章代码的所有违章记录
- 车辆的添加、报废(增删)
- 违章记录的增删改.
设计与实现.
程序实现的数据结构
本程序将使用笔者编写的双向链表作为线性表的实现. 为了测试并完善双向链表数据结构的稳健性, 本程序的车辆线性表和违章记录线性表都由双向链表实现. 双向链表集成了增、删、改、查等各操作及运算, 在此不做赘述.
为了存储车辆和违章信息, 笔者分别建立了一个Car类和一个WZ类, 其UML图如下.
classDiagram class WZ{ +string time +string place +int code +bool ok } class Car{ +int id +string type +string buydate +float price +string driver +listWZs } Car --> WZ
所有Car
存储在双向链表list<Car>
中.
环境:
g++ -std=c++11
. 在win10,x64及MacOS,arm64上测试.
程序架构
在main()函数中,将先开始计时,并执行
list<Car> finput()
函数,从文件中读取车辆信息,返回车辆链表。再创建输出文件fileo.txt
和输出文件流fout
。随后顺序运行:
void fun1_print_all(list<Car>&)
函数,传入车辆链表,将读取的信息再输出。void fun2_sort_cars(list<Car>&)
函数,传入车辆链表,将车辆按违章数量多少进行冒泡排序。无返回,直接在链表内操作。int fun3_find_car(list<Car>&, int)
函数,传入车辆链表和id,根据id查找车辆,返回车辆在链表中的索引值,若未找到,返回-1;void fun4_find_WZ_by_time(list<Car>&, string startdate,string enddate)
函数,传入车辆链表和起止时间,查找在这个时间范围内的所有违章记录。无返回,直接输出。void fun5_find_WZ_by_place(list<Car>&, string place)
函数,传入车辆链表和违章地点,查找在这个地点的所有违章记录。无返回,直接输出。void fun6_find_WZ_by_code(list<Car>& cars, int code)
函数,传入车辆链表和违章代码,查找这个违章代码的所有违章记录。无返回,直接输出。
随后在main()函数内执行车辆的增减、违章记录的增减等功能。最后停止计时,输出程序用时,并关闭文件,结束程序。
程序输入输出
输入: 从程序运行目录下的filei.txt
得到数据.
输出:
输出到程序运行目录下的fileo.txt
.输出内容包括每一个功能的执行结果,以及必要的提示信息.
最后输出程序执行时间.
由于输出的内容很长,无法在一页上机报告中囊括。详细输出请看fileo.txt
.
总结
收获: 实现了一个相对完备的双向链表.
遇到的问题与解决办法:
- 问题: 实现的列表类作为参数在函数之间传递时会产生异常.
- 解决办法:
- 在不需要复制列表的情况下,
将函数的参数改为列表的引用
list<Car>&
而非列表list<Car>
本身 - 查阅资料, 重载了一个类复制的构造函数,在需要传递列表时对列表进行复制,解决了此问题.
- 在不需要复制列表的情况下,
将函数的参数改为列表的引用