第二次作业

第二次作业随笔

这个作业属于哪个课程 [软件工程]( 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)。

posted @ 2026-10-29 22:26  Kevin-ZZQ  阅读(22)  评论(0)    收藏  举报