第二次作业
第二次作业随笔
| 这个作业属于哪个课程 | [软件工程]( https://edu.cnblogs.com/campus/zjlg/26rjjc ) |
|---|---|
| 这个作业的目标 | 实现一个命令行文本计数统计程序,能正确统计纯英文 txt 文本中的字符数、单词数、句子数,并扩展支持代码行 / 空行 / 注释行统计,同时编写单元测试、完成版本管理与性能测试。 |
| 姓名-学号 | 郑增祺-2024329301109 |
一、需求分析
作业要求实现一个类似 Linux wc 的命令行文本计数统计程序,命令行格式为:
wc.exe [参数] [文件名]
1. 基础功能
| 功能 | 说明 |
|---|---|
| 字符数 | 统计纯英文 txt 文本中的字符数量 |
| 单词数 | 统计文本中的单词数量(按空白字符切分) |
| 句子数 | 统计文本中的句子数量(按句号 / 问号 / 感叹号切分) |
2. 扩展功能(加分项)
统计代码行、空行、注释行等,并提供相应的命令接口。
3. 其他要求
- 项目文档(README.md)包含:项目简介及用法、文件列表及说明、例程运行及结果;
- 码云多次提交体现版本更迭:
v0.1 空项目、v0.2 基础功能、v0.3 扩展功能; - 编写单元测试:基础功能测试 + 更多测试用例(加分项);
- 使用 IDE 附带工具进行 performance test(加分项)。
二、设计思路
1. 语言与工具
选用 Python + PyCharm,单元测试框架使用 pytest,性能分析使用 PyCharm Profiler / cProfile。
2. 模块划分
将「统计逻辑」与「命令行交互」分离,使统计逻辑成为可独立测试的纯函数:
count_chars(text):字符数 =len(text)count_words(text):单词数 =len(text.split())count_sentences(text):句子数,按. ! ?切分,并屏蔽常见缩略词(Mr.、U.S.、e.g.等)与小数(3.14)中的句点count_lines(text):总行数 =len(text.splitlines())analyze_code(text):代码统计,识别#、//单行注释与/* ... */块注释,统计代码行 / 空行 / 注释行main(argv):使用argparse解析参数、读取文件、按参数分发并输出结果
3. 命令接口设计
| 参数 | 功能 |
|---|---|
-c / --chars |
统计字符数 |
-w / --words |
统计单词数 |
-s / --sentences |
统计句子数 |
-l / --lines |
统计总行数 |
-C / --code |
代码统计(代码行 / 空行 / 注释行) |
-a / --all |
统计全部基础项(默认) |
三、实现说明
核心统计函数均为纯函数:输入文本字符串,返回整数 / 字典,不依赖文件系统与标准输入输出,因此可以方便地进行单元测试。
句子数统计的难点在于「句点」的歧义:缩写(Mr.)、小数点(3.14)中的句点并非句子结尾。实现上先对常见缩写和小数中的句点做占位替换,再按 . ! ? 切分,从而提高准确性。
代码统计的难点在于「块注释」跨多行:通过状态变量 in_block_comment 跟踪是否处于 /* ... */ 内部,逐行分类为代码行 / 空行 / 注释行。
四、运行结果
$ python wc.py -a sample.txt
sample.txt
字符数:307
单词数:53
句子数:8
$ python wc.py -C sample_code.c
sample_code.c
总行数:12
代码行:8
空行:2
注释行:2
五、单元测试
$ python -m pytest test_wc.py -v
34 passed in 0.12s
共 34 个测试用例,覆盖:
- 基础功能:字符数、单词数、句子数、总行数(含空文本、多余空格、制表符、缩略词、小数、多段落等边界用例)
- 扩展功能:代码行 / 空行 / 注释行(单行注释、块注释)
- 命令行集成:各参数、默认行为、文件不存在异常处理
六、版本管理(码云)
| 版本 | 内容 |
|---|---|
| v0.1 | 空项目(初始化仓库、README) |
| v0.2 | 完成基础功能 + 基础单元测试 |
| v0.3 | 完成扩展功能(代码统计)+ 更多测试用例 |
| [Gitee地址]( https://gitee.com/Kevin_ZZQ/zstu26-software-engineering/tree/master ) |
每次提交附上运行结果截图,体现版本更迭。
七、性能测试(加分项)
使用 PyCharm 的 Profiler 对 wc.py -a 在大文本(数 MB)上进行分析,或使用:
$ python -m cProfile -s cumulative wc.py -a sample.txt
程序采用单次遍历文本的线性算法,时间复杂度为 O(n)。
浙公网安备 33010602011771号