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

    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
    ";
    		cout << "Program terminating
    ";
    		exit(EXIT_FAILURE);
    	}
    	inFile >> noskipws;
    	inFile >> c;
    

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

    while (getline(inFile, tmp, '
    '))
    	{
    		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 != '')
    		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、总结
    我认为我的计算机基础比较薄弱,说实话,这次作业真的很吃力,但是在这个过程中我学习到很多东西,软件工程实践虽然辛苦,但是比起能收获到那么多知识,我觉得值了。

  • 相关阅读:
    access生成sql脚本,通过VBA调用ADOX
    virtualbox 使用USB引导启动安装系统
    atom 调用g++编译cpp文件
    VPython 三维显示 —— hello word
    sql高级篇(一)
    sql基础篇
    struts2中的<s:select>默认选项
    关于SVN更新注意
    mysql中的substr()函数
    mysql中exists的用法介绍
  • 原文地址:https://www.cnblogs.com/52wu244/p/9637922.html
Copyright © 2011-2022 走看看