github地址: https://github.com/JovanW/wordcount
1. PSP表格
PSP2.1 Personal | Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 20 |
Estimate | 估计这个任务需要多少时间 | 20 | 20 |
Development | 开发 | 1070 | 1005 |
Analysis | 需求分析 (包括学习新技术) | 60 | 40 |
Design Spec | 生成设计文档 | 40 | 40 |
Design Review | 设计复审 (和同事审核设计文档) | 30 | 40 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
Design | 具体设计 | 60 | 45 |
Coding | 具体编码 | 400 | 360 |
Code Review | 代码复审 | 30 | 25 |
Test | 测试(自我测试,修改代码,提交修改) | 200 | 150 |
Reporting | 报告 | 120 | 150 |
Test Report | 测试报告 | 30 | 25 |
Size Measurement | 计算工作量 | 30 | 20 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 40 |
合计 | 1070 | 1005 |
2. 解题思路
- wordcount.exe的基本功能是统计文本文件的字符数、单词数和行数,因此需要三个不同的命令来实现这些功能。在命令行窗口使用'-c'/'-w'/'-l'命令时,程序会调用随后路径中的文件并完成与命令相对应的功能。因此,我根据数组argv[2]中的字符串来区别不同的命令,然后再根据字符、单词以及行数各自的特征来实现统计。
3. 代码说明
- 统计字符数 '-c':
case 'c':
{
while( !feof(fp) ) //读取文件直到左后一个字符
{
char a = fgetc(fp); //大循环来返回每读取的一个字节
if( a!=' ' && a!='\n' && a!='\t' && a!=',' && a!='.' && a!='!' && a!=';' && a!='=' )
c++; //字符数加一
}
c--;
printf( "the number of characters:%d\n", c);
break;
}
- feof(fp)读取文件直到文件末尾,当检测到的字符不是特殊字符的时候,字符数加一;由于文件末尾有EOf,字符数会多加了1,因此在最后减去1。
- 统计单词数 '-w':
case 'w':
{
char a =fgetc(fp);
while( a != EOF)
{
if( (a >='a' && a <='z') || ( a >='A' && a <='Z') || ( a >='0' && a <='9') )
{
while((a >='a' && a <='z') || ( a >='A' && a <='Z') || ( a >='0' && a <='9'))
a =fgetc(fp);
w++;
a =fgetc(fp);
}
else
a =fgetc(fp);
}
printf("the number of words:%d\n",w);
break;
}
- 统计单词数的方法是:检测到字幕或者数字时,用一个循环查找其后的第一个特殊符号,此时单词数就加一。这就是统计单词的思想。
统计行数 '-l':
case 'l':
{
while( !feof(fp) ) //读取文件直到左后一个字符
{
char a = fgetc(fp); //大循环来返回每读取的一个字节
if( a=='\n')
l++; //行数加一
}
l++;
printf( "the number of linies:%d\n", l);
break;
}
- 统计行数的方法:当查找到换行符的时候,行数加一;由于最后一行没有换行符,在之前的算法里面也没有统计到最后一行,因此最后加上1作为最后的一行的行数即可。
4. 测试
1.空文件
2.只有一个字符的文件
3.只有一个词的文件
4.只有一行的文件
5.一个典型的文件
扫描二维码关注公众号,回复:
3193111 查看本文章
具体见源代码。
5. 总结
- 从得知题目开始就知道这个作业需要我话很多时间和精力来做,果然,事实的确如此。从写这个小工具中我发现任何时候自己都有可能会出错,一定不能过分的自信,一次次重想,一次次重写,都会花费自己更多的时间。最后希望自己能真正是学习到了一点儿东西。