# Software-Engineering **Repository Path**: wangqianfang2024/software-engineering ## Basic Information - **Project Name**: Software-Engineering - **Description**: 软件工程初识,软件工程的一些测试用例 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-09-09 - **Last Updated**: 2022-09-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Software-Engineering ## 1.基础题 --- ### 1.1 实现Hello World 在`Test01`目录下执行`java Hello.java` --- ### 1.2 练习数值运算 找出一个整数数组中子数组之和的最大值,例如:数组[1, -2, 3, 5, -1],返回8(因为符合要求的子数组 是 [3, 5]);数组[1, -2, 3, -8, 5, 1],返回6(因为符合要求的子数组是 [5, 1]); 数组[1, -2, 3,-2, 5, 1],返回7(因为符合要求的子数组是 [3, -2, 5, 1])。 在`Test01`目录下执行`python numeral_calculate.py [1,-2,3,8,5,1]` 其中第三个参数为一个列表。 返回结果如下所示: ```python The original arr is : [1, -2, 3, 8, 5, 1] The sum of the subarrays in this array is at most : 17 ``` --- ### 1.3 求1-20000之间所有的素数 程序中,方法一使用最简单的双重循环,对于每一个数$x$,都从$[2,x-1]$这个区间重新判断$x \% j $是否为0,这样其实重复计算了很多次,对于有倍数关系的数来说。所以这个地方的计算如果能够优化的话,必将极大的减少程序的运行时间。 因此,可以采用筛法求素数,即将之前已经出现的素数放在一个表中,如果当前数$x$能够被素数表的里数整除的话,那么必然不是素数。 最终比较两个方法所使用的时间,第一种暴力方法运行的时间为**1.286156177520752** s,优化后的算法运行的时间为**0.16088032722473145** s. 在`Test01`目录下执行`python calu_prime.py` 默认调用耗时短的算法,不支持指定算法。 --- ## 2.个人项目 **用户需求**: 英语的26 个字母的频率在一本小说中是如何分布的?某类型文章中常出现的单词是什么?某作家最常用的词汇是什么?《哈利波特》 中最常用的短语是什么? 下面将依次从易到难实现: **第0步**: 输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。 如果两个字母出现的频率一样,那么就按照字典序排列。 命令行参数 为 `xxx.xxx -c` > 思考: 如果要处理一本大部头小说 (例如 Gone With The Wind), 你的程序效率如何? 有没有什么可以优化的地方? `python main.py -c hamlet.txt` 即可统计字母出现的次数,并输出运行程序所需要的时间。 --- ### 2.1 第1步 **目标:输出单个文件中的前 N 个最常出现的英语单词。** 单词:以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。 分割符:空格,非字母数字符号 例:good123是一个单词,123good不是一个单词。good,Good和 GOOD是同一个单词 要求实现的功能: - 功能1: `xxx.xxx -f` - 输出文件中所有不重复的单词,按照出现次数由多到少排列,出现次数同样多的,以字典序排列。 - 功能2: `xxx.xxx -d` - 指定文件目录,对目录下每一个文件执行 wf.exe -f 的操作。 - `xxx.xxx -d -s` 同上, 但是会递归遍历目录下的所有子目录。 - 功能3: `xxx.xxx -n` - 输出出现次数最多的前 n 个单词。 当没有指明数量的时候,默认列出所有单词的频率。 需要构建一些基本的测试样例来保证程序的基本功能。 --- ### 2.2 第2步 **目标:支持 stop words** 从第一步的结果看出,在一本小说里, 频率出现最高的单词一般都是 “a”, “it”, “the”,“and”, “this”, 这些词, 我们并不感兴趣. 我们可以做一个 stop word 文件 (停词表), 在统计词 汇的时候,跳过这些词。 我们把这个文件叫 “stopwords.txt” file. - 功能4: 支持新的命令行参数, 例如: `xxx.exe -x -f` > 思考:这一步添加的测试是什么? --- ### 2.3 第3步 **目标:查询常用的短语** 先定义短语:”两个或多个英语单词, 它们之间只有空格分隔”. 请看下面的例子:   hello world //这是一个短语   hello, world //这不是一个短语 - 功能5: 支持新的命令行参数 -p -  参数说明要输出多少个词的短语,并按照出现频率排列。同一频率的词组, 按照字典序来排列。 > 思考:这一步添加的测试是什么? 实现方式: 本文采取正则形式实现,具体方法见`main.py`中的``函数 当词的个数为3时,分割文本的形式如下所示 ![image.png](https://s1.328888.xyz/2022/09/12/KM7aN.png) --- ### 2.4 第4步 **目标:把动词形态都统一之后再计数。** 在英语中,动词经常有时态和语态的变化, e.g. 动词 `TAKE` 有各种变形 `take takes took taken taking` 我们希望在实现上面的各种功能的时候,有一个选项, 就是把动词的各种变形都归为它的原型来统计。 - 功能6: 支持动词形态的归一化,参数为 -v - `wf.exe -v` 其中 是纪录动词形态的文本文件。 --- **运行代码方式**: * 方式一:可以选择进入到`Test02/dist/main/`目录下,执行`main.exe -f xx.txt`命令,注意这里文件的路径要相对完整。 * 方式二:在`Test02/`目录下,执行`python main.py -f xx.txt`命令。 **最终实现的功能列表参数如下**: ```bash usage: main.exe [-h] [-c LETTER] [-f FILENAME] [-n NWORDS] [-x STOPFILE] [-v VERBFILE] [-p PHRASELEN] [-d DIRNAME] [-s DIR] optional arguments: -h, --help show this help message and exit -c LETTER, --letter LETTER 统计字母出现的频率 -f FILENAME, --filename FILENAME 需要处理的文本名称 -n NWORDS, --nWords NWORDS 输出的单词或短语个数 -x STOPFILE, --stopFile STOPFILE 停词表名称 -v VERBFILE, --verbFile VERBFILE 动词变化的文件名称 -p PHRASELEN, --phraseLen PHRASELEN 查询常用词组的长度 -d DIRNAME, --dirname DIRNAME 非递归遍历该目录 -s DIR, --dir DIR 递归遍历遍历目录 ``` `main.exe -c hamlet.txt` 查询`hamlet.txt`文件中所有字母出现的占比 `main.exe -f hamlet.txt` 查询`hamlet.txt`文件中所有单词的频率 `main.exe -f hamlet.txt -n 5` 只显示频率最高的前5个单词 `main.exe -x stopwords.txt -f hamlet.txt` 使用停词表 `main.exe -v ver.txt -f hamlet.txt` 支持动词形态的归一化 `main.exe -d ./` 查询当前目录下的所有文件单词出现的频率 `main.exe -s ./` 递归遍历当前目录下的所有文件单词出现的频率 `main.exe -p 3 -f hamlet.txt` 查询`hamlet.txt`文件中长度为3的词组出现的频率