第四次作业:结对编程

第四次作业:结对编程

Git项目地址 项目地址
姓名 曲晨阳
学号 201831061313
结对伙伴 潘伟键
伙伴博客地址 https://www.cnblogs.com/pwj1278634240/
学号 201831061312

1.结对编程照片

第四次作业:结对编程_第1张图片

2.PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 43
· Estimate · 估计这个任务需要多少时间 1200 1500
Development 开发 60 90
· Analysis · 需求分析 (包括学习新技术) 30 60
· Design Spec · 生成设计文档 40 20
· Design Review · 设计复审 (和同事审核设计文档) 30 30
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 20 30
· Design · 具体设计 120 150
· Coding · 具体编码 600 800
· Code Review · 代码复审 200 300
· Test · 测试(自我测试,修改代码,提交修改) 120 150
Reporting 报告 30 60
· Test Report · 测试报告 20 20
· Size Measurement · 计算工作量 30 35
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 30
合计 2560 3318

3.解题过程

Wordcount需求描述:

统计input.txt中的以下几个指标

1.统计文件的字符数:
只需要统计Ascii码,汉字不需考虑
空格,水平制表符,换行符,均算字符
英文字母:A-Z,a-z
字母数字符号:A-Z,a-z,0-9
分割符:空格,非字母数字符号
例;file123是一个单词,123file不是一个单词。file,File和FILE是同一个单词输出的单词统一为小写格式

2.统计文件的单词总数,单词:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写。

3.统计文件的有效行数:任何包含非空白字符的行,都需要统计。

4.统计文件中各单词的出现次数,最终只输出频率最高的10个。频率相同的单词,优先输出字典序靠前的单词。

输出的格式为
· characters: number

· words: number

· lines: number

· : number

· : number

· ...

解题思路:

题目要求统计一个文本文档中的字符数,单词数等,我们的思路是先把文档中的字符全部取出来,存在一个string类的字符串里,然后再进行计数等操作。
在解题过程中,我和我的搭档首先进行了分工,我负责写出main函数和计算字符的函数,我的搭档潘伟键负责写出单词统计和输出十个高频词汇的函数。
分工完成后,我和伟键同时进行编码活动,这个过程不是独立的,在编代码时我们经常交流,互相给出意见,这样最终的代码吻合度高,开发效率也很不错。

思路图:

第四次作业:结对编程_第2张图片

详细代码:

  1. 判断是不是有效单词
  2. 把大写字母转换成小写字母
  3. 把储存在string里的字符转换为单词
  4. 统计字符数

总代码:

    #include 
    #include 
    #include 
    #include 

    using namespace std;

    //写入文件
    ofstream tongji("output.txt", ios::app);

    class word_count
    {
    private:
        string str;

    public:
        //输出原文
        void output()
        {
            cout << "原文:" << endl;
            cout << str << endl;
        }
        //统计字符数
        int countzifu()
        {
            int i = 0;
            int sum = 0;
            while (str[i] != '\0')
            {
                if (str[i] <= 126 && str[i] >= 32 || str[i] == 10 || str[i] == 13)
                sum++;
                i++;
            }
            return sum;
            cout << endl << "字符个数:" << sum << endl;
            tongji << "字符个数:" << sum << '\n';
        }
        //将文件中的字符存入一个string字符串
        void getinstr(stringstream &s)
        {
            str = s.str();
        }

        //判断是不是有效单词
        int judgeword(string a)
        {
            int i = a.size(), n;
            if (i < 4)
            {
                return 0;
            }
            for (n = 0; n < 4; n++)
            {
                if (a[n] < 65 || 91 <= a[n] && a[n] < 96 || a[n]>123 && a[n] < 127)
                    return 0;
            }
            return 1;
        }

        //把大写字母转化为小写字母
        void turn(string& a)
        {
            int n = 0;
            while (a[n] != '\0')
            {
                if ('A' <= a[n] && a[n] <= 'Z')
                    a[n] = a[n] + 32;
                n++;
            }
        }

        //输出前十个高频词汇
        void tenword(string a[500], int n)
        {
            int j, k, p = 0, t = 0, i;
            string b[500];
            int count[500];
            int count1[500];
            int count3[500];
            for (k = 0; k < n; k++)
            {
                count[k] = 1;
                for (j = 0; j < n; j++)
                {
                    if (b[j] == a[k])
                    {
                        count[j]++;
                        break;
                    }
                }
                if (j == n)
                {
                    b[p] = a[k];
                    p++;
                }
            }
            for (k = 0; k < n; k++)
            {
                count1[k] = count[k];
                count3[k] = k;
            }

            for (i = 0; i < n - 1; ++i)
            { // 二重循环完成选择排序
                k = i;
                for (j = i + 1; j < n; ++j) {
                    if (count1[k] < count1[j]) k = j;
                }
                if (k != i) {
                    t = count1[k];
                    count1[k] = count1[i];
                    count1[i] = t;
                    t = count3[i]; // 辅助数组同步操作
                    count3[i] = count3[k];
                    count3[k] = t;
                }
            }
            for (k = 0; k < 10; k++) {
            cout << '<' << b[count3[k]] << ">: " << count[count3[k]] << endl;
            tongji << '<' << b[count3[k]] << ">: " << count[count3[k]] << '\n';
            }
        }


        //把string a转化为单词
        int readword()
        {
            int n = 0;
            int i = 0;
            int j = 0;
            int count = 0;
            string b[500];
            string c[500];
            while (str[i] != '\0')
            {
                if (str[i] != 32 && str[i] != 44 && str[i] != 46)
                {
                    b[n] = b[n] + str[i];
                    i++;
                }
                else
                {
                    n++;
                    i++;
                }
            }

            for (j = 0; j < n; j++)
            {
                if (judgeword(b[j]) == 1)
                {
                    turn(b[j]);
                    c[count] = b[j];
                    count++;
                }
            }
            tenword(c, count);
            return  count;
        }

    };

    int main()
    {
        int a;
        fstream wordfill("input.txt");//打开文档文件
        stringstream ss;
        ss << wordfill.rdbuf();
        word_count count1;
        ofstream tongji("output.txt", ios::app);//写入文件

        count1.getinstr(ss);//将文件中的字符存入一个string字符串

        count1.output();//输出原文

        a = count1.countzifu();//调用统计字符函数
        cout << endl << "字符个数:" << a << endl;
        tongji << "字符个数:" << a << '\n';

        a = count1.readword();//调用单词统计函数
        cout << "单词个数:" << a << endl;
        tongji << "单词个数:" << a << '\n';

        tongji.close();
    }

代码复审:

我和我的同伴把写好的函数合并起来,然后共同封装成一个wordcount类,其中发现了一些输出错误,进行了改正。

运行截图:

第四次作业:结对编程_第3张图片
第四次作业:结对编程_第4张图片

4.性能分析及单元测试:

- 性能分析:
第四次作业:结对编程_第5张图片
第四次作业:结对编程_第6张图片
第四次作业:结对编程_第7张图片

- 单元测试:
第四次作业:结对编程_第8张图片

5:小结:

这次作业可以说是第二次作业的一次升级,使用第二次学习的工具,通过结对编程的方式完成这个题目,我的结对搭档潘伟键非常认真负责,写的代码很完美,都完成了要求的功能,最后在单元测试上面卡了很久很久,最后询问了同学才得以解决,在第二次作业时就没有学好,在以后的作业中还要更加认真去学习。

你可能感兴趣的:(第四次作业:结对编程)