福大软工第二次作业

一、项目地址

https://github.com/396406412/personal-project

二、PSP表格

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

三、思路描述

      刚开始拿到题目的时候,想的是不就是统计字符跟单词的个数,简单,以前做过类似的。本来想用JAVA写的,但是没怎么用过JAVA,尝试着用JAVA写了后放弃了,,根本不会ORZ,后来老老实实用比较熟悉的C++写,首先第一个要解决的问题就是不会如何读入文件,后来百度了一下才知道用fstream头文件,又瞄了眼别人做好的代码算法思路,在心里自己大概知道哪里怎么样怎么样,便开始自己埋头写了。

四、设计实现过程

      1.首先肯定先意识到会创建一个结构体,来保存已知的单词,方便后面统计单词出现的频率以及用sort函数对其进行排序(这里还需要对sort的第三个参数进行重新编码,来保证排序的顺序,然后差点忘记第二个参数的地址要到尾地址的下一个地址)
      2.函数肯定会有大写转为小写和如何对重复的单词进行统计数量。
      3.一个最主要的算法,那就是判断是否是一个单词,如何把这个单词完整地存入先前写好的结构体。

五、

六、代码说明

bool cmp(danci x, danci y)//这个是sort的第三个参数的函数。
{
    if (x.num1 > y.num1)
        return true;   //如果词的频率比较大,直接返回
    else if (x.num1 == y.num1)
    {
        if (x.content>y.content)return false;
        else return true;//如果两个词的频率一样大,则需要按字典序排序,这里直接用string比较
    }
    else
        return false;//如果词的频率比较小,直接返回
}
while (getline(file, d))//这段是最主要的算法部分,这里得到每一行的字符串
    {
        linenum = d.size() + 1;//每行的字符数量,+1是+的换行符
        if (linenum != 1)
        {
            linenumber++;
        }//这个是有效行的数量
        count += linenum;
        bigtosmall(d);//大写转成小写
        //cout << count<<" "<<linenumber<<" "<<d << endl;
        for (i = 0; i < d.size(); i++)
        {
            if (d[i] >= 'a'&&d[i] <= 'z')//找到第一个小写字母,开始继续往下找
            {
                size = 0;
                pp[size] = d[i]; size++;
                for (j = i + 1; j < d.size(); j++)
                {
                    if(d[j]>='a'&&d[j]<='z')
                    {
                        //cout << d[j];
                        pp[size] = d[j]; 
                        size++;
                    }
                    else
                    {
                        break;
                    }
                }//找到不是小写字母的字符,记下已经找到了几个连续的小写字母,size
                //cout << pp << endl;
                if (size >= 4)//大于等于4,则可以构成一个单词
                {
                    for (r = j; r < d.size(); r++)//找不是小写字母的字符,比如123456789。,?,能和小写字母连起来一起构成单词的字符,然后把单词赋给结构体数组
                    {
                                if (d[r] != ' ')
                        {
                            pp[size] = d[r]; size++;
                        }
                        else
                        {
                            i = r; pp[size] = '\0';
                            word[num].content = pp;
                            break;
                        }
                        if (r == d.size() - 1)
                        {
                            pp[size] = '\0';
                            word[num].content = pp; i = r;
                        }
                    }
                    if (j >= d.size())
                    {
                        i = j; pp[size] = '\0';
                        word[num].content = pp;
                    }
                    num++;
                }
                else
                {
                    i = j;
                }
            }
        }
    }
for (i = 0; i < num; i++)//这里是词频统计
    {
        if (word[i].flag == 0)
        {
            continue;
        }//flag的功能是对已经统计过的单词不需要再进行统计,直接PASS跳
        for (j = 0; j < num; j++)
        {
            if (i == j)continue;
            if (word[i].content == word[j].content)
            {
                word[i].num1++;
                word[j].flag = 0;
            }
        }
    }

七、心路历程与收获

     收获1.如何将文件中的内容读入
     收获2.更善于对自己的项目进行总结和规划
     
     心路历程:还是等熟练了某种语言后再拿来写项目吧。。。然后一开始用CMD来进行输入输出的时候一直报错,还一直找不出原因,心情有点糟。不过后面写算法的时候还是挺顺畅的嘻嘻。

猜你喜欢

转载自www.cnblogs.com/hjj455/p/9631596.html