源代码:
#include
#include
#include
struct word //结构体存放单词及其个数
{
int num; //存放单词个数
char w[20]; //存放单词的数组
};
char c[20];
struct word words[500]; //记录这篇文章出现的单词数目
FILE * in; //文件的指针
void read() //程序的主体
{
char ch;
int k,flag=0,n=0,m=0,j=0; //flag记录单词是否相同,i记录读入每个单词的字母,j记录在结构体中出现第几个的单词的
for(m=0;m<500;m++)
words[m].num=0; //记录每一个单词出现的次数
char infile[50];
printf("输入文件路径:\n"); //打开所要分析的文本文件
scanf("%s",infile);
if((in=fopen(infile,"r"))==NULL)
{
printf("此文件无法打开");
exit(0);
}
while((ch=fgetc(in))!=EOF)
{
for(k=0;k<20;k++) //读入每一个单词,因为每个单词所包含的字母数目少于20,所以k<20
c[k]='\0'; //初始化数组
int i=0;
while(((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))) //判断是否是字母
{
if(ch>'A'&&ch
ch=ch+32; //大写换小写
c[i++]=ch; //将读入的字母放到存放单词的数组中
ch=fgetc(in); //ch为读入的每一个字母
}
if(c[0]=='\0')
continue;
else
{
for(j=0;words[j].num!=0;j++) //将每一个读入的单词与放到结构体中的单词进行比较,相同单词数目加1
{
if(strcmp(words[j].w,c)==0)
{
words[j].num=words[j].num+1;
flag=1; //flag=1,单词相同
break;
}
}
if(flag==0) //flag=0,单词不同,将它放到结构体数组中
{
words[j].num=1;
strcpy(words[j].w,c);
}
flag=0;
}
}
fclose(in); //关闭文件
}
void sort() //采用冒泡法排序
{
int i,j,max;
char ch2[20];
for(i=0;i<10;i++) //因为只需要输出前十个
{
max=words[i].num;
for(j=i+1;words[j].num!=0;j++)
if(words[j].num>max)
{
max=words[j].num;
words[j].num=words[i].num;
words[i].num=max;
strcpy(ch2,words[j].w);
strcpy(words[j].w,words[i].w);
strcpy(words[i].w,ch2);
}
printf("%d\t",words[i].num);
printf("%s\n",words[i].w); }
}
int main()
{
read();
sort();
return 0;
}
程序性能分析:
程序执行结果: