车辆管理
justaLoli

问题: 车辆管理

问题简介

某单位最多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
        +list WZs   
    }
    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>本身
    • 查阅资料, 重载了一个类复制的构造函数,在需要传递列表时对列表进行复制,解决了此问题.