第四次作业-结对编程
1.结对伙伴与仓库地址
git仓库地址 | https://github.com/Tracerlyh/WordCount.git |
---|---|
结对伙伴 | 学号 201831061215 |
好友博客地址 | https://blog.csdn.net/qq_39277137/article/details/102518153 |
2.psp表格开发时间
3.计算模块接口设计与实现过程
开始我使用的是file来写文件(c风格的类型),但伙伴使用的是fstream,因此经过商讨和对接。最终改为了c++风格的文件类型,通过定义两个结构体来构建最基本的类型。定义1个转化函数来转化大小写,1个函数用来判断是否为单词,剩下5个函数分别实现4个基本功能和一个附加功能。我所负责的是统计字符数以及单词数。
功能1的代码:
功能2的代码:
4.代码复审
在复审过程中,我们发现了如下问题和要改进的细节
1、在使用文件之后要关闭文件。
2、主要的功能函数的参数中要有一个参数为文件类型。
3、在函数中打开和关闭文件。
4、在声明函数时在函数声明后面添加注释说明函数的功能。
5、在主函数中调用写的功能函数时添加注释说明函数得功能。
6、主函数中只进行与用户交互的提示信息的输出到屏幕。
7、各个功能的运行结果的输出都在相应的函数中输出到屏幕。
5.计算机接口部分性能改进
写完程序后我们使用了vs2017自带的性能分析器来进行效率分析
发现除了主函数外,统计字符频次的函数耗时最多,因此做了如下的修改:
void GetNumCUM(fstream &fp,Wordlist &W,string objectf)//反映文件中单词出现的频率,并将出现频率前10的单词输出到屏幕
{
fp.open(objectf, ios::in);
string word;
int i = 0;
W.wordlist = new Word[2000];
W.NumofWord = 0;
W.SumofWord = 0;
W.Max = 100;
while (!fp.eof())
{
if (W.NumofWord >= W.Max)//内存空间已满0
{
/*Word *tf=new Word[Maxsize+20];
Wordlistcopy(tf,W.wordlist,Maxsize);
W.wordlist = NULL;
W.wordlist = new Word[Maxsize + 20];
Wordlistcopy(W.wordlist,tf,Maxsize);
tf = NULL;
W.Max += 20;*/
cout << "存储空间已满"<<endl;
}
fp >> word;
/*if (!fp)
break;*/
if (Judgeword(word))//判断是否是一个单词
{
Togglecase(word);
if (CFDuplicates(word, W) != -1)//如果有重复
{
W.wordlist[CFDuplicates(word, W)].Soo++;//对应的单词的频率加1
W.SumofWord++;
}
else
{
W.wordlist[i].Soo = 0;
if ((word[word.length() - 1] >= '!'&&word[word.length() - 1] <= '/') || (word[word.length() - 1] >= ':'&&word[word.length() - 1] <= '@') || (word[word.length() - 1] >= '['&&word[word.length() - 1] <= 96) || (word[word.length() - 1] >= 123 && word[word.length() - 1] <= 126))
{
W.wordlist[i].spelling = word.substr(0, word.length() - 1);
W.wordlist[i].Soo++;
W.NumofWord++;
W.SumofWord++;
i++;
}
else
{
W.wordlist[i].spelling = word;
W.wordlist[i].Soo++;
W.NumofWord++;
W.SumofWord++;
i++;
}
}
}
}
int j = 0;
int k = 0;
for (i = 0; i < W.NumofWord; ++i)//将前十排出来
{
for (j = 0; j < W.NumofWord; ++j)
{
if (W.wordlist[j].Soo < W.wordlist[j + 1].Soo)
{
word = W.wordlist[j].spelling;
k = W.wordlist[j].Soo;
W.wordlist[j].spelling = W.wordlist[j + 1].spelling;
W.wordlist[j].Soo = W.wordlist[j + 1].Soo;
W.wordlist[j + 1].spelling=word;
W.wordlist[j + 1].Soo=k;
}
if (W.wordlist[j].Soo == W.wordlist[j + 1].Soo&&W.wordlist[j].spelling > W.wordlist[j + 1].spelling)
{
word = W.wordlist[j].spelling;
k = W.wordlist[j].Soo;
W.wordlist[j].spelling = W.wordlist[j + 1].spelling;
W.wordlist[j].Soo = W.wordlist[j + 1].Soo;
W.wordlist[j + 1].spelling = word;
W.wordlist[j + 1].Soo = k;
}
}
}
cout << "词汇数量(不计重复单词):" << W.NumofWord<<endl;
cout << "词汇数量(计重复单词):" << W.SumofWord << endl;
i = 1;
cout << "频次前十的单词:" << endl;
while (i<=10)
{
if (i > W.NumofWord)
{
break;
}
else
{
cout <<i <<"、 "<<W.wordlist[i - 1].spelling <<" 出现频次:"<<W.wordlist[i-1].Soo<< endl;
}
i++;
}
fp.close();
}
利用结构体就可以有效的降低代码的重复率,增加程序的效率。
6.单元测试
我所负责的功能1测试:
我负责的功能2测试:
7.计算模块处理异常
在编写程序时,曾经遇到内存不够的情况,并且在多次尝试之后并无结果。后来与同伴商讨后得出了结论,并且加入了测试单元,详情请见伙伴的博客关于异常的处理。
8.描述结对的过程