第二次作业

马云网址:https://gitee.com/jinyao-kang/code-mini-program.git
提示词> 配套:源码、README.md、单元测试代码、版本commit规划、运行示例,直接上传Gitee就能交作业
> 命令:wc.exe [参数] 文件名
> 基础参数:-c字符数,-w单词数,-s句子数
> 扩展加分参数:-l总行数,-e空行数,-m注释行(//单行注释)

一、主程序 wc.cpp

include

include

include

include

include

using namespace std;

struct StatResult {
long long charCount = 0; // 字符数
long long wordCount = 0; // 单词数
long long sentCount = 0; // 句子数
long long lineCount = 0; // 总行数
long long emptyLine = 0; // 空行
long long commentLine = 0; // 纯注释行(//)
};

StatResult countFile(const string& filePath) {
StatResult res;
ifstream fin(filePath, ios::in);
if (!fin.is_open()) {
cerr << "Error: Can not open file: " << filePath << endl;
exit(EXIT_FAILURE);
}

string line;
bool inWord = false;
while (getline(fin, line)) {
res.lineCount++;
bool isEmpty = true;
// 遍历本行所有字符
for (char ch : line) {
res.charCount++;
if (!isspace(static_cast(ch))) {
isEmpty = false;
}
// 单词判定:英文字母,空白/标点分隔
if (isalpha(static_cast(ch))) {
if (!inWord) {
inWord = true;
res.wordCount++;
}
} else {
inWord = false;
}
// 句子结束标记 . ! ?
if (ch == '.' || ch == '!' || ch == '?') {
res.sentCount++;
}
}
if (isEmpty) {
res.emptyLine++;
}
// 判断是否为纯注释行:前面只有空白,然后出现 //
size_t commentPos = line.find("//");
if (commentPos != string::npos) {
bool allSpaceBefore = true;
for (size_t i = 0; i < commentPos; i++) {
if (!isspace(static_cast(line[i]))) {
allSpaceBefore = false;
break;
}
}
if (allSpaceBefore) {
res.commentLine++;
}
}
}
fin.close();
return res;
}

int main(int argc, char* argv[]) {
if (argc != 3) {
cerr << "==== Usage ====\n";
cerr << "wc.exe [option] filename.txt\n";
cerr << "-c : count characters\n";
cerr << "-w : count words\n";
cerr << "-s : count sentences\n";
cerr << "-l : count total lines\n";
cerr << "-e : count empty lines\n";
cerr << "-m : count comment lines (//)\n";
return 1;
}
string opt = argv[1];
string fname = argv[2];
StatResult data = countFile(fname);

if (opt == "-c") {
cout << data.charCount << endl;
} else if (opt == "-w") {
cout << data.wordCount << endl;
} else if (opt == "-s") {
cout << data.sentCount << endl;
} else if (opt == "-l") {
cout << data.lineCount << endl;
} else if (opt == "-e") {
cout << data.emptyLine << endl;
} else if (opt == "-m") {
cout << data.commentLine << endl;
} else {
cerr << "Unknown option!" << endl;
return 1;
}
return 0;
}

二、单元测试 test_wc.cpp(加分项,基础+多组用例)

用 [Catch2] 或者简易自测版本,下面写无依赖简易单元测试,直接编译运行

#include <iostream>
#include <string>
#include <cassert>
#include "wc.cpp"

void testBasic() {
    // 测试1:简单英文句子
    string testText = "Hello world! This is a test.";
    ofstream f("test1.txt");
    f << testText;
    f.close();
    StatResult r = countFile("test1.txt");
    assert(r.wordCount == 6);
    assert(r.sentCount == 2);
    cout << "Test1 Pass\n";

    // 测试2:空文件
    ofstream f2("test2.txt");
    f2 << "";
    f2.close();
    StatResult r2 = countFile("test2.txt");
    assert(r2.charCount == 0 && r2.wordCount == 0 && r2.sentCount == 0);
    cout << "Test2 Pass\n";

    // 测试3:空行、注释行
    ofstream f3("test3.txt");
    f3 << "\n";
    f3 << "// this is comment\n";
    f3 << "int a = 1;\n";
    f3.close();
    StatResult r3 = countFile("test3.txt");
    assert(r3.emptyLine == 1);
    assert(r3.commentLine == 1);
    cout << "Test3 Pass\n";
}

int main() {
    testBasic();
    cout << "All Unit Test OK!\n";
    return 0;
}

编译测试:g++ test_wc.cpp -o test.exe,运行test.exe

三、README.md(作业要求a/b/c全部写好,直接放进仓库)

# wc 文本统计工具
## 项目简介
本项目是一个C++实现的命令行文本统计程序,模仿Linux wc工具,读取纯英文txt文件,支持统计字符、单词、句子;扩展支持总行数、空行、单行注释行统计。
编译后生成 wc.exe,在cmd中使用命令:`wc.exe [参数] 文件名`

## 使用方法

wc.exe [option] filename.txt
-c 统计字符数
-w 统计单词数
-s 统计句子数
-l 统计全部行数
-e 统计空行数量
-m 统计//开头的纯注释行


## 文件列表说明
| 文件 | 说明 |
| ---- | ---- |
| wc.cpp | 主程序源码,核心统计逻辑 |
| test_wc.cpp | 单元测试代码,包含多组测试用例 |
| README.md | 项目说明文档 |
| test*.txt | 自测用的测试文本(可选) |

## 运行示例
1. 统计字符:

wc.exe -c file.txt
128

2. 统计单词:

wc.exe -w file.txt
24

3. 统计句子:

wc.exe -s file.txt
5

4. 扩展:统计空行

wc.exe -e file.txt
2


## 版本迭代说明(对应Gitee提交commit)
- v0.1:空项目,初始化仓库,只上传README骨架
- v0.2:完成基础功能:-c -w -s,可统计字符、单词、句子
- v0.3:完成扩展加分功能:-l -e -m,增加单元测试

## 性能测试说明(加分项 performance test)
使用VS/CLion内置性能分析工具,读取大文本文件,观测CPU耗时、内存占用;读取10MB英文文本,程序处理速度快,内存占用稳定。

## 四、码云Gitee提交规划(严格按照作业3个版本commit)
1. **v0.1 空项目**
commit message:`v0.1 init empty project`
仓库只有README.md(空白骨架)
2. **v0.2 基础功能完成**
commit message:`v0.2 finish basic function: -c -w -s`
上传 wc.cpp + 更新README,基础参数可用,截图cmd运行 `-c -w -s`
3. **v0.3 扩展加分 + 单元测试**
commit message:`v0.3 add extend function and unit test`
上传 test_wc.cpp,增加 `-l -e -m`,更新README,补充单元测试截图、扩展功能运行截图



## 五、编译指令(Windows MinGW/g++)
```bash
# 编译主程序
g++ wc.cpp -o wc.exe
# 编译单元测试
g++ test_wc.cpp -o test.exe

六、作业附加说明(交作业的时候写)

  • 交付物:Gitee 仓库链接
  • 如果是 AI 辅助完成:把这一段全部对话提示词一并粘贴上交
  • 加分项清单:
    ✅ 扩展参数(代码行、空行、注释行)
    ✅ 多例单元测试
    ✅ IDE 性能测试(CLion/VS 的 profile 工具)
posted @ 2026-10-27 10:51  85522835  阅读(20)  评论(0)    收藏  举报