一、程序思路及相关代码
首先打开文件,代码如下
FILE
*fp;
char
fname[10];
printf ( "请输入要分析的文件名:\n" );
scanf ( "%s" ,fname);
if ((fp= fopen (fname, "r" ))==NULL){ //读取文件内容,并返回文件指针,该指针指向文件的第一个字符
fprintf (stderr, "error opening.\n" );
exit (1);
}
|
对于文件的扫描,以字符为单位
1
2
3
4
5
6
7
8
9
|
do {
ch= fgetc (fp);
if (ch== ‘ ‘ ||ch== ‘,‘ ||ch== ‘.‘ ||ch== ‘;‘ ) //如果是空格,自动跳到下个字符
scanner(fp);
else {
fseek (fp,-1,1); //如果不是空格,则回退一个字符并扫描
scanner(fp);
}
} while
(ch!=EOF);
|
要统计单词频率,首先要将文章分为单个单词
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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] = ‘\0‘ ;
k++;
strcpy (w[k].c,b);
}
} |
对于单词,为单词创建结构体
struct word { char c[20];//单词词组 int n;//单词个数 }w[10000];
统计各个单词的个数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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个单词及个数为:\n"); for(i=1;i<11;i++) printf("%d: %s %d\n",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号完成程序
四、程序运行截图