做书app下载网站,网站设计好不好,什么叫互联网,wordpress插件都是英文要求 1. 对源文件#xff08;*.txt,*.cpp,*.h,*.cs,*.html,*.js,*.java,*.py,*.php等#xff09;统计字符数、单词数、行数、词频#xff0c;统计结果以指定格式输出到默认文件中#xff0c;以及其他扩展功能#xff0c;并能够快速地处理多个文件。 2. 使用性能…要求 1. 对源文件*.txt,*.cpp,*.h,*.cs,*.html,*.js,*.java,*.py,*.php等统计字符数、单词数、行数、词频统计结果以指定格式输出到默认文件中以及其他扩展功能并能够快速地处理多个文件。 2. 使用性能测试工具进行分析找到性能的瓶颈并改进 3. 对代码进行质量分析消除所有警告 4. 设计10个测试样例用于测试确保程序正常运行例如空文件只包含一个词的文件只有一行的文件典型文件等等 5. 使用Github进行代码管理 6. 撰写博客 基本功能 1. 统计文件的字符数 2. 统计文件的单词总数 3. 统计文件的总行数 4. 统计文件中各单词的出现次数 5. 对给定文件夹及其递归子文件夹下的所有文件进行统计 6. 统计两个单词词组在一起的频率输出频率最高的前10个。 7. 在Linux系统下进行性能分析过程写到blog中附加题 PSP 前期的分析 首先看到了题目就立刻想到了会有巨大的数据需要进行处理自然就会联想应该如何去解决数据的存放问题与查找问题从功能需求中一步步想到了使用哈希表对此进行存储于是便有了初步的想法 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、文件输出 利用ofstream函数进行reasult.txt文件的构造 具体编码 1、 文件遍历函数 利用findfirst函数与findnext函数不断利用文件地址对文件进行遍历在遍历的同时将地址字符串传入到文件读取子函数中 2、 文件读取函数 在文件遍历中调用此函数利用传入的地址和ifstream函数对文件进行打开操作设置一个字符数组再用getline函数将文件中的数据传入数组中由于getline是读取文件的一行此时便可以记录行数的变化当生成一个数组时便调用字符统计子函数并返回一个值代表字符数调用单词统计子函数并返回一个单词数调用词组统计子函数不返回值。 3、 字符统计函数 判断从文件读取子函数传入的字符数组中的字符并计数 4、 单词统计函数 从字符数组的首地址开始依次判断符合单词的条件便调用单词哈希构造子函数 1单词哈希构造函数 利用单词的前四位相同的条件将其ASCLL码值进行求和再平方取模得到的便是存入的地址为了同时统计单词的个数构造了结构体数组在结构体中存入单词与频率在存入哈希表中时如果地址处已存单词需要进行相同性的比较与优先级的比较于是调用单词比较子函数与单词优先比较子函数 2单词比较函数 比较传入的两个单词依次字符进行比较遇见不同地方便进行判断如果相同字符数小于4个则返回不同如果大于4则判断之后是否全是数字 3单词优先比较函数 此函数在单词比较之后调用此时传入的两个单词均为相同则先判断相同字符的优先如果相同则判断不同的优先 5、 词组统计函数 为了不与单词发生交互进行单独构造遇见单词则判断之后是否有单词出现如果没有从新的地址进行第一个单词的判断如果有则调用词组哈希构造之后重复 1 词组哈希构造函数 利用词组的第一个单词前4个字符与第二个单词前4个字符的ASCLL值求和平方取模获得地址存入哈希表构造一个结构体存储词组与频率在存储的时候调用词组比较与词组优先比较函数类似单词哈希构造 2 词组比较函数 先判断第一个单词是否相同再判断第二个具体操作类似单词比较 3 词组优先判断函数 先判断第一个单词的优先再判断第二个具体操作类似单词优先比较 6、 排序函数: 将单词哈希表与词组哈希表中的频率进行排序采取的是冒泡排序方法为了同时输出字符串和频率单独构造了一个结构体存储此结构体存储的是前十的字符串与频率 7、 文件输出函数: 利用ofstream函数生成result.txt文件并将答案写入文件。 8、 main函数 主函数中调用了一次文件遍历子函数便是输出的代码。 测试结果 自己构造的测试集 文件小的时候只能输出正确的行数、字符数与单词数文件一大程序就会崩溃 助教给的测试集 无法全部跑完 崩溃原因分析 1、 在读取字符的时候使用的是getline但之后的调试与编译的时候出现了数组溢出的事情所以在get与getline的选择上出现了错误应该选择更加安全的get 2、 对于哈希表的构造不够好由于自己是用结构体数组也会出现数据溢出的问题还有关于哈希函数的构造也不够好容易发生冲突导致的大量的计算与调用函数使得程序运行很慢 3、 在判断单词与词组的时候需要考虑的东西很多很容易就会忽视一个导致程序无法正常运行由于多条条件的判断导致自己很容易出错 4、 比较难以实现的是对哈希表的排序最终确定了使用冒泡排序这也导致了运行时间过长 5、 各类细节问题例如一开始使用的是int型数据到最后才意识到了需要使用长整型导致了代码很多地方需要修改以至于发生了一些不可描述的问题 代码优化 1、 在一些循环语句中例如for循环一开始判定的条件是到达数组地址最大值的时候停止经过考虑于是使用了计算字符串长度的函数将条件表达式的里的值改成了字符串真正懂得长度但任然大量的调用了strlen函数在代码交上以后又想到了可以直接使用do……while循环直接判断数组为空便可停止循环 2、 尽量使用有符号长整型但为了答案不会出错我选择了无符号这会大量浪费运行时间应该将不需要无符号的数改为有符号 3、 函数调用过于深这次的程序发生了5层函数的调用最好可以将其简化 4、 有一点没用注意便是没用多使用const因为如果一个const声明的对象的地址不被获取允许编译器不对它分配储存空间。这样可以使代码更有效率而且可以生成更好的代码。 5、 热行分析 由于采用了无比慢的排序方法导致的两个sorting函数运行所占时间很多 教训与总结 首先从架构来说自己在项目一开始的时候没有确定一个特别明确的架构导致在编码的时候发现了思路不清楚的问题之后才逐渐完善了架构便浪费了不少时间一个好的架构不仅在开发上有助于代码的实现还能解决程序耦合的问题其次是没有一个明确的设计方案只是大致一想就开始编码一边编一边想解决方案导致了很深的函数调用最终不易于调试与修改再是自己在编码的时候忘记了先编好输出以便于一边编一边测试导致了自己苦于编好了很多函数却在测试时跳出了无数的bug而且不易于修改这个问题老师很早在课堂上提到过要编几行就进行测试而自己却没有注意运行的时候十分的后悔过于复杂的程序导致了我不知如何去修改最后就是书到用时方恨少对于文件遍历的问题自己将近花费了五分之一的时间就是由于自己对于这个方面了解的太少只能临时抱佛脚还有本来可以用C的一些类就可以很容易解决的问题只能自己利用C语言复杂的进行编写例如同学使用了一个C中map的类就可以解决存储的问题自己感觉用的方法都很“蠢”不够灵活。 在这次个人作业中我深深地感受到了自己在编码方面的严重不足不仅是对于各个语言的理解还有是对于它们的灵活运用由于自己知识储备的严重不足遇到问题都无法及时给出一个合适的解决方案需要一个个去百度甚至是去从头去看书在这个地方花费的时间将近有四分之一导致了自己的思路不够流畅所以要加强自己对于编程书的阅读不能再拘泥于老师布置的任务从现在开始要学习C等更加便捷的语言还有以后在编程之前要进行一次对于设计的思考等到自己感觉设计已经明确并且可行时再进行编码还有就是要注意好每一个细节尽量在编码的时候就最好注意到最后也是我印象最深刻的就是随时编码随时测试多写注释避免遗忘。综上所述简言之就是“无他唯手熟尔”以后自己要多思考、多编程。 转载于:https://www.cnblogs.com/Whydd/p/8678068.html