读一篇英文文章输出出现次数最多的前十个单词
看到这个题目的时候,我首先就想到运用结构体创建一个关于单词的word变量,里面包含n单词出现的次数;还有一个char类型的数组c[30]。首先在main函数的开头,声明了一个char str[30]的数组运用来while循环语句来记录程序每次读入的单词。该程序主要分为三部分voidx1函数,在main函数里调用它,将str的值传进去,该函数的主要功能就是用一个循环语句将str与结构体数组w[1000]中的c进行比较,运用if条件句进行判断,如果相等则将此刻w[i]中的次数n加1并结束循环继续录入下一个单词,如果没有一个和str的值相等,就将str的值写入结构体数组中并跳出循环继续录入单词。void类型的x2函数,它的主要作用是在程序将文章全部读完后根据结构体数组中各个单词出现的次数n的大小将该数组进行从大到小的排序,然后将数组的前十个的单词以及出现的次数输出在屏幕上。这次编程出现的主要问题是关于函数调用时传递参数的问题以及循环语句的逻辑性问题,经过不断的调试,发现了问题的所在,对程序也有了更好的改进和理解。
下面是程序以及运行结果:
#include <stdio.h>
#include <stdlib.h>
#include "string.h"
struct word
{
char c[30];
int n;
}w[1000];
void x1(char str[30],int i,int j)
{
int h;int b=0;
for(h=0;h<=i;h++)
{
if(strcmp(w[h].c,str)==0)
{ w[h].n++; b=1;}
}
if(b=0)
{
i++;
for(h=0;h<=j;h++)
w[i].c[h]=str[h];
}
}
void x2(int i)
{
struct word chg;
int h,m;
for(h=0;h<=i;h++)
{
for(m=0;m<i-h;m++)
{
if(w[m].n<w[m+1].n)
{chg=w[m];w[m]=w[m+1];w[m+1]=chg;}
}
}
printf("出现次数最多的十个单词如下:\n");
for(h=0;h<10;h++)
{
printf("%s出现的次数为:%d",w[h].c,w[h].n);
printf("\n");
}
}
int main()
{
FILE *fp;
char ch;
char str[30];
int i,j;
void x1(char str[30],int i,int j);
void x2(int i);
if((fp=fopen("c:\\yan.txt","r"))==NULL)
{
printf("无法打开此文件\n");
exit(0);
}
while((ch=feof(fp))!=0)
{
ch=fgetc(fp);
if(ch<='Z'&&ch>='A')
{
str[j]=ch;
j++;
ch=fgetc(fp);
}
if(ch==' ')
{
x1(str, i,j);
}
}
x2(i);
return 0;
}