zoukankan      html  css  js  c++  java
  • 软工实践第二次作业

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

  • 相关阅读:
    CF 142B Tprimes
    CF 231A Team
    poj 2001 Shortest Prefixes ——字典树入门
    hdu 1039 Easier Done Than Said?
    poj 2528 Mayor's posters
    hdu 1061 Rightmost Digit
    poj 2503 Babelfish
    CF271 A. Beautiful Year
    poj 2752
    CF271 B. Prime Matrix
  • 原文地址:https://www.cnblogs.com/zsnsn/p/9637351.html
Copyright © 2011-2022 走看看