福大软工1816 · 第二次作业 - 个人项目
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,操作啥的都会比较生疏。