软件技术基础第二次作业
用 C# 写一个命令行文本计数统计程序(wc.exe)—— 软件技术课程作业复盘
一、项目简介
这次作业要求实现一个类似 Linux wc 的命令行文本统计程序:wc.exe [参数] [文件名]。
我用 C# / .NET 完成了全部基础功能和扩展功能,包含 89 个单元测试和性能测试,
并通过三个版本的 commit 记录了完整的开发演进过程。
项目地址(码云):https://gitee.com/shengxuyi/wc(公开仓库,按课程要求提交)
二、功能与参数
程序支持 7 个统计参数,可自由组合(如 -cwslema 一次输出全部):
| 参数 | 含义 | 统计规则(节选) |
|---|---|---|
-c |
字符数 | 含空格与换行(Windows 下 \r\n 计 2 个字符) |
-w |
单词数 | 按空白分隔,去除首尾标点 |
-s |
句子数 | 按 . ! ? 结束符统计,连续结束符只计一句 |
-l |
总行数 | 按换行符切分 |
-e |
空行数 | 空白行或仅有 { } 的行 |
-m |
注释行数 | //、/* */(支持跨行) |
-a |
代码行数 | 除空行、注释行外的有效行 |
三条守恒关系可以自验:总行数 = 空行 + 注释行 + 代码行。
异常处理也做了完整覆盖:文件不存在、参数为空、未知选项、多传文件、空文件
均给出友好提示;退出码约定为 0 成功 / 1 参数错误 / 2 文件错误,便于脚本调用。
$ wc.exe -cwslema samples/code_sample.cs
515 chars samples/code_sample.cs
50 words samples/code_sample.cs
7 sentences samples/code_sample.cs
23 lines samples/code_sample.cs
11 empty lines samples/code_sample.cs
4 comment lines samples/code_sample.cs
8 code lines samples/code_sample.cs
三、设计与实现
代码按职责拆成 5 个模块,统计逻辑全部是纯函数(不碰文件系统),
所以单元测试不需要生成临时文件就能覆盖绝大多数场景:
Program:入口、输出格式、退出码;CommandLineParser / CommandLineOptions:参数解析与校验;TextCounter:字符 / 单词 / 句子统计;CodeLineCounter:空行 / 注释行 / 代码行分类——核心是一个逐字符状态机,
能正确处理块注释跨行、字符串/字符字面量里的//与/*、转义符等坑;TextFileReader:UTF-8(含/不含 BOM)、UTF-16 文件读取与错误提示。
源码刻意保持 C# 5 兼容语法,因此既能用 .NET 10 SDK 编译(dotnet build),
也能在没有 SDK 的机器上用系统自带的 .NET Framework csc 直接编译,产物行为一致。
四、单元测试:89 个用例
用 xUnit 编写了 89 个测试,覆盖:基础统计(空文件、单个词、多句、标点、
多空格、\r\n 换行、混合文本)、参数解析(13 种合法/非法输入)、
行分类(15 组边界样例 + 整篇守恒校验)、扩展选项,以及端到端测试
(真实启动编译出的 wc.exe,断言输出与退出码)。
$ dotnet test -c Release
已通过! - 失败: 0,通过: 89,已跳过: 0,总计: 89
五、性能测试
用脚本生成 1MB / 10MB / 50MB 混合文本(英文句子 + 代码行),全项统计计时:
| 规模 | 平均耗时 | 吞吐 |
|---|---|---|
| 1 MB | ≈ 0.15 s | ≈ 7 MB/s |
| 10 MB | ≈ 0.40 s | ≈ 26 MB/s |
| 50 MB | ≈ 1.50 s | ≈ 34 MB/s |
耗时随规模近似线性增长,全部 7 项统计单遍扫描完成,无平方级操作。
方法、环境与完整数据见仓库 docs/performance.md。
六、版本演进(三次提交)
| 版本 | 内容 |
|---|---|
| v0.1 | 项目骨架 + README 初稿 |
| v0.2 | 基础功能(-c/-w/-s)+ 49 个基础测试 + 5 张运行截图 |
| v0.3 | 扩展功能(-l/-e/-m/-a)+ 40 个扩展/端到端测试 + 性能测试 |
每个版本打了 git tag,检出任意 tag 都能独立编译、测试全绿。
开发中踩过的坑也值得记录:测试代码里 [InlineData('-l')] 这种
"两个字符的单引号字面量"在 csc 老编译器下漏检、换 .NET SDK 才暴露;
相对路径层级数错导致"文件不存在"——最后统一改为在仓库根目录运行,
用完整相对路径引用 exe,从根上避免数 ../。
七、AI 使用说明
本项目开发过程使用了 AI 辅助(设计方案、代码生成、问题排查)。
按课程要求,全部对话提示词记录已随仓库提交,位于
docs/ai-prompts.md(README 第 12 节亦有链接),共 6 条记录(P1~P6),
每条包含:编号 / 阶段 / 提示词原文 / AI 产出 / 人工复核与修改,
如实反映了 AI 产出与本人复核、修改、实际操作(建仓、提交、截图、测试)的分工。
八、仓库地址
https://gitee.com/shengxuyi/wc
欢迎老师与同学检视,任何一个 tag 检出后:
dotnet build -c Release && dotnet test 即可复现 89 个测试全部通过。

浙公网安备 33010602011771号