软工实践第二次作业

GitHub链接WordCount.

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

1095158-20180912202356285-1880052798.png

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

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++;
    }

3)
原本的想法是想将单词类独立封装在一个结构体内,但是后来实现起来太繁琐,所以我将单词数和词频统计分成两个模块,先用一段简单的代码实现单词数的统计,下面主要考虑词频统计,在实现词频统计时,遇到分隔符且首部至少四个字母,即可判断此为一个单词,用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、结果测试
运行程序
1095158-20180912224153642-1741511454.png

数据文本
1095158-20180914180743405-789127045.png

结果文本
1095158-20180914175916980-1658880818.png

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

转载于:https://www.cnblogs.com/52wu244/p/9637922.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值