搭档:201631062106,201631062329
代码地址:
扩展功能 https://gitee.com/YiKeYingHuaShu
作业链接:
https://edu.cnblogs.com/campus/xnsy/2018Systemanalysisanddesign/homework/2188
一:作业任务
两人组队完成WordCount的基本功能及扩展功能(可以自行增加功能),并对其进行一系列测试和优化,形成可稳定运行的版本。
在第一次实践作业中,每个人都独立完成了WordCount基本版,对照编码规范,审查修改自己的程序代码并使其符合规范要求。
按照共同制定的编码规范,审查合作伙伴的原有代码并记录发现的问题。
两人协商,将两部分代码合并,形成初始版本。注意应设计合理的软件结构及模块划分。
2.PSP表格
|
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
|
Planning |
计划 |
50 |
40 |
|
· Estimate |
· 估计这个任务需要多少时间 |
170 |
230 |
|
Development |
开发 |
330 |
510 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
200 |
150 |
|
· Design Spec |
· 生成设计文档 |
0 |
0 |
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
70 |
40 |
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
70 |
40 |
|
· Design |
· 具体设计 |
50 |
80 |
|
· Coding |
· 具体编码 |
260 |
320 |
|
· Code Review |
· 代码复审 |
120 |
170 |
|
· Test |
· 测试(自我测试,修改代码,提交修改) |
100 |
90 |
|
Reporting |
报告 |
110 |
50 |
|
· Test Report |
· 测试报告 |
50 |
40 |
|
· Size Measurement |
· 计算工作量 |
30 |
10 |
|
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
50 |
30 |
|
|
合计 |
1660 |
1800 |
3.代码互审
我们采用的都是c语言的方式完成该次作业,都是将整体分成小问题,然后通过函数逐步实现,最后在在主函数里面调用,所以在代码互审的时候,我们只需要检查对方的函数是否能够正确实现功能(在主函数里调用即可)。在检查了对方的代码没有错误的之后,就开始分析谁写的函数更加高效以及精简,最终采纳。我们两个基本上都实现了基本和扩展功能,但是高级功能均没有实现,因为用C语言实现界面化对我们来说是一个极其陌生的领域,在共同的努力之下我们争取完成。
4.代码解析
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;
}
5.代码测试以及运行结果
基本功能

扩展功能

测试

6.总结
(1)代码合并阶段:在这个阶段,其实问题还是有的,因为以前并没有接触到如何将两个人写的代码合并到一起,彼此的代码风格又不一样,因此合并之后并不能成功的运行,也出现的较多的问题,不过呢,两个人就慢慢改,磨合,最后还是比较完整的完成。
(2)存在问题:只是较为简单的完成了作业规定的基本功能和扩展功能,高级功能还没实现,在以后的学习中,在慢慢实现。
(3)体会和感想:这次比较让人头痛的就是合并代码的时候,花费了比较多的时间,在讨论实现功能时也出现了分歧。但合作的过程中,出现分歧也是在所难免的事情。我们要不断地沟通,磨合,提出自己的意见指出队友不完善的地方。
浙公网安备 33010602011771号