【项目1 - c/c++语言中函数参数传递的三种方式】
c语言提供了两种函数参数传递的方式:传值和传地址。在c++中,又拓展了引用方式。通过本项目,确认自己已经掌握了这三种方式的原理,为后续学习做好准备。
下面是希望能够交换两个整型变量的swap函数的三个版本(从课程主页中可以找到项目链接,复制后就能调试,不必费事敲代码):
下面是调用它们的main()函数:
请编制三个程序,分别调用三个版本的交换函数,观察结果。发布博文,展示程序及运行结果,解释成功交换以及交换不成功的原因。请在纸上画出调用过程中各变量的变化过程。
如果自己不能做出解释,务必找“兄弟”帮忙,拿下这座小山头。
【项目2 - 程序的多文件组织】
学习数据结构,目标就是要编制出有相当规模的程序的。将所有的代码放在一个文件中的做法,不能适用现阶段的需求了。
通过这个项目,确认有能力用多文件组织程序。方便以后各章,我们就某一数据结构定义算法库,并能引用算法库进行实践。
最简单的多文件组织,一个项目中有3个文件:
(1) .h 头文件:定义数据类型、声明自定义函数、定义宏等
(2).cpp 源文件1:用于实现头文件中声明的自定义函数
(3).cpp 源文件2:定义main()函数,用于调用相关函数,实现问题求解目标。
请将例1.13中按方案3实现的程序,用多文件形式组织并运行。
在需要的地方,用 #include “自定义头文件”,使文件之间的内容能“合起来”完成任务。
下面是写在一个文件中的程序:
【项目3 - 体验复杂度】
(1)两种排序算法的运行时间
排序是计算机科学中的一个基本问题,产生了很多种适合不同情况下适用的算法,也一直作为算法研究的热点。本项目提供两种排序算法,复杂度为o(n2)的选择排序selectsort,和复杂度为o(nlogn)的快速排序quicksort,在main函数中加入了对运行时间的统计。
(2)汉诺塔
有一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
可以算法出,当盘子数为n个时,需要移动的次数是f(n)=2n−1。n=64时,假如每秒钟移一次,共需要18446744073709551615秒。一个平年365天有31536000秒,闰年366天有31622400秒,平均每年31556952秒,移完这些金片需要5845.54亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。据此,2n从数量级上看大得不得了。
用递归算法求解汉诺塔问题,其复杂度可以求得为o(2n),是指数级的算法。请到课程主页下载程序运行一下,体验盘子数disccount为4、8、16、20、24时在时间耗费上的差异,你能忍受多大的disccount。
源程序见附后的程序3。
附:项目3的程序3——汉诺塔程序