这个作业属于哪个课程 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项目地址

Git仓库地址

2.0 代码规范链接

codestyle

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函数等。对于突然出现的难题来说,还是自己平时的练习少,知识储备不够充分,走了歪路浪费了很多时间。