有没有更简单发方法,求高手指教
在当前目录中存在文件名为"case1.txt“的文本文件,其内容为一篇英文文章(以EOF作为结束标志)。现要求读取该文本文件内容,统计文章中每个单词出现的次数,
并输出出现次数最多的前5个单词及其出现次数(按出现次数由多到少的顺序输出,次数相同时按字典顺序输出,
不足5个单词时,按序输出全部单词)。程序中注意如下细节:
(1) 空格、标点符号与回车符起到分隔单词的作用。
(2) 文章一行的末尾可能有连字符,出现连字符时,该行最末的字符串与下行最先出现的字符串构一个单词;
(3) 名词缩写算一个单词;
(4) 数字不算单词;
(5) 单词不区分大小写;
(6) 输出时单词全使用小写;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
求高手化简程序!
#include "stdio.h"
#include "math.h"
#include "string.h"
#include "stdlib.h"
struct record_word
{
char c[30];
int n;
} word[10000];
int main()
{
FILE *fp;
char b[30],ch;
int j=0,k=0,t=0,h=0,i=0,m=1,p=0;
if((fp=fopen("case1.in","r"))==NULL)
{
printf("File open error!\n");
exit(0);
}
while((ch=fgetc(fp))!=EOF)
{
if(p&&ch=='\n')
{
p=0;
continue;
}
else if(p&&ch!='\n')
{
p=0;
i=h=m=0;
for(j=0; j<k; j++)
{
if(strcmp(b,word[j].c)==0)
{
m=1;
break;
}
}
if(m) word[j].n++;
else
{
word[k].n=1;
strcpy(word[k].c,b);
k++;
}
}
if(ch>='A'&&ch<='Z')ch=ch+32;
if(ch>='a'&&ch<='z')
{
b[i]=ch;
i++;
h=1;
continue;
}
else if(!(ch>='a'&&ch<='z'))
{
h=0;
}
if(h==0)
{
b[i]='\0';
if(ch=='-')
{
p=1;
continue;
}
else
{
i=h=m=0;
for(j=0; j<k; j++)
if(strcmp(b,word[j].c)==0)
{
m=1;
break;
}
if(m) word[j].n++;
else
{
word[k].n=1;
strcpy(word[k].c,b);
k++;
}
}
}
}
for(i=0; i<k&&i<5; i++)
{
t=0;
for(j=1; j<k; j++)
{
if(strcmp(word[j].c,"\0")!=0)
{
if(word[j].n>word[t].n) t=j;
else if(word[j].n==word[t].n)
if(strcmp(word[j].c,word[t].c)<0)
t=j;
}
}
printf("%s %d\n",word[t].c,word[t].n);
word[t].n=0;
}
return 0;
}