1.Github项目地址
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) | |||||||||
Planning | 计划 | 20 | 20 | |||||||||
• Estimate | • 估计这个任务需要多少时间 | 10 | 10 | |||||||||
Development | 开发 | 300 | 300 | |||||||||
• Analysis | • 需求分析 (包括学习新技术) | 30 | 25 | |||||||||
• Design Spec | • 生成设计文档 | 20 | 20 | |||||||||
• Design Review | • 设计复审 | 10 | 10 | |||||||||
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 20 | 30 | |||||||||
• Design | • 具体设计 | 30 | 40 | |||||||||
• Coding | • 具体编码 | 350 | 620 | |||||||||
• Code Review | • 代码复审 | 30 | 30 | |||||||||
• Test | • 测试(自我测试,修改代码,提交修改) | 100 | 140 | |||||||||
Reporting | 报告 | 100 | 80 | |||||||||
• Test Repor | • 测试报告 | 40 | 50 | |||||||||
• Size Measurement | • 计算工作量 | 10 | 20 | |||||||||
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 50 | 30 | |||||||||
合计 | 1120 | 1425 |
3.接口
函数之间是相互独立的,调用不影响。但是因为互不影响,所以void top中判断是否为单词的部分与统计单词中的判断单词部分重合了。
封装
class Zsn
{
private:
string fname;
public:
Zsn(string name);
~Zsn() {};
int charact();
int line();
int word();
void top10();
};
4.解题思路
需求分析:
1.统计字符数和行数。
2.统计单词总数:作业要求中对单词的定义,是4个英文字母开头,后跟零个或多个英文字母或数字。
3.统计统计文件中各单词的出现次数,并输出出现频率最高的10个.
解题方案
1.单词数:每次读入一个字符,只要读入一个字符j就加一,如果输入的字符是英文字母,i也就加一,j加到4时,判断i、j是否相等,若相等则为单词,bool改为true。单词要一直读入直到读入非数字和英文字母的字符为止,此时判断bool,为true则单词数加一,再进行初始化。要注意的时文件末尾可能出现直接以单词结尾的情况,这种需要在循环结束后再进行一次bool判断,true则加一。
2、行是以 结束的, 也就是说, 遇到 行数加一,但是要排除一行只有换行符的情况,可以用bool和换行符一起判断。同时最后一行可能没有换行符,这个可以在所有循环结束后再用bool进行判断。
3.字符数:只要得到的一个字符不是空的,字符数加一。
4.统计词频:使用map。在判断完是否为单词之后,可以将读入的字符存储起来,若字典中没有该单词,则加入该单词,并将频次设为1,若已有该单词,则该单词频次加一。之后可以用迭代器,用两个游标进行冒泡排序。
5.代码组织
1.统计字符数
int countcharact = 0;
char achar;
int getchar = fread(&achar, 1, 1, fin);
while (getchar)
{
countcharact++;
getchar = fread(&achar, 1, 1, fin);
}
return countcharact;
2.统计行数
int countline = 0;
bool isline=false;
char achar;
int getchar = fread(&achar, 1, 1, fin);
while (getchar)
{
if (achar >= 33) isline = true;
if (achar == '
'&&isline == true)
{
countline++;
isline = false;
}
getchar = fread(&achar, 1, 1, fin);
}
if (isline == true)
{
countline++;
isline = false;
}
3.统计单词数
int countword = 0;
char achar;
bool wordjudge = false;
int i = 0, j = 0;
int getchar = fread(&achar, 1, 1, fin);
while (getchar)
{
if ((achar <= 57 && achar >= 48) || (achar >= 65 && achar <= 90) || (achar >= 97 && achar <= 122))//
{
j++;
if ((achar >= 65 && achar <= 90) || (achar >= 97 && achar <= 122))
{
i++;
}
if (j == 4 && i == 4)
{
wordjudge = true;
}//判断是否为单词
}
else
{
if (wordjudge == true)
{
countword++;
wordjudge = false;
}
i = j = 0;
}
getchar = fread(&achar, 1, 1, fin);
}
if (wordjudge == true)
{
countword++;
wordjudge = false;
i = j = 0;
}
4.统计词频(最高的10个)
char achar;
bool wordjudge = false;
char ex[2];
char word[100];memset(word, ' ', 100);
map<string, int>map1;
int i = 0, j = 0;
int getchar = fread(&achar, 1, 1, fin);
while (getchar)
{
if ((achar <= 57 && achar >= 47) || (achar >= 65 && achar <= 90) || (achar >= 97 && achar <= 122))//
{
++j;
if ((achar >= 65 && achar <= 90) || (achar >= 97 && achar <= 122))
{
i++;
}
if (j == 4 && i == 4)
{
wordjudge = true;
}//判断是否为单词
memset(ex, ' ', 2);
ex[0] = achar;
strcat_s(word, strlen(word) + strlen(ex) + 1, ex);
}
else
{
if (wordjudge == true)
{
if (!map1[word])
{
map1[word] = 1;
}
else
{
map1[word]++;
}
wordjudge = false;
}
i = j = 0;
memset(word, ' ', 100);
}
getchar = fread(&achar, 1, 1, fin);
}
if (wordjudge == true)
{
if (!map1[word])
{
map1[word] = 1;
}
else
{
map1[word]++;
}
wordjudge = false;
}
//排序
map<string, int>::iterator iter1;
map<string, int>::iterator iter2;
iter1 = map1.begin();
for (i = 1;i <= 10;i++)
{
if (map1.size() < i) break;
for (iter2 = map1.begin();iter2 != map1.end();iter2++)
{
if (iter2->second > iter1->second)
{
iter1 = iter2;
}
}
cout << "<" << iter1->first << ">: " << iter1->second << endl;
iter1->second = 0;
it
er1 = map1.begin();
}
6.测试与覆盖率
测试:
覆盖率:
7.计算模块部分异常处理说明
文件夹中没有input文件:
解决方案:只要将input.txt移动到word count文件夹中就可以了。