不得不说民哥真是个人才,博客园以前自己也接触过,是同学推荐的,但主要是向大猿们学习,现在有了自己的博客,也可以发表一些自己写的小程序了。一开始就有同学劝我不要用C语言写,太麻烦了,但对于java不太精通的我,毅然决然的选择了C,直到上手做了,我才知道原来有多麻烦,好后悔啊。
2月20号,也就是上上周四,民哥给我们留了一个读取文本文件中每个单词的频率,并打印出频率最高的10个的作业。
2月25号,也就是上周二,我确定了一下自己的初步思路并完成了第一部分的内容,(7:00-7:50)
第一步:定义数组来存放字符串和整型变量;
第二步:把文件中的各个字母存放到二维数组中去;
第三步:运用冒泡法对整个二维数组中的数组元素按单词顺序进行排序,并把第二次出现的相同字符串变为空串;
第四步:将单词按单词频率由大到小进行排序,输出频率最高的10个;
第五步:输出单词
第一步:
int main() { char s[1000][20],ch[10000]; char real[1000][20] , t[20]; char tem[20]; int i=0,j=0,k=0,sum=0,q=0,r=0; int n,m,p=0,count[1000]={0}; int temp,len; FILE *fp; fp=fopen("a.txt ","r");
2月27下午(2:00-4:00)是民哥给的课上时间写作业,本想可以把程序写完了,但是我低估了自己程序的复杂度,由于没有考虑文件中的连接符,导致最后的结果频频出错,所以在把字母放到二维数组的过程中又做了一步把连接符变成空字符放到新的二维数组中的操作:
while((ch[k]=fgetc(fp))!=EOF) { if(ch[k]>=‘a‘&&ch[k]<=‘z‘||ch[k]==‘-‘) { s[i][j]=ch[k]; j++; } else { s[i][j]=‘\0‘; i++; j=0; sum++; } k++; } for(m=0;m<sum;m++) { len=strlen(s[m]); for(n=0;n<len;n++) if(s[m][n]==‘-‘) { s[m][n]=‘\0‘; strcat(s[m],s[m+1]); s[m+1][0]=‘\0‘; } } for(m=sum;m>0;m--) { for(n=0;n<m;n++) if(strcmp(s[n],s[n+1])>0) { strcpy(t,s[n]); strcpy(s[n],s[n+1]); strcpy(s[n+1],t); } }
第三步:
for(m=0;m<sum;m++) { for(n=m+1;n<sum;n++) if(strcmp(s[m],s[n])==0) s[n][0]=‘\0‘; } for(m=0;m<sum;m++) { if(s[m][0]!=‘\0‘) { for(n=m+1;;n++) { if(s[n][0]==‘\0‘) count[r]++; else if (s[n][0]!=‘\0‘) break; } r++; } if(s[m][0]!=‘\0‘) {strcpy(real[p],s[m]); p++; q++; } }
本来想的是周四就可以实现排序,但是单是用数组并没有想象的那么简单,只实现了字符串的
识别
3月1日,C语言程序编写这个程序确实麻烦,我是真的体会到了,但是终于快到收关了,下午睡醒接着干活(4:10-6:00),进行单词排序,并输出前10个
for(i=q-1;i>0;i--) { for(j=0;j<i;j++) { if(count[j]<count[j+1]) { temp=count[j]; count[j]=count[j+1]; count[j+1]=temp; strcpy(tem,real[j]); strcpy(real[j],real[j+1]); strcpy(real[j+1],tem); } } } if(q<10) for(i=0;i<q;i++) { printf("%s",real[i]); printf(" "); printf("%d\n",count[i]+1); } else for(i=0;i<10;i++) { printf("%s",real[i]); printf(" "); printf("%d\n",count[i]+1); } fclose(fp); }
以上就是木木开发这个小程序的全部过程,请各位大牛们批评指正!