• 软工实践第二次作业


    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文件夹中就可以了。

  • 相关阅读:
    postman简单传参,上个接口的返回值作为下个接口的入参。
    python 给定URL 如何获取其内容,并将其保存至HTML文档。
    外键关联on_delete参数含义
    excel导入与导出
    序列化关系
    使用框架的各种代码示例
    国产celery简单使用
    selecte_related 函数优化查询
    django 之 配置文件
    类与缓存问题 类与属性的关系
  • 原文地址:https://www.cnblogs.com/zsnsn/p/9637351.html
Copyright © 2020-2023  润新知