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,