软工第四次作业

第四次作业-结对编程

1.结对伙伴与仓库地址

git仓库地址 https://github.com/Tracerlyh/WordCount.git
结对伙伴 学号 201831061215
好友博客地址 https://blog.csdn.net/qq_39277137/article/details/102518153

2.psp表格开发时间

软工第四次作业_第1张图片

3.计算模块接口设计与实现过程

软工第四次作业_第2张图片
开始我使用的是file来写文件(c风格的类型),但伙伴使用的是fstream,因此经过商讨和对接。最终改为了c++风格的文件类型,通过定义两个结构体来构建最基本的类型。定义1个转化函数来转化大小写,1个函数用来判断是否为单词,剩下5个函数分别实现4个基本功能和一个附加功能。我所负责的是统计字符数以及单词数。
功能1的代码:
软工第四次作业_第3张图片
功能2的代码:
软工第四次作业_第4张图片

4.代码复审

在复审过程中,我们发现了如下问题和要改进的细节
1、在使用文件之后要关闭文件。
软工第四次作业_第5张图片
2、主要的功能函数的参数中要有一个参数为文件类型。
在这里插入图片描述
3、在函数中打开和关闭文件。
软工第四次作业_第6张图片
4、在声明函数时在函数声明后面添加注释说明函数的功能。
软工第四次作业_第7张图片
5、在主函数中调用写的功能函数时添加注释说明函数得功能。
软工第四次作业_第8张图片
6、主函数中只进行与用户交互的提示信息的输出到屏幕。
软工第四次作业_第9张图片
7、各个功能的运行结果的输出都在相应的函数中输出到屏幕。
软工第四次作业_第10张图片

5.计算机接口部分性能改进

写完程序后我们使用了vs2017自带的性能分析器来进行效率分析
软工第四次作业_第11张图片
发现除了主函数外,统计字符频次的函数耗时最多,因此做了如下的修改:

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 << "存储空间已满"<> 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< W.NumofWord)
        {
            break;
        }
        else
        {
            cout <

利用结构体就可以有效的降低代码的重复率,增加程序的效率。

6.单元测试

我所负责的功能1测试:
软工第四次作业_第12张图片
软工第四次作业_第13张图片
软工第四次作业_第14张图片
我负责的功能2测试:
软工第四次作业_第15张图片
软工第四次作业_第16张图片
软工第四次作业_第17张图片

7.计算模块处理异常

在编写程序时,曾经遇到内存不够的情况,并且在多次尝试之后并无结果。后来与同伴商讨后得出了结论,并且加入了测试单元,详情请见伙伴的博客关于异常的处理。

8.描述结对的过程

软工第四次作业_第18张图片
软工第四次作业_第19张图片

你可能感兴趣的:(软工第四次作业)