软工结对2

031602204 陈加伟 (博客地址:https://www.cnblogs.com/Tony-chenjw/p/9769802.html

031602226 林淇(博客地址:https://www.cnblogs.com/q1093797687/p/9769781.html


一、具体分工

  • 陈加伟:自定义输入输出文件,词组词频统计功能,自定义词频统计输出
  • 林淇:加入权重的词频统计,博客

    二、PSP

    PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
    Planning计划6050
    · Estimate· 估计这个任务需要多少时间3030
    Development开发200250
    · Analysis· 需求分析 (包括学习新技术)9090
    · Design Spec· 生成设计文档3040
    · Design Review· 设计复审2020
    · Coding Standard· 代码规范 (为目前的开发制定合适的规范)2030
    · Design· 具体设计200250
    · Coding· 具体编码10001100
    · Code Review· 代码复审9080
    · Test· 测试(自我测试,修改代码,提交修改)100120
    Reporting报告3040
    · Test Report· 测试报告2030
    · Size Measurement· 计算工作量1015
    · Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划3050
    合计18402195

三、解题思路描述与设计实现说明

爬虫使用

  • 使用了现有的爬虫工具八爪鱼实现。该工具可以快速的爬取指定的网页信息,但爬取后的数据要进一步处理为指定格式。

Pic

代码组织与内部实现设计

Pic

wordcount()

Pic

wordmax()

Pic

四、关键代码解释

自定义输入输出文件

int main(int c, char **v)
{
    if (c < 2)
        return 0;

    int i = 1;

    while (i < c)
    {
        vv = v[i];
        if (vv == "-i")
        {
            //传v[i+1],它是输入路径
            txi = v[i + 1];
            i += 2;
            continue;
        }
        if (vv == "-o")
        {
            //传v[i+1],它是输出路径
            txo = v[i + 1];
            i += 2;
            continue;
        }
        if (vv == "-w")
        {
            s = v[i + 1];
            //传v[i+1],它是权重
            if (s == "1")
                bo = 1;
            i += 2;
            continue;
        }
        if (vv == "-m")
        {
            //传v[i+1]它是词数
            m = atoi(v[i + 1]);
            i += 2;
            continue;
        }
        if (vv == "-n")
        {
            //传v[i+1],它是输出个数
            num = atoi(v[i + 1]);
            i += 2;
            continue;
        }
    }

-m 参数设定统计的词组长度


void wordmax(char *tx, string txo, int num, int m)
{
    FILE *fp;
    fopen_s(&fp, tx, "r");
    ofstream outf(txo, ios::app);

    char ch = getc(fp);
    int i = 0, j, ct;
    wd max[100];

    while (!feof(fp))
    {
        ct = 0;
        temps = "";
        while (ch != ':')
            ch = getc(fp);
        while (!ifchar(ch))
            ch = getc(fp);
        while (1)
        {
            if (ch == 10 || ch == EOF)//读到回车,文末
            {
                if (ifword(temps))
                {
                    str[ct] = temps;
                    temps = "";
                    for (int j = 0; j <= ct; j++)//temps置为前面的累加
                        temps = temps + str[j];
                    start(temps, m);
                }
                else//temps是非法单词
                {
                    temps = "";
                    if (ct >= m)//前面的长度大于指定数m
                    {
                        for (int j = 0; j <= ct; j++)//temps置为前面的累加*********<=ct
                            temps = temps + str[j];
                        start(temps, m);
                    }
                }
                break;
            }
            if (temps.size() == 0)
            {
                temps = temps + ch;
                ch = getc(fp);
            }
            else if ((ifchar(temps[temps.size() - 1]) == 0) && ifchar(ch))//遇到当前是字母数字,上一个是分隔符,结束读取
            {
                if (ifword(temps))
                {
                    str[ct] = temps;
                    ct++;
                    temps = "";
                }
                else//temps是非法单词
                {
                    temps = "";
                    if (ct >= m)//前面的长度大于指定数m
                    {
                        for (int j = 0; j <= ct; j++)//temps置为前面的累加*********<=ct
                            temps = temps + str[j];
                        start(temps, m);

                    }
                    ct = 0;
                    temps = "";
                }
            }
            temps = temps + ch;
            ch = getc(fp);
        }
    }
    sor(word, n);

    for (i = 0; i < num; i++)//初始化前num名
    {
        max[i] = word[i];
    }

    for (j = 0; j < num; j++)//前num名排序 
    {
        for (i = 0; i < num - j - 1; i++)
        {
            if (max[i].frq < max[i + 1].frq)
            {
                swap(max[i], max[i + 1]);
            }
        }
    }

    for (i = 10; i < n; i++)//找后面的数 
    {
        if (max[9].frq < word[i].frq)//比最小的还大 
        {
            int a = 8;
            while (max[a].frq < word[i].frq&&a >= 0)
            {
                a--;//定位到第一个比自己大的word
            }

            for (j = 9; j > a + 1; j--)
            {
                max[j] = max[j - 1];//前面的数后移一位 
            }
            if (a < 0)//说明word[i]比max[0]大
                max[0] = word[i];
            else
                max[j] = word[i];
        }
    }

    for (int i = 0; i < num; i++)
    {
        if (max[i].s.length() == 0)
            continue;
        outf << "<" << max[i].s << ">" << ":" << max[i].frq << endl;
    }
    outf.close();
}

性能分析与改进

展示性能分析图和程序中消耗最大的函数

Pic
Pic

贴出Github的代码签入记录

Pic
Pic

遇到的困难及解决方法

问题描述

  • 当然最大的困难就是统计文件夹中指定长度的词组的词频啦~

    做过哪些尝试

  • 其实并没有很多尝试。。。当时和队友大晚上的在一起商量,每个环节都要细细地去想。比如用什么方式读入指定的文件较好,用什么数据结构来储存词组较好,什么样的定义才是合法词组,怎么样区别合法与不合法(这是个关键!),怎样划分词组等等。认真讨论了一个半小时吧,讨论完已经是十一点半多了,突然自己还没洗澡。。。讨论完后第二天我就打算实现这个功能了,靠着仅留下来的两张草稿纸,虽然画的很乱,但思路都活跃在上面。

    是否解决

  • 第二天,花了一整天,终于完全实现了这个功能。其实到下午就已经打完了,但期间出了许许多多的bug。。。后面的时间就在不停地该bug中,晚上才完成。

    有何收获

  • 想一个问题时,一定得细想,有一个大致思路很简单,一旦深入进去想细节的实现,就显得不那么容易了。一些细节的实现,往往是这个任务中最困难的部分。
  • 还有就是有了思路一定要及时实现,不然很容易忘光。
  • 当时在实现这个功能的时候,听周围同学都说它很难实现,有了思路还要花上两天的时间才能实现。事实上我已经没有这么多时间了,于是下定决心一定在一天之内完成,努力一下,梦想总能实现的~

    评价你的队友

  • 超靠谱~超棒好不好!特别踏实认真。答应下来的事情总能圆满的完成,从不会令人失望。还很有团队精神,也任劳任怨。在我感到沮丧劳累的时候,也会及时安慰鼓励我,很庆幸能遇到他这么优秀的队友!

    值得学习的地方

  • 那种踏实劲,简直了!让人特安心,简直男友力Max。我也希望自己以后做事能像他这么踏实。多向他学习吧~

    需要改进的地方

  • emmm能勤快一点就更好了哈哈哈

    学习进度条

    第一周新增代码(行)累计代码(行)本周学习耗时(小时))累计学习耗时(小时)重要成长
    12804002063学会了Axure的基本使用

转载于:https://www.cnblogs.com/Tony-chenjw/p/9769802.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值