软工第四次作业

第四次作业-结对编程

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.描述结对的过程

在这里插入图片描述
在这里插入图片描述

原文地址:https://www.cnblogs.com/lqk0216/p/11681993.html