福大软工1816 · 第二次作业 - 个人项目

Github项目地址:(https://github.com/913680749/personal-project/tree/master/Cplusplus/031602133)

1.PSP 表

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

2. 解题思路

  总的功能大致就是统计单词,字符和行数还要输出最高频的10个。统计的功能可能不会太难实现,但是输出最高频的10个单词和以命令行运行并输入到文件有点小烦。以前都没遇见过,又要去自学新的东西了。上网搜了些资料,加上室友的帮助也总算完成了。计数部分没什么,关键是利用freopen函数进行文件的输入与输出,还有map函数的应用,算是解决了最头疼的问题。

[freopen参考资料] (https://blog.csdn.net/imxiangzi/article/details/45916875)
[map函数参考资料] (https://blog.csdn.net/gududanxing/article/details/11069919)

3.设计实现

>Charconversion()函数用于实现英文的大小写转换
>Countchar()函数用于实现有效字符统计
>Countword()函数用于实现有效单词统计
>Scan()和Print()函数则分别实现文件的输入和输出
>Countmaxword()函数用于实现最大频数词的统计输出

4.性能改进

1477542-20180911205943581-1865377604.png

做出这题来感觉都不容易了,改进的话有余力再说吧,带一张运行结果图
1477542-20180911203446562-975660352.png

5.部分代码说明


void Wordinsert(string s)                   /*  向字典树里面插入单词  */
{   
    int len = s.size(), flg;
    node *p;
    p = &root;
    rep(i, 0, len)
    {
        flg = Charconversion(s[i]);
        if (p->next[flg] == NULL)
        {
            p->next[flg] = new node(); p->next[flg]->gs = 0;
        }
        p = p->next[flg];
        if (i == len - 1) { p->gs++; }
    }
}

利用字典树不仅可以节约空间还可以大幅度缩短时间复杂度


int Countword()
{
    int tp = 0;
    rep(i, 0, linenum)
    {
        bool f = 1; int lim = line[i].size();
        rep(j, 0, lim)
        {
            if (is_efct_char(line[i][j]))
            {
                string str = ""; str += line[i][j];
                rep(k, j + 1, lim)
                {
                    if (is_efct_char(line[i][k]))str += line[i][k], j = k;
                    else { j = k;  break; }
                }
                bool f = 0;; int siz = str.size() - 1;
                rep(k, 0, siz) {
                    if (str[k] >= '0'&&str[k] <= '9' && (str[k + 1]<'0' || str[k + 1]>'9'))f = 1;
                }
                if (!f)                   /*  对其是否是有效单词进行判断  */
                {                                                           
                    tp++;
                    Wordinsert(str);                      /* 利用前面的插入函数向字典树中插入单词,字典树不仅可以节约空间还可以大幅度缩短时间复杂度 */ 
                }
            }
        }
    }
    return tp;
}

原本没有引用字典树只用map函数的时候编完以后运行会比较耗费时间,在查阅资料和舍友的提议下借鉴并使用了字典树,勉强算是一个亮点吧。

6.单元测试

1477542-20180911220747074-1010412821.png

7.代码覆盖率

1477542-20180911224021529-848145584.png

整体看来覆盖率是挺高的,甚是欣慰。

8. 心得体会

 老实说,已经开始后悔没退选了,个人编程基础可以说相当的不咋地,做这一个作业都累了半死,对接下来的日子感到深深的担忧。不过总的来说的话感觉我花的编码时间比较久。而且如果直接一整套代码打下来我应该也不至于用这么久,但是又要封装,又要单元测试啥七的八的都要去学,也花了不少时间。而且之前也没用过github,操作啥的都会比较生疏。

转载于:https://www.cnblogs.com/TanQi/p/9628244.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值