软工实践第二次作业

GitHub链接WordCount.

一、PSP表格记录下估计将在程序的各个模块的开发上耗费的时间。

二、计算模块接口的设计与实现过程。

1、项目分析

刚开始看到这个代码,我就开始构思整个代码的框架,大致将其功能分为三个模块实现,字符类,行类,单词类。字符的判断可根据字符的ASCII码值判断,行数的计算可按行读取,将文本文件中的字符逐个抽取,对字符进行处理可以获取单词,第三个类使用的数据结构较多,包含了双向链表结构,链表排序算法,hash散列用于快速匹配单词,我计划将这三个功能各自独立起来,分别用结构体封装,这只是一些大致的想法,具体的实现细节后面解释。
下面两天我有空闲时间就在做代码编写的预备知识学习工作,包括输入输出流,hash散列,结构体的双向链表结构,还有一些库函数,此外,我将c++一书又浏览了一遍,因为在刚开始写代码时,我发现一些基本的c++知识都忘记了。
2、实现细节

1)字符统计
利用c++输入输出流函数逐个读取字符,判断字符ASCII码值是否在ASCII码表范围内,我对字符的输入输出流不太了解,刚开始出现了乱码,读取字符不完整等情况,所以这方面花费时间很长,下面给出代码以作记录:

fstream inFile;
	inFile.open(fileName);//读取文件
	if (inFile.fail()) //读取文件失败
	{
		cout << "Could not find the file\n";
		cout << "Program terminating\n";
		exit(EXIT_FAILURE);
	}
	inFile >> noskipws;
	inFile >> c;

2)
利用getline()函数计算行数

while (getline(inFile, tmp, '\n'))
	{
		linecount.linenum++;
	}

原本的想法是想将单词类独立封装在一个结构体内,但是后来实现起来太繁琐,所以我将单词数和词频统计分成两个模块,先用一段简单的代码实现单词数的统计,下面主要考虑词频统计,在实现词频统计时,遇到分隔符且首部至少四个字母,即可判断此为一个单词,用word结构体存储单词,使用链表结构将这些单词串接起来

struct Word {
	char word[MAX_WORD_LENGTH];
	int num;
	Word *next;
	Word *previous;
	Word() {
		word[0] = 0;
		num = 0;
		next = nullptr;
		previous = nullptr;
	}
	Word(char* theWord, int theNum) {
		strcpy_s(word, theWord);
		num = theNum;
		next = nullptr;
		previous = nullptr;
	}
	//如果使用了指针,在析构函数中释放 
	~Word() {
		delete next;
		next = nullptr;
	}
};

3、计算模块接口部分的性能改进。

1)在进行单词匹配的时候,用hash散列快速匹配,模设置为128,这样可以大大节省查找单词的时间:

int WordList::Hash(char* word) {
	int HashVal = 0;

	while (*word != '\0')
		HashVal += *word++;

	return HashVal & 127;

}

2)我用一个WordList结构体用于处理单词提取,词频排序,字母序排列,结果输出等功能

struct WordList
{
private:
	int Hash(char *word);			//哈希函数
	void shiftWord(Word * pWord);	//使word前移一格
	Word* pWordHead;				//指向Word的指针
	Word* pWordTail;
	WordIndex* index[128];			//哈希索引
public:
	WordList();
	~WordList();
	void addWord(char word[]);
	void wordCount(string fileName, WordList &wordList);
	void outPut();
};

4、结果测试
运行程序

数据文本

结果文本

5、总结
我认为我的计算机基础比较薄弱,说实话,这次作业真的很吃力,但是在这个过程中我学习到很多东西,软件工程实践虽然辛苦,但是比起能收获到那么多知识,我觉得值了。

posted @ 2018-09-12 22:48  代码小渣渣  阅读(202)  评论(11编辑  收藏  举报