软件工程第四次作业:结对编程
GIT地址 | ||
---|---|---|
学生姓名 | 吴昊阳 | |
学号 | 201831083104 | |
结对伙伴 | 姚志昆 | |
伙伴学号 | 201831081105 | |
伙伴博客地址 |
一丶 PSP表格
1.解题思路描述
要求是“统计指定单词的出现频率”,那么就是要解决两个问题:找到指定单词和计数。我们设置了指针用来查找,在查找的同时用search进行统计计数。
刚开始,小组打算分工,分别查阅资料,思考不同阶段要求,伙伴成员协作完成。
对题目要求进行分析后,题目要求为词频统计,但是要求不少,小组决定先做基础要求。
尽量利用C++标准库的功能,利用正则表达式来提取出符合需求定义的单词,
每个单词应具有最简形式、已统计数量等属性,故采用结构体的形式存储。
行数统计:以按行读取的方式读取文本文件,每次成功读取后对应的counter+1,直至文件末尾。(统计文件的有效行数:任何包含非空白字符的行,都需要统计。)
字符数统计: 统计可打印字符个数
单词统计:根据要求,只有由至少4个英文字母打头的连续英文、数字字符串才算做一个单词,并且单词实体不区别大小写字母转换大小写;
保存字符长度>=4的单词-----------使用正则表达式;去掉开头非字符的单词并计数;排序,在自定义数据结构中重载<和<=,来实现词频排序,为了实现降序排序,简单地用大于号重载了小于号。
2.设计实现过程
代码主要分为三个部分:
1、创建一个结构体
struct WORD { /* 创建一个结构体 */ int count; char s; void exchange( Word &word ) /* 交换单词 */ { string tStr = word.Str; int tCount = word.Count; word.Str = Str; word.Count = Count; Str = tStr; Count = tCount; } }; } w[100];
2、判断是否是一个单词
bool isword( char a[] ) /* 判断是否是一个单词 */ { int i = 0; for ( i = 0; a[i] != '\0'; i++ ) if ( (a[i] >= 'a' && a[i] <= 'z') || (a[i] >= '0' && a[i] <= '9') ) return(true); else return(false); }
3、主函数
int main( void ) { char result[500]; char *ptr; ifstream file( "c://A_Tale_of_Two_Cities.txt" ); /* 读取 */ if ( !file ) { cout << "不能打开文件"; } while ( !file.eof() ) { file.getline( result, 500 ); } file.close(); int j = 0; /* 大写转小写 */ while ( result[j] != '/0' && result[j + 1] != '/0' ) { if ( result[j] >= 'A' && result[j] <= 'Z' ) { result[j] = result[j] - 'A' + 'a'; j++; } } cout << result; char *sep = " "; int i = 0; ptr = strtok( result, " " ); /* 利用strtok函数来分割result字符串中的单词 */ while ( ptr != NULL ) { if ( isword( p ) != false ) { if ( judge( p, n ) != false ) { w[n].s = *p; /* 赋值给数组 */ n++; } } ptr = strtok( NULL, " " ); } int t = 0; ofstream outfile; /* 输出文件到result1 */ outfile.open( "Result1.txt" ) SortWordDown( w, count ); while ( w[t].s ) /* 输出统计结果 */ { if ( strlen( w[t].s ) >= 4 ) { outfile << w[t].s << ":" << w[t].count << '\n'; t++; } } return(0); }
3.性能分析 4.运行截图 5.分析结果 6.改进思路
对功能进行模块化。
后续任务:词组统计。可扫描单词数组,按连续指定窗口分割词组进行统计。
二丶分析及总结
1、针对某个问题的讨论决策过程:我们对API接口着重分析,我们两个也分成了两个方向进行研究,姚志昆主要针对类分装做一个接口在命令行进行输入参数;吴昊阳主要是想在web窗口上做一个接口进行输入参数。最终我们讨论的结果是还是在命令行上进行输入参数做一个接口。
2、评价对方:请评价一下你的合作伙伴,又哪些具体的优点和需要改进的地方。 这个部分两人都要提供自己的看法。
姚志昆:吴昊阳非常循循善诱,我不会的地方很耐心的指导,善于思考并且能付诸行动,希望对git指令了解更多。
吴昊阳:姚志昆非常认真,非常负责任,C++的基础也是相当不错的,对于新接触的知识,立刻会付出行动进行验证,对我们的结对编程做出了巨大的贡献。
3、评价整个过程:关于结对过程的建议
结对编程不仅考研了编程能力,也考验了合作能力,我们在编程过程中相互鼓励,分工合作,因为一旦某个功能实现不了,一个人的话很容易暴躁,自闭。两个人可以相互鼓励,也同时形成一种良性竞争,比如这个方法是其中一个人想出来的,另一个人就会去思考有没有更快的方法。希望有机会可以再次结对编程。
结对编程照片: 来源: |