首页 > 其他 > 详细

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

时间:2018-09-12 00:37:35      阅读:250      评论:0      收藏:0      [点我收藏+]

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

1.PSP 表

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

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.性能改进

技术分享图片

做出这题来感觉都不容易了,改进的话有余力再说吧,带一张运行结果图
技术分享图片

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.单元测试

技术分享图片

7.代码覆盖率

技术分享图片

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

8. 心得体会

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

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

原文:https://www.cnblogs.com/TanQi/p/9628244.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!