要求0:作业要求地址 https://edu.cnblogs.com/campus/nenu/2016CS/homework/2110
要求1:git仓库地址 (在分支v1.0上!!!):https://git.coding.net/sonicsun/WordFrequencyCount.git
要求2:
1. PSP阶段表格
sp2.1 | 任务内容 | 计划共完成需要时间 (min) | 实际完成需要时间 (min) |
Planning | 计划 | 30 | 40 |
Estimate |
估计这个任务需要多少时间, 并规划大致工作步骤 |
30 | 40 |
Development | 开发 | 960 | 1250 |
Analysis | 需求分析(包括学习新技术) | 150 | 180 |
Design Spec | 生成设计文档 | 10 | 10 |
Design Reviewe | 设计复审(和同事审核设计文档) | 0 | 0 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 30 | 40 |
Desgin | 具体设计 | 120 | 100 |
Coding | 具体编码 | 500 | 780 |
Code Review | 代码复审 | 30 | 20 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 120 |
Reporting | 报告 | 120 | 120 |
Test Report | 测试报告 | 10 | 10 |
Size Measurement | 计算工作量 | 20 | 30 |
Postmortem & Process Improvement Plan | 事后总结,提出过程改进计划 | 90 | 80 |
功能模块 | 具体阶段 | 预计时间 (min) | 实际时间 (min) |
功能1 | 具体设计 | 120 | 90 |
具体编码 | 180 | 190 | |
测试完善 | 40 | 40 | |
功能2 | 具体设计 | 120 | 120 |
具体编码 | 250 | 300 | |
测试完善 | 70 | 60 | |
功能3 | 具体设计 | 50 | 60 |
具体编码 | 180 | 240 | |
测试完善 | 20 | 20 |
2. 预估耗时与实际耗时的差距原因:
(1)这次使用了很少使用的c语言来编写程序,对语言的掌握不太熟练,很多地方都要去网上查资料;
(2)还有其他的事情需要忙;
(3)题目部分阐述含糊不清,花了一定时间来反复思考审清题意。
要求3:
1. 解题思路描述:
刚开始拿到题目反复思考需要几个函数来实现功能,每个函数之间的功能上有什么关系,确定好关键点在于读取文件,分割单词,文件路径的转换,单词计数。
然后先把每个函数之间调用的关系大致框架写了出来,发现主函数与方法都写在一个cpp中可读性太差,于是采用了多文件编译。
去网上看博客学习了c语言如何读取文件。
在单词的分隔上遇到了困难,多次测试应该如何读入单词才能更简便的实现单词分隔,一开始采用的使用结构体进行存储,直接读入一整行,然后进行遍历判断分隔,但是发现在单词的存储上实现难度大,于是采用了直接读入字符串的方法,发现字符串如果遇到了特殊符号同样在存储上有所困难,最终选择采用string和map,一位一位的判断,在计数上也更加方便。
实现 wf -c 和 wf -f 的功能后,wf -n的功能实现只需要调用实现 wf -c 和 wf -f 的函数就可以,然后进行排序输出n个就行。
2. 代码介绍:
(1)单词的分割,计数:采用了map和string的方式对单词进行存储计数,利用map的特性可以轻易的对单词进行存储,但是在txt末尾判断结束时一开始有所困难,如果不是以特殊符号结束,最后一个单词总是丢失,最后在if语句中多加上了feof(fpRead)来对是否结束进行判断。
void judge(char textname[]) //判断单词 { string line=""; char zxsb; map<string,int> Map; map<string,int> ::iterator it; FILE *fpRead = fopen(textname,"r"); if(fpRead == NULL){ printf("read file fail!!"); return; } while(!feof(fpRead)){ fscanf(fpRead,"%c",&zxsb); if((!(zxsb >= ‘a‘ && zxsb <= ‘z‘)&&!(zxsb >= ‘A‘ && zxsb <= ‘Z‘)&&!(zxsb >= ‘0‘ && zxsb <= ‘9‘))||(feof(fpRead))){ //判断特殊符号 if(( (line!="") &&!((line[0]>=‘0‘)&&(line[0]<=‘9‘)))){ //对单词进行计数 Map[line]++; } line=""; } else if (zxsb >= ‘A‘ && zxsb <= ‘Z‘) { //大写转换为小写 zxsb = zxsb + 32; line = line + zxsb; } else if ((zxsb >= ‘a‘ && zxsb <= ‘z‘)||(zxsb >= ‘0‘ && zxsb <= ‘9‘)) { //符合条件的字符加入string中 line = line + zxsb; } } printf("totle %d\n\n",Map.size()); for(it=Map.begin();it!=Map.end();it++) cout<<it->first<<" "<<it->second<<endl; fclose(fpRead); return; }
(2)wf -f 对文件路径的处理
void pathopen(char filepath[]){ changesign(filepath); //对写入路径进行改变的函数,将单个斜杠改为两个斜杠 int j; j = strlen(filepath); char filepath2[100]; strcpy(filepath2,filepath); filepath2[j++]=‘*‘; filepath2[j++]=‘.‘; filepath2[j++]=‘t‘; filepath2[j++]=‘x‘; filepath2[j++]=‘t‘; filepath2[j++]=‘\0‘; //此处方法比较笨,一个一个的加上,实现对txt文件的筛选 string openfile = ""; long Handle; struct _finddata_t FileInfo; if((Handle=_findfirst(filepath2,&FileInfo))==-1L) //百度找的对文件进行遍历的方法 printf("该文件夹下没有txt文件\n"); else { strcat (filepath,FileInfo.name); //将文件路径与文件名进行拼接 judge2(filepath); //与wf -c功能类似的函数,对文件中的词频进行统计 _findclose(Handle); } return; };
测试结果
总结???
心路历程拒绝分享,原因看上一篇博客,想给我多少分就给我多少分吧,我也不需要这个分数来得到别人的肯定,毫无意义。收获就是对平时很少使用c语言的掌握又多了一些,知道了c语言里面的一些比较有用的函数,这个作业对我帮助不大,平时该怎么写代码还是怎么写代码,我更需要的是进入一个成熟的技术团队来学习软件工程,还明白了原来这门课的课后作业布置得这么不合理,花了大量的时间去做这个作业,导致我的一个项目往后延期了至少四天,每天背单词的时间延后到了晚上12点,当然你也可以说我自己不会时间管理,说我自己技术不行非要用不熟悉的c++来实现(只要你觉得自己的作业安排毫无问题的话)。
这几天还懂得了原来人居高位批评的声音就会变少,拍马屁的人就会变多,当然每个人身处的环境不同,不能奢求别人来体会自己的处境,特别是当那个人是从高处往低处看的时候,有谁不喜欢站在高处大家都拍着自己的马屁自己意淫呢?在知乎上找周筠提问批评国内软件工程教育不行,自己跑去回答给自己推广自己写的书赚足名声?站在制高点来批评整个教育界?觉得只有自己能够拯救这么“惨”的教育现状???也许你是一个很厉害的程序员,一个优秀的作家,但是现在你绝对不会是一个优秀的教育家。
原文:https://www.cnblogs.com/sonicsun/p/9683693.html