软件工程第四次作业:结对编程

GIT地址 | <GITHUB克隆地址> |
-|-|-
学生姓名 | 吴昊阳 |
学号 | 201831083104 |
结对伙伴 | 姚志昆 |
伙伴学号 | 201831081105 |
伙伴博客地址 | <姚志昆Anthonyzk> |
一丶 PSP表格

  1.解题思路描述

要求是“统计指定单词的出现频率”,那么就是要解决两个问题:找到指定单词和计数。我们设置了指针用来查找,在查找的同时用search进行统计计数。

刚开始,小组打算分工,分别查阅资料,思考不同阶段要求,伙伴成员协作完成。

对题目要求进行分析后,题目要求为词频统计,但是要求不少,小组决定先做基础要求。

尽量利用C++标准库的功能,利用正则表达式来提取出符合需求定义的单词,
每个单词应具有最简形式、已统计数量等属性,故采用结构体的形式存储。

行数统计:以按行读取的方式读取文本文件,每次成功读取后对应的counter+1,直至文件末尾。(统计文件的有效行数:任何包含非空白字符的行,都需要统计。)

字符数统计: 统计可打印字符个数

单词统计:根据要求,只有由至少4个英文字母打头的连续英文、数字字符串才算做一个单词,并且单词实体不区别大小写字母转换大小写;

保存字符长度>=4的单词-----------使用正则表达式;去掉开头非字符的单词并计数;排序,在自定义数据结构中重载<和<=,来实现词频排序,为了实现降序排序,简单地用大于号重载了小于号。

  2.设计实现过程

代码主要分为三个部分:

1、创建一个结构体


struct WORD {                           /* 创建一个结构体 */
    int    count;
    char    s;
    void    exchange( Word &word )  /* 交换单词 */
    {
        string    tStr    = word.Str;
        int    tCount    = word.Count;
        word.Str    = Str;
        word.Count    = Count;
        Str        = tStr;
        Count        = tCount;
    }
};
} w[100];

2、判断是否是一个单词

bool isword( char a[] ) /* 判断是否是一个单词 */
{
    int i = 0;
    for ( i = 0; a[i] != '\0'; i++ )
        if ( (a[i] >= 'a' && a[i] <= 'z') || (a[i] >= '0' && a[i] <= '9') )
            return(true);
        else
            return(false);
}

3、主函数

int main( void )
{
    char result[500];

    char *ptr;
    ifstream file( "c://A_Tale_of_Two_Cities.txt" ); /* 读取 */
    if ( !file )
    {
        cout << "不能打开文件";
    }
    while ( !file.eof() )
    {
        file.getline( result, 500 );
    }
    file.close();
    int j = 0; /* 大写转小写 */
    while ( result[j] != '/0' && result[j + 1] != '/0' )
    {
        if ( result[j] >= 'A' && result[j] <= 'Z' )
        {
            result[j] = result[j] - 'A' + 'a';
            j++;
        }
    }
    cout << result;
    char *sep = " ";

    int i = 0;
    ptr = strtok( result, " " );            /* 利用strtok函数来分割result字符串中的单词 */
    while ( ptr != NULL )
    {
        if ( isword( p ) != false )
        {
            if ( judge( p, n ) != false )
            {
                w[n].s = *p;    /* 赋值给数组 */
                n++;
            }
        }
        ptr = strtok( NULL, " " );
    }
    int t = 0;
    ofstream outfile;                       /* 输出文件到result1 */
    outfile.open( "Result1.txt" )
    SortWordDown( w, count );
    while ( w[t].s )                        /* 输出统计结果 */
    {
        if ( strlen( w[t].s ) >= 4 )
        {
            outfile << w[t].s << ":" << w[t].count << '\n';
            t++;
        }
    }
    return(0);
}

  3.性能分析


  4.运行截图





  5.分析结果



  6.改进思路

对功能进行模块化。
后续任务:词组统计。可扫描单词数组,按连续指定窗口分割词组进行统计。

二丶分析及总结

1、针对某个问题的讨论决策过程:我们对API接口着重分析,我们两个也分成了两个方向进行研究,姚志昆主要针对类分装做一个接口在命令行进行输入参数;吴昊阳主要是想在web窗口上做一个接口进行输入参数。最终我们讨论的结果是还是在命令行上进行输入参数做一个接口。

2、评价对方:请评价一下你的合作伙伴,又哪些具体的优点和需要改进的地方。 这个部分两人都要提供自己的看法。

姚志昆:吴昊阳非常循循善诱,我不会的地方很耐心的指导,善于思考并且能付诸行动,希望对git指令了解更多。

吴昊阳:姚志昆非常认真,非常负责任,C++的基础也是相当不错的,对于新接触的知识,立刻会付出行动进行验证,对我们的结对编程做出了巨大的贡献。

3、评价整个过程:关于结对过程的建议
结对编程不仅考研了编程能力,也考验了合作能力,我们在编程过程中相互鼓励,分工合作,因为一旦某个功能实现不了,一个人的话很容易暴躁,自闭。两个人可以相互鼓励,也同时形成一种良性竞争,比如这个方法是其中一个人想出来的,另一个人就会去思考有没有更快的方法。希望有机会可以再次结对编程。

   结对编程照片:![](https://img2018.cnblogs.com/blog/1787562/201910/1787562-20191012113107050-1836722834.jpg)
 posted on 2019-10-12 11:31  CharlieWhy  阅读(245)  评论(1编辑  收藏  举报