软工实践第二次作业

1.Github项目地址

github链接地址

2.PSP表格

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

3.接口

函数之间是相互独立的,调用不影响。但是因为互不影响,所以void top中判断是否为单词的部分与统计单词中的判断单词部分重合了。

封装

class Zsn
{	
	private:
		string fname;
	public:

		Zsn(string name);
		~Zsn() {};
		int charact();
		int line();
		int word();
		void top10();
};

4.解题思路

需求分析:

1.统计字符数和行数。

2.统计单词总数:作业要求中对单词的定义,是4个英文字母开头,后跟零个或多个英文字母或数字。

3.统计统计文件中各单词的出现次数,并输出出现频率最高的10个.

解题方案

1.单词数:每次读入一个字符,只要读入一个字符j就加一,如果输入的字符是英文字母,i也就加一,j加到4时,判断i、j是否相等,若相等则为单词,bool改为true。单词要一直读入直到读入非数字和英文字母的字符为止,此时判断bool,为true则单词数加一,再进行初始化。要注意的时文件末尾可能出现直接以单词结尾的情况,这种需要在循环结束后再进行一次bool判断,true则加一。

2、行是以 结束的, 也就是说, 遇到 行数加一,但是要排除一行只有换行符的情况,可以用bool和换行符一起判断。同时最后一行可能没有换行符,这个可以在所有循环结束后再用bool进行判断。

3.字符数:只要得到的一个字符不是空的,字符数加一。

4.统计词频:使用map。在判断完是否为单词之后,可以将读入的字符存储起来,若字典中没有该单词,则加入该单词,并将频次设为1,若已有该单词,则该单词频次加一。之后可以用迭代器,用两个游标进行冒泡排序。

5.代码组织

1.统计字符数


	int countcharact = 0;
	char achar;
	int getchar = fread(&achar, 1, 1, fin); 
	while (getchar)
	{
		countcharact++;
		getchar = fread(&achar, 1, 1, fin);
	}
	return countcharact;

2.统计行数


	int countline = 0;
        bool isline=false;
	char achar;
	int getchar = fread(&achar, 1, 1, fin);
	while (getchar)
	{
		if (achar >= 33)	isline = true;
		if (achar == '
'&&isline == true)
		{
			countline++;
			isline = false;
		}
		getchar = fread(&achar, 1, 1, fin);
	}
	if (isline == true)
	{
		countline++;
		isline = false;
	}

3.统计单词数

	int countword = 0;
	char achar;
	bool wordjudge = false;
	int i = 0, j = 0;
	int getchar = fread(&achar, 1, 1, fin);
	while (getchar)
	{
		if ((achar <= 57 && achar >= 48) || (achar >= 65 && achar <= 90) || (achar >= 97 && achar <= 122))//
		{
			j++;
			if ((achar >= 65 && achar <= 90) || (achar >= 97 && achar <= 122))
			{
				i++;
			}
			if (j == 4 && i == 4)
			{
				wordjudge = true;
			}//判断是否为单词 

		}
		else
		{
			if (wordjudge == true)
			{
				countword++;
				wordjudge = false;
			}
			i = j = 0;
		}
		getchar = fread(&achar, 1, 1, fin);
	}
	if (wordjudge == true)
	{
		countword++;
		wordjudge = false;
		i = j = 0;
	}

4.统计词频(最高的10个)

        char achar;
	bool wordjudge = false;
	char ex[2];
	char word[100];memset(word, '', 100);

	map<string, int>map1;
	int i = 0, j = 0;
	int getchar = fread(&achar, 1, 1, fin);
	while (getchar)
	{
		if ((achar <= 57 && achar >= 47) || (achar >= 65 && achar <= 90) || (achar >= 97 && achar <= 122))//
		{
			++j;
			if ((achar >= 65 && achar <= 90) || (achar >= 97 && achar <= 122))
			{
				i++;
			}
			if (j == 4 && i == 4)
			{
				wordjudge = true;
			}//判断是否为单词 
			memset(ex, '', 2);
			ex[0] = achar;
			strcat_s(word, strlen(word) + strlen(ex) + 1, ex);
		}
		else
		{
			if (wordjudge == true)
			{
				if (!map1[word])
				{
					map1[word] = 1;
				}
				else
				{
					map1[word]++;
				}
				wordjudge = false;
			}
			i = j = 0;
			memset(word, '', 100);
		}
		getchar = fread(&achar, 1, 1, fin);
	}
	if (wordjudge == true)
	{
		if (!map1[word])
		{
			map1[word] = 1;
		}
		else
		{
			map1[word]++;
		}
		wordjudge = false;
	}
	//排序
	map<string, int>::iterator iter1;
	map<string, int>::iterator iter2;

	iter1 = map1.begin();

	for (i = 1;i <= 10;i++)
	{

		if (map1.size() < i) break;
		for (iter2 = map1.begin();iter2 != map1.end();iter2++)
		{
			if (iter2->second > iter1->second)
			{
				iter1 = iter2;
			}
		}
		cout << "<" << iter1->first << ">: " << iter1->second << endl;
		iter1->second = 0;
		it![](https://img2018.cnblogs.com/blog/1478179/201809/1478179-20180921215408977-261134694.png)
er1 = map1.begin();
	}

6.测试与覆盖率

测试:

覆盖率:

7.计算模块部分异常处理说明

文件夹中没有input文件:

解决方案:只要将input.txt移动到word count文件夹中就可以了。

原文地址:https://www.cnblogs.com/zsnsn/p/9637351.html