一、程序思路及相关代码
首先打开文件,代码如下
FILE *fp; char fname[10]; printf("请输入要分析的文件名: "); scanf("%s",fname); if((fp=fopen(fname,"r"))==NULL){ //读取文件内容,并返回文件指针,该指针指向文件的第一个字符 fprintf(stderr,"error opening. "); exit(1); }
对于文件的扫描,以字符为单位
do{ ch=fgetc(fp); if(ch==' '||ch==','||ch=='.'||ch==';') //如果是空格,自动跳到下个字符 scanner(fp); else{ fseek(fp,-1,1); //如果不是空格,则回退一个字符并扫描 scanner(fp); } }while (ch!=EOF);
要统计单词频率,首先要将文章分为单个单词
int zimu(char ch){ if((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) return ch; else return 0; } void scanner(FILE *fp) { char b[20]; ch=fgetc(fp); if(zimu(ch)) { //判断该字符是否是字母 b[0]=ch; ch=fgetc(fp); //调用函数扫描字符 i=1; while(zimu(ch)) { b[i] = ch; i++; ch = fgetc(fp); } fseek(fp,-1,1); b[i] = ' '; k++; strcpy(w[k].c,b); } }
对于单词,为单词创建结构体
struct word { char c[20];//单词词组 int n;//单词个数 }w[10000];
统计各个单词的个数
for(i=1;i<k+1;i++) w[i].n=1; for(i=1;i<k+1;i++) { for(j=i+1;j<k+1;j++) { if(strcmp(w[i].c,w[j].c)==0) { w[i].n++; w[j].n=0; } if(w[i].n==0)//将已统计的单词跳过 break; } }
将单词按个数多少进行排序
for(i=1;i<k+1;i++) { for(j=1;j<k+1-i;j++) { if(w[i].n>w[j].n)//交换结构体内数据 { t=w[i].n; strcpy(a,w[i].c); w[i].n=w[j].n; strcpy(w[i].c,w[j].c); w[j].n=t; strcpy(w[j].c,a); } } } printf("英文文章中频率最高10个单词及个数为: "); for(i=1;i<11;i++) printf("%d: %s %d ",i,w[i].c,w[i].n); }
二、遇到问题
(1)对于单词的扫描,后来查看编译中的词法分析解决了
(2)对于词组的复制,使用strcpy(w[k].c,b);解决将词组c复制到结构体数组中
(3)对于单词个数统计,
if(w[i].n==0)//将已统计的单词跳过
break;
将与后面单词相同的跳过,避免出现重复
三、程序过程统计
二月26号下午,2个小时思考程序思路,并书写大体框架
二月27号上机时间,将扫描和单词分解完成
二月27号完成程序
四、程序运行截图