编程可谓是最令自己痛疼的事了,开学没几天,软件工程老师留给我们一个编程作业。说真的一点思路也没有,说也可笑,居然会莫名的害怕,不过,自从下定决心学习计算机(前2年半一直在犹豫,很傻哦!)就决定一定要自己编。也让自己从零开始(也许不是零呢),从第二周开始,除了上课,就是把C语言课本上的习题都实践一遍(真的有些收获)。周四软件老师留了个人编程作业:
写一个程序,分析一个文本文件(英文文章)中各个词出现的频率,并且把频率最高的10个词打印出来。
周五,周六两天就看C语言,做课后习题,(因为对编程脑子一片空白),周一下午就开始着手老师的作业。
思路很简单:1 读文件,统计文件中单词个数(用C课本中的一道例题)
2 将文件内容分割成单词到二维数组中
3 对单词排序,并输出频率最高的10个单词
周一下午:
很简单地实现了读文件,以及统计文件中单词个数,但是如何将单词存到二维字符数组中真的很让我不知所措,就那样执拗地想,在本子上写写画画,晚上回到宿舍不甘心,洗漱完后又是挑灯夜战(编程是我弱项,必须花时间想),l一边理解课本上判断一个字符串中单词个数的算法(谭浩强 C程序设计P106),一边想如何在这个算法的基础上将单词统计到一个二维数组中。直到凌晨1点多。
熬夜成果:实现了将每一个单词的首字符记录下来,在记录每个单词时输出的单词不对(虽然很笨,但是还是很高兴的,因为自己真的有在思考)。
周二上午及下午无课时:
仍然执拗地进行”攻克“那一个对与我来说的难点,只要将文件中内容转化为单词存储到二维数组中,就可以继续下一步了。晚上,终于熬不住了,撇下作业,开始看C,编课后习题,要不这一天都没有什么实质性的收获了。
周三下午:
在宿舍,上网查如何将字符串分割成单词(不敢直接找答案,那样就限制了自己的想法),了解到strtok()函数:
原型
char *strtok(char *s, char *delim);
编辑本段功能
分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串
一下午,完成统计单词个数,并将单词存储到数组中,晚上,开始进行将每个单词出现的次数记录并排序的部分,感觉思路很简单但是真正做起来还是有很多意外“惊喜”,最终,一个简单的程序终于实现。代码如下:
1 #include<string.h> 2 #include<stdio.h> 3 #include<stdlib.h> 4 #define N 1000 5 void main() 6 { 7 FILE *fp; 8 char filename[10]; 9 char s[N]; //保存文件中的内容 10 char *d=" ";//在s串中将包含有 " "的位置处加上NULL,注意空格的输出 11 char *p; 12 int flag[N]; //标识 13 char a[N][N]; 14 int i=0,n,m=0,l,j,temp1,temp2,b[N]={0},c[N]={0}; 15 printf("请输入文件名:\n"); 16 scanf("%s",filename); 17 if((fp=fopen(filename,"r"))==NULL) 18 { 19 printf("文件打不开!\n"); 20 exit(0); 21 } 22 while(!feof(fp)) //文件内容保存在字符串数组s[]中 23 { 24 s[i]=fgetc(fp); 25 i++; 26 } 27 s[i]='\0'; //定义的s[]有N个元素,不一定能用完,所以,文件中内容保存到s后,最后给s赋‘\0’,作为字符串结束标志 28 29 30 i=0; //将s中字符串转化为单词数组存到字符串数组a[][]中 31 p=strtok(s,d); 32 while(p) 33 { 34 35 strcpy(a[i],p); 36 p=strtok(NULL,d); 37 flag[i]=1; 38 i++; 39 } 40 n=i; 41 42 for(i=0;i<n;i++) //统计相同单词出现次数 43 while(flag[i]) 44 { 45 for(j=i;j<n;j++) 46 { 47 if(!strcmp(a[i],a[j])) 48 { 49 b[m]++; //m为不同的单词数,b[]为相同的一个单词出现的个数 50 flag[j]=0; 51 c[m]=i; 52 } 53 else continue; 54 } 55 m++; 56 } 57 58 printf("\n出现次数排序前10的如下\n"); 59 printf("-----------------------\n"); 60 61 for(i=0;i<m-1;i++) //按出现频率排序统计 62 for(j=i+1;j<n;j++) 63 if(b[i]<b[j]) 64 { 65 temp1=b[i];b[i]=b[j];b[j]=temp1; 66 temp2=c[i];c[i]=c[j];c[j]=temp2; 67 } 68 printf("排序\t单词\t频数\n"); 69 for(i=0;i<10;i++) //显示出频率最高的前10个单词,及出现次数 70 { 71 printf("%d\t%s\t%d\n",i+1,a[c[i]],b[i]); 72 } 73 printf("-----------------------\n"); 74 }
运行结果:
之前写程序都是百度什么的,才使得自己编程能力很差,这次编的程序其实也很差,没什么实用价值,但是,自己从这几天的思考中,一方面更加了解自己,一方面,也体会到编程其实还是很好玩的,也相信,不是能力差,是根本就没有花时间在编程上(要是我从大一就意识到会不会更好呢?勿以往之不谏,知来者之可追吧) 所以,开始从零开始,从这个很不完美的一次软件工程作业开始。
对了,把这么菜的程序放到这样的博客中真的很需要很需要勇气呢O(∩_∩)O哈!