从上次作业就感受到了词频统计的难度,虽然在有了一定的想法,但是实际实现起来却是很难,上次作业写得太乱于是重写,而且这次是结对编程,两个人之间难免发生思想上的冲突,但彼此却能相互弥补。
结对对象:张琪琪(博客:http://www.cnblogs.com/zhangqiqi/)
双方贡献比例:1:1
结对照片:
- [必做 1] 基于作业3的结果,读取一个较小的文本文件A_Tale_of_Two_Cities.txt,统计该文件中的单词的频率,并将统计结果输出到当前目录下的 Result1.txt 文件。 (第一阶段初稿完成该要求)
- 命令行格式: 提示符> Myapp.exe -f filename.txt > Result.txt (PS:C++ 程序,Java 程序输出方式类似) filename.txt 为前面下载的文件名。
- 解释:此外, 读取一个较大的文本文件Gone_with_the_wind.txt实验对比程序执行效率,做如下改进,比较改进前后程序执行时间
- 选项 -f 表示后面跟文件名
- 输出格式规定(参考作业3中的示例):
- 首先按照频率由高到低排序
- 频率一样的词, 按照字典顺序排序
改动的地方之一就是将结果保存到文件中,读取部分就由队友代劳了:
void PrintResult()//建立一个输出函数 { FILE* fp1=fopen("Result1.txt", "w");//建立一个新的文件,并把结果保存到文件中 if(NULL == pHead) { printf("No Word!! "); } else { WordNode *pCurr = pHead;
while(NULL != pCurr) { fprintf(fp1,"%s %d ", pCurr->word, pCurr->times); printf("%s %d ", pCurr->word, pCurr->times); pCurr = pCurr->pNext; } fclose(fp1);
对频率进行排序:
void SortWordDown(Word * words, int size) { for(int i=0;i<size;i++) { for(int j=0;j <size-1;j++) { if(words[j].Count<words[j+1].Count) { words[j].exchange(words[j+1]); } } } }
还有基本的识别单词和大小写转化等:
void array(char x[]) { int k = 0; while (x[k] != ' ') { if (x[k] >= 'A'&&x[k] <= 'Z') x[k] = x[k] + 32; k++; } } int identity(char a[]) { int m=(strlen(a)>=4)?1:0; int n=(a[0]>='a'&&a[0]<='z')?1:0; if(!m||!n) return 0; else while(a) { for(int i=1;;i++) { if(!(a[i]>='a'&&a[i]<='z')||!(a[i]>='0'&&a[i]<='9')) return 0; else return 1; } } }
其他部分就由队友代劳了
结果:
完整的代码请看:https://github.com/MocQiQi/homework
总结:对于这次的结对练习,两个人的交流显得格外重要,分工合作,两个人相互讨论,相互学习对方写程序的优点,这样一来不仅提高了效率,也节省了时间。虽然在结对的过程中,两个人也会因为意见不同而有些小的争吵,也正因为这样,两个人都有了不同的进步。希望以后能够多学习,多交流,感谢队友在这次编程中给我的帮助和支持。