| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zswxy/computer-science-class1-2018 |
|---|---|
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/computer-science-class1-2018/homework/11877 |
| 这个作业的目标 | 通过实践学习软件工程 |
| 学号 | 20188414 |
| 参考文献 | 《码出高效_阿里巴巴Java开发手册》、《腾讯c++代码规范》、《Python PEP8》、map用法、归并排序(nlogn) |
1.0 Github项目地址
2.0 代码规范链接
3.0 解题思路描述 & 设计与实现过程
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 40 | 60 |
| • Estimate | • 估计这个任务需要多少时间 | 40 | 60 |
| Development | 开发 | 80 | 140 |
| • Analysis | • 需求分析 (包括学习新技术) | 30 | 80 |
| • Design Spec | • 生成设计文档 | 40 | 60 |
| • Design Review | • 设计复审 | 20 | 40 |
| • Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
| • Design | • 具体设计 | 100 | 120 |
| • Coding | • 具体编码 | 300 | 500 |
| • Code Review | • 代码复审 | 30 | 50 |
| • Test | • 测试(自我测试,修改代码,提交修改) | 40 | 40 |
| Reporting | 报告 | 10 | 10 |
| • Test Repor | • 测试报告 | 40 | 100 |
| • Size Measurement | • 计算工作量 | 20 | 40 |
| • Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 30 | 30 |
| 合计 | 670 | 1350 |
4.0 解题思路描述
问题的题干是获取行数,获取总单词数,还有获取字符数,统计高频单词及出现次数。一开始想到输入文章由复杂化简,用vector使用动态分配数组来存储它的特殊定义"词组"序号,个人能力不够,运算一段时间后找不到合适的化简序号"字符",且容易把自己绕晕而且达不到一个循环可以用来统计计算长篇文章。请教了室友搜索学习了map的用法,词频统计用map存储。
输入要检测的词组一个一个统计计数。
while (!file1.eof())
{
file1 >> c;
if (file1.eof())
{
break;
}
i++;
}
通过getline一行一行统计计数,可以将空格忽略不计。
string d;
while (!file1.eof())
{
getline(file1, d);
if (file1.eof())
break;
if (d.empty())
{
i--;
}
i++;
}
跳过不是字母开头的词组,计算词数将单词存入map类
for (i = 0; i < n; i++)
{
if (!isChar(b.text[i]))
continue;
else
{
for (j = 0; j < 4 && i < n; j++)
{
if (!isChar(b.text[i]))
break;
store[j] = b.text[i++];
}
if (j == 4)
{
for (m = 0; m < 4; m++)
{
if (store[m] < 97 || store[m]>122)
{
sym = 1;
break;
}
}
if (sym == 0)
{
char* w = new char[1000];
b.sums++;
for (m = 0; m < 4; m++)
{
w[k++] = store[m];
}
while (isChar(b.text[i]) && i < n)
{
w[k++] = b.text[i++];
}
w[k] = '\0';
load(w);
isWord++;
delete[]w;
k = 0;
}
else
{
sym = 0;
j = 0;
}
}
}
}
以二进制读取不会漏读
int i = 0;
ifstream file1;
file1.open(a, std::ios::out | std::ios::binary);
//用map存取单词
void load(char w[])
{
string a;
a = w;
map<string, int>::iterator iter = mapword1.find(a);
if (iter == mapword1.end())
mapword1.insert(pair<string, int>(a, 1));
else
++iter->second;
}
归并排序进行分类识别 一开始找不到很好的方法 借鉴仿写了这篇博文
https://blog.csdn.net/qq_43337263/article/details/105218460
void merge(Words* a, Words* b, int left, int mid, int right)
{
int i = left, j = mid + 1, m = 1;
while (i <= mid && j <= right)
{
if (a[i].count < a[j].count) b[m++] = a[j++];
else b[m++] = a[i++];
}
while (i <= mid) b[m++] = a[i++];
while (j <= right) b[m++] = a[j++];
for (int n = 1; n <= right - left + 1; n++)
a[left + n - 1] = b[n];
}
5.0 异常处理

最初测试结果有出现顺序混乱,按照词组出现顺序来计数而不是按频率次数排列
6.0 性能测试


有向室友求救,循环出现问题但不知道为啥没报错,最后重新整理可以正常使用。
7.0 心路历程与收获
在一开始看到题目时挺震惊的,第一次做题目字数6300的题。审题之后思路泉涌但是越做越觉得吃力路走死了,查阅了相关资料并且在室友点醒之后做题顺畅了很多,学到了map类的存储,并列排序,counterChar函数等。对于突然出现的难题来说,还是自己平时的练习少,知识储备不够充分,走了歪路浪费了很多时间。
浙公网安备 33010602011771号