结对项目
合作者:
201631062305 ,201631082114
代码地址:
基础功能:https://gitee.com/dxl123456/webcount2
拓展功能:https://gitee.com/dxl123456/WordCount
作业链接:
https://edu.cnblogs.com/campus/xnsy/2018Systemanalysisanddesign/homework/2188
1.任务简述
两人组队完成WordCount的基本功能及扩展功能(可以自行增加功能),并对其进行一系列测试和优化,形成可稳定运行的版本。
2.PSP表格
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
40 |
30 |
· Estimate |
· 估计这个任务需要多少时间 |
180 |
240 |
Development |
开发 |
360 |
600 |
· Analysis |
· 需求分析 (包括学习新技术) |
120 |
100 |
· Design Spec |
· 生成设计文档 |
0 |
0 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
60 |
30 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
60 |
20 |
· Design |
· 具体设计 |
60 |
80 |
· Coding |
· 具体编码 |
300 |
420 |
· Code Review |
· 代码复审 |
120 |
150 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
120 |
120 |
Reporting |
报告 |
120 |
60 |
· Test Report |
· 测试报告 |
30 |
40 |
· Size Measurement |
· 计算工作量 |
30 |
40 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
60 |
50 |
|
合计 |
1660 |
1953 |
3.代码互审
在项目的第一阶段,我们两个均是用的C语言完成这个作业,编写的代码也很相似,都是将整体分成小问题,然后通过函数逐步实现,最后在在主函数里面调用,所以在代码互审的时候,我们只需要检查对方的函数是否能够正确实现功能(在主函数里调用即可)。在检查了对方的代码没有错误的之后,就开始分析谁写的函数更加高效以及精简,最终采纳。我们两个基本上都实现了基本和扩展功能,但是高级功能均没有实现,因为用C语言实现界面化对我们来说是一个极其陌生的领域,在共同的努力之下我们争取完成。
4.设计过程
5.代码说明
(1)打开文件,把数据写进去
void writeToFile(char *fileName,char* feature,int num) { /*fileName 表示读取的文件名 * feature表示记录的内容 单词或者字母或者行数 */ FILE *f=NULL; f=fopen("F:\\gcc\\bin\\result.txt","a"); if(f==NULL) { printf("failed when wrinting the count to file\n"); } //写入文件 fprintf(f,"%s,%s,%d\n",fileName,feature,num); fclose(f); }
(2)统计字符数目
void c_num(char *file)//return the file nums { FILE *f; char* a="c_num:"; f=fopen(file,"r"); char c; //char int num=0; //char num if(f==NULL) { printf("file is null"); } else while(!feof(f)) { c=fgetc(f); if(c!=' ' && c!= '\n' && c!='\t') num++; } fclose(f); printf("cnum %d ",num); writeToFile(file,a,num); }
(3)统计单词个数
void word_num(char *file)//return word nums { FILE *f; char* a="word_num:"; f=fopen(file,"r"); char ch; int aword,cword=0; if(f==NULL) { printf("file is null"); } else while(!feof(f)) { ch=fgetc(f); if((ch>='a' &&ch <= 'z')||(ch>= 'A'&&ch<='Z') || ch=='_') aword=1; else if(aword) { cword++; aword=0; } } fclose(f); printf("wordnum:%d ",cword); writeToFile(file,a,cword); }
(4)统计行数
void crl_num(char *file)//return crl { FILE *f; f=fopen(file,"r"); char* s="crl_num:"; int crl=1; char a; if(f==NULL) { printf("file is null"); } else while(!feof(f)) { a=fgetc(f); if(a=='\n' || a=='\t') crl++; } fclose(f); printf("crlnum:%d ",crl); writeToFile(file,s,crl); }
(5)统计空行数
void crl_num(char *file)//return crl { FILE *f; f=fopen(file,"r"); char* s="crl_num:"; int crl=1; char a; if(f==NULL) { printf("file is null"); } else while(!feof(f)) { a=fgetc(f); if(a=='\n' || a=='\t') crl++; } fclose(f); printf("crlnum:%d ",crl); writeToFile(file,s,crl); }
(6)统计注释行数
void blankline_num(char *file)//返回文件空行数 { FILE *f; int b_num=0;//空行数 int ch_num=0;//字符个数 char* a="word_num:"; char ch; f=fopen(file,"r"); if(f==NULL) {printf("file is null");} else while(!feof(f)) { ch=fgetc(f); if(ch=='\n') { if(ch_num<=1) b_num++; ch_num=0; } else if(ch!= ' '&& ch!= '\t' && ch!= '}' ) ch_num++; else if(ch=='}') b_num++;//只有一个‘}’的空行数 } fclose(f); printf("blanklinenum:%d ",b_num); writeToFile(file,a,b_num); }
(7)统计代码行数
void noteline_num(char *file)//返回注释行 { FILE *f; int ch_num =0; int note_num=0; char ch; char* a="noteline_num:"; f=fopen(file,"r"); if(f==NULL) { printf("file is null"); } else while(!feof(f)) { ch =fgetc(f); if(ch=='\n') { if(ch_num==2) note_num++; ch_num=0; } else if (ch=='/') ch_num++; else if(ch_num==1) { if(ch=='/') ch_num++; } } fclose(f); printf("notelinenum:%d ",note_num); writeToFile(file,a,note_num); }
(8)统计代码行数
void codeline_num(char *file)//return code_num { FILE *f; int ch_num=0; int code_num=0; int tag=0; int flag=0; char a; char* s="codeline_num:"; f=fopen(file,"r"); if(f==NULL) { printf("file is null"); } else while(!feof(f)) { a=fgetc(f); if(flag==2) { flag=0;tag++; } else { if(a=='\n' && ch_num>1) { code_num++; ch_num=0; } else if(a!=' ' && a!='\n' && a!='\t' &&a!='/') ch_num++; else if(a=='/') flag++; } } fclose(f);printf("codelinenum:%d ",code_num); writeToFile(file,s,code_num); }
(9)寻找制定文件
void searchfile() { struct _finddata_t filefind; long handle; int t=0; if((handle=_findfirst("E:\\wordcount\\*.txt",&filefind))== -1L) { printf("file not found\n"); } else do { t++; printf("find file :%s\n",filefind.name); }while(_findnext(handle,&filefind)==0); _findclose(handle); printf("文件数量:%d\n ",t); }
(10)主函数
int main(int argc, char* argv[]) { FILE *fp; while(1) { if((fp=fopen(argv[2],"r"))==NULL) { printf("FileNull\n\n\n"); scanf("%s%s%s",argv[0],argv[1],argv[2]); continue; } else if(!strcmp(argv[1],"-w")) word_num(argv[2]); else if(!strcmp(argv[1],"-c")) c_num(argv[2]); else if(!strcmp(argv[1],"-l")) crl_num(argv[2]); else if(!strcmp(argv[1],"-a")) { blankline_num(argv[2]); noteline_num(argv[2]); codeline_num(argv[2]); } else if(!strcmp(argv[1],"-s")) { searchfile(); } else printf("NullPoint\n"); printf("\n\n"); scanf("%s%s%s",argv[0],argv[1],argv[2]); } return 0; }
6.代码测试以及运行结果
基本功能
扩展功能
测试
7.总结
(1)代码合并阶段:在合并阶段没有什么大的问题,因为我们都是用的同一种语言(C语言写的),只要功能函数能够实现就行了,主需要在我们两个中间的选择其中一个人的代码就行了,然后主函数是一起编写的。
(2)问题:我们两个都实现了基本功能和扩展功能,但是高级功能还没有实现,在编写高级功能的时候我们遇到了很多问题,C语言的界面化对于我们两个人来说都是比较陌生的领域,在后面的时间,我们不断地一起尝试,一起排出错误。但是目前还是没有实现这个功能,在后续中会继续尝试编写。
(3)体会:对于1+1是否大于二这个问题,我认为两个人在一起工作的时候,每个人都有自己的思想,有时候意见不合就容易产生分歧,这个时候就会耽误很多时间来讨论,但是在讨论的同时也可以学到很多东西。在遇到困难的时候,两个人就也可以一起解决,比一个人的效率高很多,所以我认为1+1是大于二的。在这次结对项目中,我收获很多,也体会到了合作的重要性。我很感谢我的队友。