结对项目— 词频统计(语言C++)
Posted 刘雨恬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结对项目— 词频统计(语言C++)相关的知识,希望对你有一定的参考价值。
结对对象:季天梦
博客地址:http://www.cnblogs.com/jitianmeng/
github链接:https://github.com/liuyutianlyt/EX_4.md
比例:1:1
要求
- [必做 1] 基于作业3的结果,读取一个较小的文本文件A_Tale_of_Two_Cities.txt,统计该文件中的单词的频率,并将统计结果输出到当前目录下的 Result1.txt 文件。 (第一阶段初稿完成该要求)
- 命令行格式: 提示符> Myapp.exe -f filename.txt > Result.txt (PS:C++ 程序,Java 程序输出方式类似) filename.txt 为前面下载的文件名。
- 解释:
- 选项 -f 表示后面跟文件名
- 输出格式规定(参考作业3中的示例):
- 首先按照频率由高到低排序
- 频率一样的词, 按照字典顺序排序
- 此外, 读取一个较大的文本文件Gone_with_the_wind.txt实验对比程序执行效率,做如下改进,比较改进前后程序执行时间。PS: 请看一位同学做的效能分析示例。
源程序如下:
1 #include <iostream> 2 #include <cstring> 3 #include <fstream> 4 using namespace std; 5 6 struct WORD { /* 创建一个结构体 */ 7 int count; 8 char s; 9 void exchange( Word &word ) /* 交换单词 */ 10 { 11 string tStr = word.Str; 12 int tCount = word.Count; 13 word.Str = Str; 14 word.Count = Count; 15 Str = tStr; 16 Count = tCount; 17 } 18 }; 19 } w[100]; 20 21 bool isword( char a[] ) /* 判断是否是一个单词 */ 22 { 23 int i = 0; 24 for ( i = 0; a[i] != \'\\0\'; i++ ) 25 if ( (a[i] >= \'a\' && a[i] <= \'z\') || (a[i] >= \'0\' && a[i] <= \'9\') ) 26 return(true); 27 else 28 return(false); 29 } 30 31 32 int judge( char b[], int n ) /* 判断该单词是否出现过 */ 33 { 34 if ( n > 0 ) 35 for ( int i = 0; i < n; i++ ) 36 { 37 if ( !strcmp( b, &w[i].s ) ) /* 出现 */ 38 { 39 w[i].count++; 40 return(-1); 41 } 42 } 43 } 44 45 46 void SortWordDown( Word * words, int size ) /* 降序排序 */ 47 { 48 for ( int i = 0; i < size; i++ ) 49 { 50 for ( int j = 0; j < size - 1; j++ ) 51 { 52 if ( words[j].Count < words[j + 1].Count ) 53 { 54 words[j].exchange( words[j + 1] ); 55 } 56 } 57 } 58 } 59 60 61 int main( void ) 62 { 63 char result[500]; 64 65 char *ptr; 66 ifstream file( "c://A_Tale_of_Two_Cities.txt" ); /* 读取 */ 67 if ( !file ) 68 { 69 cout << "不能打开文件"; 70 } 71 while ( !file.eof() ) 72 { 73 file.getline( result, 500 ); 74 } 75 file.close(); 76 int j = 0; /* 大写转小写 */ 77 while ( result[j] != \'/0\' && result[j + 1] != \'/0\' ) 78 { 79 if ( result[j] >= \'A\' && result[j] <= \'Z\' ) 80 { 81 result[j] = result[j] - \'A\' + \'a\'; 82 j++; 83 } 84 } 85 cout << result; 86 char *sep = " "; 87 88 int i = 0; 89 ptr = strtok( result, " " ); /* 利用strtok函数来分割result字符串中的单词 */ 90 while ( ptr != NULL ) 91 { 92 if ( isword( p ) != false ) 93 { 94 if ( judge( p, n ) != false ) 95 { 96 w[n].s = *p; /* 赋值给数组 */ 97 n++; 98 } 99 } 100 ptr = strtok( NULL, " " ); 101 } 102 int t = 0; 103 ofstream outfile; /* 输出文件到result1 */ 104 outfile.open( "Result1.txt" ) 105 SortWordDown( w, count ); 106 while ( w[t].s ) /* 输出统计结果 */ 107 { 108 if ( strlen( w[t].s ) >= 4 ) 109 { 110 outfile << w[t].s << ":" << w[t].count << \'\\n\'; 111 t++; 112 } 113 } 114 return(0); 115 }
结果如下:
总结:由于是团队协作,我们在之前作业三的基础上就有程序上的不同,看对方程序也是一个学习过程。最后整合了两个程序之后,又一起讨论完成了作业四的要求。
以上是关于结对项目— 词频统计(语言C++)的主要内容,如果未能解决你的问题,请参考以下文章