码迷,mamicode.com
首页 > 其他好文 > 详细

第一次个人作业工作记录

时间:2018-03-29 10:25:08      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:.com   比较   理想   地址   输出   c++   联想   情况下   循环   

作业要求:

1.    对源文件(*.txt,*.cpp,*.h,*.cs,*.html,*.js,*.java,*.py,*.php等)统计字符数、单词数、行数、词频,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。

2.    使用性能测试工具进行分析,找到性能的瓶颈并改进

3.    对代码进行质量分析,消除所有警告

http://msdn.microsoft.com/en-us/library/dd264897.aspx

4.    设计10个测试样例用于测试,确保程序正常运行(例如:空文件,只包含一个词的文件,只有一行的文件,典型文件等等)

5.    使用Github进行代码管理

6.    撰写博客

功能需求

1.    统计文件的字符数

2.    统计文件的单词总数

3.    统计文件的总行数

4.    统计文件中各单词的出现次数

5.    对给定文件夹及其递归子文件夹下的所有文件进行统计

6.    统计两个单词(词组)在一起的频率,输出频率最高的前10个。

7.    在Linux系统下,进行性能分析,过程写到blog中(附加题)

前期的分析:

首先看到了题目就立刻想到了会有巨大的数据需要进行处理,自然就会联想应该如何去解决数据的存放问题与查找问题,从功能需求中一步步想到了使用哈希表对此进行存储,于是便有了初步的想法:1、打开一个文件,读取文件内容;2、将读取的信息进行处理;3、构造一个哈希函数,创建一个哈希表。

之后有关测试文件出来了,便遇到了一个很棘手的问题:对于文件的遍历,这个起初是打算用C语言中的fopen函数,但仔细一分析发现并不能实现具体的要求,于是便寻求一个可以遍历文件的操作,在查阅资料后找到了C++语言中的findfirst和findnext函数可以实现文件操作,于是便开始对其的学习,由于之前未接触过C++,对于其中过程的了解耗费了很长的时间,于是便对测试文件进行了初步的遍历实验,起初的结果很不近人意,只能遍历文件的第一个子目录里的文件,无法进入子文件夹,进过判定条件的修改,最终实现了所有文件的遍历。       

此刻第一步便达到了目的,于是开始了文件读取问题的思考,找到了两个函数,get和getline函数,首先get函数可以很好的读取文件中的字符,依靠对文件是否结束的判定可以持续读取,这个的好处就在于可以无所谓文件中全部的字符总量,可以一边读一边根据判定条件进行对单词与词组的操作,并且可以按照换行符的数量判断一个文件中的行数,这个可以说是很理想;其次是getline函数,它可以一次读取一行,这个可以省去单独统计换行符的工作,每次调用的时候就可以进行行数的累加,然后可以直接用一行一行的处理单词与词组,这个可以更加模块化,但是缺点便是文件中会出现一行中有数十万的字符,就会使得数组溢出导致失败;经过考虑,我选择了getline函数。

然后就是开始对这个项目进行框架的搭建,从字符、单词到词组,每一个都单独进行搭建,互不相关,为了达到这个目的,分别为单词与词组设计了各自的哈希表,由于要同时对出现频率的统计,决定构造一个结构体数组,里面存储字符串与整型数据,而数组的地址则用设计的哈希函数进行计算。

代码实现

1、  文件遍历

利用已经试验过的findfirst与findnext函数进行操作;

2、  文件读取

先利用ifstream函数打开文件,再利用getline函数对文件内容进行读取,在文件函数中直接调用字符的函数、单词的函数、词组的函数;

3、  字符统计

对传入的字符数组,进行遍历,并随之进行数据的统计;

4、  单词统计

     对传入的字符数组进行有条件的遍历,筛选出符合条件的单词,调用单词的哈希表构造函数

(1)      单词哈希表构造

消除大小写的影响,即在计算哈希函数时使用单词前四个字母时,全部化为小写进行求解,利用平方取中法构造哈希函数,利用开放定址发解决冲突,其中需要调用单词比较函数和单词优先级比较函数;

1)    单词比较函数

比较新单词与哈希表中同一位置单词是否为相同单词;

    2)单词优先比较函数

比较两个相同单词在字典输出的情况下的先后次序;

5、  词组统计

对传入的字符数组进行有条件的遍历,筛选出符合条件的词组,调用词组的哈希表构造函数 ,其中判断词组需要大量的判定条件;

(1)      词组哈希表构造

消除大小写的影响,即在计算哈希函数时使用第一个单词与第二个单词各前四个字母时,全部化为小写进行求解,利用平方取中法构造哈希函数,利用开放定址发解决冲突,其中需要调用词组比较函数和词组优先级比较函数;

1)  词组比较函数

比较新词组与哈希表中同一位置词组是否为相同单词;

2)  单词优先比较函数

比较两个相同词组在字典输出的情况下的先后次序;

6、  频率统计

   利用冒泡排序法对哈希结构体进行排序,将前十出现频率的结构体返回主函数

7、文件输出

利用fp指针;

运行结果:

    可能是在哪一个函数的判定条件里出现的错误,产生了死循环,导致无法正常运行。

目前在调试当中,之后还会更新blog。

第一次个人作业工作记录

标签:.com   比较   理想   地址   输出   c++   联想   情况下   循环   

原文地址:https://www.cnblogs.com/Whydd/p/8667619.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!