| git地址 | https://github.com/npcccc1/WordCount |
| 伙伴 | 徐睿201831061409 |
| 伙伴博客 | https://www.cnblogs.com/codingbyjusticexu/ |
一、PSP表格

二、代码实现
和伙伴选择了不同的语言来完成这项工作(c与c++),所以用了两个仓库放不同的项目。由于并不在一个寝室,具体的代码是每人自己敲的。事后的测试、代码规范与调整则在商讨之后进一步完善。
int main() //简单的主函数先放上
{
FILE *fpa;
FILE *fpb;
if ((fpa = fopen("D:\\wordCount.txt", "r")) == NULL)
{
printf("Failure to open wordCount.txt!\n");
exit(0);
}
if ((fpb = fopen("D:\\Countresult.txt", "w")) == NULL)
{
printf("Failure to open wordCount.txt!\n");
exit(0);
}
countchar(fpa,fpb);
wordcount(fpa,fpb);
fclose(fpa);
fclose(fpb);
return 0;
}
void countchar(FILE *a,FILE *b) //统计字符函数
{ //ps:一开始想成了输出a到z 26个字母的个数...
char c;
int d=0;
int i=0;
int p=0;
int q=0;
while(!feof(a))
{
c=fgetc(a);
if(c>=48&&c<=57)
{
d++;
}
else if(c>=65&&c<=90)
{
i++;
}
else if(c>=97&&c<=122)
{
p++;
}
else
{
q++;
}
}
rewind(a);
fprintf(b,"0--9\t%d\nA--Z\t%d\na--z\t%d\nSeparator\t%d\n",d,i,p,q);
}
void wordcount(FILE *a,FILE *b)
{
int i;
int q=0;
char str[N][N];
while(!feof(a))
{
for(i=0;;i++)
{
int p=0;
fgets(str[i],N,a);
if((str[i][p]>=97&&str[i][p]<=122)||(str[i][p]>=65&&str[i][p]<=90))
{
loop:p++; //按理说不应该加goto实在不想再用循环了
while((str[i][p]>=97&&str[i][p]<=122)||(str[i][p]>=65&&str[i][p]<=90))
{
p++;
}
if(p>=4)
{
if(str[i][p]>=48&&str[i][p]<=57)
{
do
{
p++;
}
while(str[i][p]>=48&&str[i][p]<=57);
q++;
goto loop;
}
q++;
}
}
fprintf(b,"%d\t",q);
}
}
}
三、代码规范
经讨论后,规范详见此链接。对照后看了自己的代码发现一个小坏习惯之前没注意的——写函数时总是空出一个制表符,导致在复杂的循环中“{}”往往因为开头的这个Tab而向后缩进,显得前面一大片空白,影响美观。
还有便是变量的取名不大规范,往往是自己随心所欲地取。
四、代码复审
与其说是复审,其实更像在写中改。开始编译没什么问题还是很开心的,但打开文件发现没有打印出任何东西。上一个四则运算也是遇到了这种情况,上次是因为&&与||有一次打错,导致循环卡到了一处没输出任何算式。

这是一开始第一次传到github中的代码,循环太多要处理带数字或其他符号的字符串是不是单词,让脑子有点乱,一开始没输出也是这个的原因。此外也有零零散散的小错误,也是要多看几遍自己就能检查出来。为了效率,也是因为用的不同的语言不同的方法,没再让同伴互查。
五、性能分析
不知道为什么复制过去vs里面说fopen可能不安全,编译不出来测试不出来。
六、总结与反思
对c语言的面向过程深有了感触,再加上自己没有细分模块与函数导致出错多、效率低下,感觉还是c++封装及模块的划分比c语言简单。但是结对确实是提供了思路即使我们交流代码不大详细,往往在qq上交流一些问题和进度及自己的思路,可以明显感到1+1>2,
