现代软件工程作业 – 计算最长英语单词链
结对编程 – 计算最长英语单词链
《构建之法》练习题
大家经常玩成语接龙游戏,我们试一试英语的接龙吧:一个文本文件中有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 让程序可读,可维护。
这个次序也综合了各路专家对此的看法,次序不对,就会掉进过早优化和其他一些坑里面。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步