【编程总结】公交车路线管理与查询系统

    数据结构的课程设计。两三千行代码吧,最多。真正写的时间估计也就一周这样吧。既然写了(代码),也有些感悟,就随便写写吧。

    这个软件能实现什么功能就参见附录的说明和贴图吧。还是把心得放在前面一点比较好,突出重点。

    说说算法吧。说实话,当问题规模小的时候没算法问题,你爱怎么玩怎么玩,计算机快着呢。但是问题规模增大后你就得严肃起来了,在规划路线这个问题上,我们刚开始的想法是用最短路的算法来搜最少换乘、搜最短路、搜最低票价,但这很快被否定了,因为我们要的是最优的数个方案,要是用什么次短路的算法也都不是很合算。于是就想把所有的结果都搜索出来,然后排序,意识到BFS与DFS的复杂度在O(V+E),觉得可行。但实际去做后遇到的瓶颈是,结果数目大大超出了我们的预期,事实上,对于完全图,这个复杂度达到O(n!),所以也是不可行的。最后,我们考虑到了实际中只要在五次换乘中能有路线,没有人愿意做更高次换乘的,因此我们进一步修改了算法,用截断式的BFS,将可能产生最优解的结果都搜了出来,然后根据用户的需要对他们排序,选择性显示出来。

    说说局限性吧。总觉的编程的时候有很多局限性。比如,为了节省空间,我用char来存路线号,后来出了个bug,因为char只能到255.再比如,为一个细节做优化,就是连续访问一个数组,但不能访问中间的某个元素,把数组分两段访问,结果给后面的debug照成了困难,因为降低了程序的可读性,这个优化或许不值得啊,我也由此觉得不要优化的缘故轻易破坏了可读性。写代码的局限性就在你的每一笔之中,你都会为未来的bug埋下伏笔,因为总会有局限被达到的那一天,除非你不用它。除了上述的个人局限,在团队编程的时候,分工合作也存在很多局限,模块划分看起来容易,但是对于后面写好程序的可测试性与组合都有很大的影响,每个人在写自己模块的时候都应该能够测试,并且组合模块后必须能够容易测出出错的模块,这些分工合作的局限性都是比较难克服的,尤其用面向过程的编程方法。其实,我想做的不是破除局限,而是知道局限。这却足够困难了。

    在编程中,我遇到一个关于C++的问题。一个类的私有数组成员,比如a[MAX];如果外部要连续访问它,并且不能修改它的值,什么样的方法才是比较高效的呢?如果只访问其中一个函数,直接写个函数提供一个接口即可,然而连续访问如果还采取这种方法,函数调用的不必要开销就会变得十分巨大。我第一个想法是传一个const类型指针出去,但被编译器deny了,后来看到iterator,用一个const_iterator是可以高效的解决这个问题的。

    用什么结尾呢?乘年轻多写写代码吧,不是年轻饭,是一个演化的过程,不写过是不会真正懂的。对了,今天是某某同学的生日,祝福一下吧,虽然一定不会看到的,因为不是学CS的,怎么会看这种技术博客呢。。。

 

附录:

 

管理员站点管理:

 

 

用户搜索­——换乘次数少于三次的最少换乘

 

 

选取最近点功能

模糊搜索功能:

 

 

管理员路线管理:

 

c++城市公交查询系统 1.设有一文件对象in_file,若在while循环中用in_file>> 每次从文件中得到一个字符串直到文件结束, 如果用in_file直接来判断文件是否结束, 则文件末的那个字符串会得到两次。 而用文件in_file.eof()来判断则会得到正确的结果。 2.用delete []释放字符串空间时,老是有问题, 其中的原因之一是你原来申请的空间不够大, 后来往这个空间中放了过多的内容以至越界, 这时候会发生运行时的错误。 3.把一个对象作为参数传给另一个对象的成员函数时, 程序不能正常结束,即系统删除对象时有问题; 而使用指针或者引用传递参数时不仅不会出现问题, 而且可以人为的删除对象。 我个人认为这很有可能是值传递的原因, 当把一个对象作为实参传给一个函数时,函数形参拷贝了实参的值, 这时,如果对象有指针成员,那么形参的指针成员的值和 实参的指针成员的值将完全一样, 即它们指向的是同一块内存,所以当函数调用结束的时候, 函数的形参将会被系统撤消, 这时,形参调用析构函数,释放用new动态申请的内存。在函数的外面, 作为实参的对象的指针成员其实已经被撤消了,所以当程序结束, 系统撤消这个对象时,这个对象又要调用析构函数来释放指针成员, 但这时指针其实已经指向了非法的空间,导致出错。 bus 文件夹的内容记录的是每条线路的信息,对应于bus 类。 每个文件以线路名称(即车名,忽略前面的k)命名。 每个文件的内容组织如下:(共分为6行,以回车键作为行结束标志) 第一行为“线路名称:#### ”,其中####用具体的线路名称代替; 第二行为“上行站点:####”。 第三行为“下行站点:####”。 第四行为“首班车时间:####”。 第五行为“末班车时间:####”。 第六行为“票价:####”。 注:若不分“上行站点”和“下行站点”, 则第二行为“站点名称:####”, 第三行为空行;
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值