软件工程第二次实践
Posted wzh7
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件工程第二次实践相关的知识,希望对你有一定的参考价值。
实现一个能够对文本文件中的单词的词频进行统计的控制台程序
1.Github项目地址: xinz
2.PSP表格
3.解题思路描述:拿到题目之后,先总的浏览了两遍,大致上明白了题意和需要用的知识。首先得先通过学习学会如何使用c++读取和写入文本文件,这需要花费一段时间。然后因为需要统计词频,所以还需要对字符串的相关知识,并且需要设计一个算法来排序单词出现的次数,通过查阅书本和上网浏览资料完成。
4.设计实现过程:
- 代码中会有一个结构体来储存出现的单词和其对应出现的频率
- 一个统计字符的函数
- 一个统计行数的函数
- 一个统计单词和其频率的函数
- 一个判断是否为字母的函数
- 一个判断是否为数字的函数
- 一个将结果输出的文本的函数
- 一个用来将结构体排序的函数
- 单元测试的设计
- 测试当输入文件为空时,统计字符结果为0
- 测试判断行数是否正确
- 测试判断单词统计是否正确
- 截图如下
5.改进思路:一开始是想用冒泡排序来排序结构体,后来选择了相对速度更快的快排来代替。
6.代码说明:
- 判断是否为单词并且统计单词个数
int countword(FILE *f)
{
char ch;
int n = 0, flag = 1;
int x;
int i, j;
while (!feof(f)) //读单词写入结构体,并统计单词个数
{
ch = getc(f);
if (ch == ‘ ‘ || ch == 10) //出现空格或换行的情况跳过
{
flag = 1;
continue;
}
if (isnum(ch)) //flag用于出现“7english”情况的错误判断
{
flag = 0;
continue;
}
if ((ischar(ch)) && flag == 1)
{ //当出现一个字母,并且前一个相邻的不是数字时进入
int k = 0;
x = 0;
s.count = 1;
while ((ischar(ch)) || (isnum(ch)))
{
if (x <= 3 && (isnum(ch))) //没有符合至少以四个英文单词开头
{
k = k - x;
flag = 0;
break;
}
s.word[k++] = tolower(ch); //将大写转换为小写
ch = getc(f);
x++;
}
if (flag == 0) continue;
if (x <= 3) //如果出现字符数小于4个的情况,不算单词
{
k = k - x;
continue;
}
s.word[k++] = ‘ ‘;
j = n;
for (i = 0; i < j; i++) //与结构体中比较,如果存在,则改单词次数+1
{
if (strcmp(s.word, str[i].word) == 0)
{
str[i].count++;
break;
}
}
if (n == 0 || i == j) //不存在将单词写入结构体中
{
str[n++] = s;
}
}
}
return n;
}
7.心路历程与收获:通过本次任务,看到了自身的不足,对于c++的学习还没有到位,临时去学习的文件输入输出流,所以前期准备就花费了很多时间。而且自己完成的算法也不算是有效的,所以今后会利用空闲时间补缺补漏,弥补自己不足的地方,多加强学习。在接触github之后,理解了为什么每次代码有进展之后都要commit,这样可以让自己的思路清晰,时刻知道自己的进度和自己的编程经历。通过这次任务也第一次接触了单元测试的理念,感觉这是一个很好测试程序的办法,没有做好的是,单元测试应该在写代码之前就构思好,在写完一个功能就进行测试,但是本次任务是完成所有功能之后才进行的单元测试,以后会改正。通过本次任务,收获了很多知识,虽然花费的挺多的时间,但是过程和结果都感觉很充实,很享受专注做一件事情的感觉,希望以后还能再接再厉。虽然本次任务完成了,但是相关的学习还会继续,并且会学习其他方面的内容,为之后的任务做准备。
以上是关于软件工程第二次实践的主要内容,如果未能解决你的问题,请参考以下文章