• 软工第四次作业


    第四次作业-结对编程

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

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

  • 相关阅读:
    温故vue对vue计算属性computed的分析
    bootStrap Table 如何使用
    css 的一些知识点的整理
    css 宽高自适应的div 元素 如何居中 垂直居中
    BOM,Dom 回顾
    DOM
    字符串的一些常用方法 string
    js if for 详解 获取元素方式 及一些js 基础知识
    Java入门1
    python字符串
  • 原文地址:https://www.cnblogs.com/lqk0216/p/11681993.html
Copyright © 2020-2023  润新知