现代软件工程作业 – 计算最长英语单词链

结对编程 – 计算最长英语单词链

构建之法》练习题

大家经常玩成语接龙游戏,我们试一试英语的接龙吧:一个文本文件中有N 个不同的英语单词, 我们能否写一个程序,快速找出最长的能首尾相连的英语单词链,每个单词最多只能用一次。最长的定义是:最多单词数量,和单词中字母的数量无关。

例如, 文件里有:

 

Apple

Zoo

Elephant

Under

Fox

Dog

Moon

Leaf

Tree

Pseudopseudohypoparathyroidism

 

最长的相连英语单词串为:  apple - elephant – tree,  输出到文件里面,是这样的:

              Apple

              Elephant

              Tree

 

要求程序 (WordList.exe)能处理命令行参数,知道什么是输入文件, 输出文件应该放在哪里。  这样,当助教拿到学生的源程序后,就能编译,并运行一系列的测试。

Wordlist.exe  /i input1.txt   /o  output1.txt

Wordlist.exe  /i input2.txt   /o  output2.txt

              …

 

既然是测试,就会有很多边角情况,例如,文件不存在,你的程序会崩溃么,还是能优雅地退出并给用户提示信息?如果文件没有任何单词、只有一个单词、没有可以首尾相连的单词,程序应该如何输出?

程序的正确性验证完毕后, 就可以用一些命令行计时工具来测试程序的效率。 当然,同学们也可以参考《构建之法》的介绍,自己先测试并改进程序的效率, 最好是先写一个朴素的算法,看看用时如何,再分析效率,改进,分析...

如果输入文件有一万个单词,你的程序能多快输出结果?课程助教会在同一个电脑上用一个大文件来测试所有同学的作业,请做好准备。

 

补充题1: 请让你的程序处理不同数量的单词文件,纪录所花费的时间(建议时间单位:毫秒)。在二维坐标系上画出程序的效率 (x 轴:输入文件字符数, y 轴:程序时间)。

        字符数为: 10, 100, 500, 1000, 1500, 2000, 3000, 4000, 10000

补充题2:这个问题的核心算法是什么?它等价于图论的什么问题,你的解法的效率是多少? 算法的效率和二维坐标上的曲线吻合么? 考虑到这个题目的各种特殊性,还可以继续优化么?

补充题3:很多科班出身的同学在学校里学习的是 Java/C/C++/C# 之类的语言, 这个练习的需求就是处理一些字符串, 能否用一些处理文字比较方便的语言 (Perl, Python,  JavaScript) 来做同一个题目呢? 在处理大文件的时候,这两种语言的效率有差别么?

补充题4:能否做一个网页版的程序,用户可以在输入窗口敲入各种单词, 输出窗口就能实时显示最长的单词链?

补充题5:上面我们提到这个题目中 “最长” 的定义是单词数量最多, 如果我们改一下,最长 = 单词串中所含字母最多, 那么输入例子中的最长输出就是:

  Pseudopseudohypoparathyroidism

  Moon

如果我们要求程序能处理这两种情况(用命令行参数  /c 表示字母最多, 用命令行参数 /w 或没有参数 表示单词数量最多), 你的程序如何做合理的模块化, 让程序能有较好的可重用化,可读性?

 

补充题6:上面提到的效能工具是Windows 平台的, 学生能否在别的平台运行效能测试工具,并介绍其用法?

 

补充题7:能否处理中文的词组,就像成语接龙那样,成语接龙有两种要求,a) 接龙的两个词首尾的字必须是同一个字; b) 首尾的字拼音和声调相同即可。 如何加上参数让程序能处理中文成语接龙的情况? 如果我们是让另外一些同学编写中文成员接龙的模块,那我们如何让这个模块被主程序调用?

 

 

从上面的各个小题目锻炼过来,我们可以看出一个从实践出发的构建软件的步骤:

  1. make it work   先把最主要的情况处理对,程序能跑起来

  2. make it right   再把各种情况处理好

  3. make it fast    优化速度

  4. make it extensible    让程序可扩展,既然能处理这个问题,我们让它处理一些扩展问题如何?

  5. make it maintainable     让程序可读,可维护。

 

 这个次序也综合了各路专家对此的看法,次序不对,就会掉进过早优化和其他一些坑里面。 

 

posted @ 2017-07-05 09:52 SoftwareTeacher 阅读(...) 评论(...) 编辑 收藏