编写一个程序。功能是读入一篇英文文章,统计该文章中每个单词的出现次数,并输出出现次数最多的前5个单词

编写一个程序。功能是读入一篇英文文章,统计该文章中每个单词的出现次数,并输出出现次数最多的前5个单词及其出现次数。
注意:
① 单词不区分大小写,比如:The和the是相同的单词。
② 按照英文书写习惯,过长的单词遇到换行时,会加入连字符“-”。比如:“international”遇到换行时可能会写为“intern-ational”,统计时要注意除去连字符。

谢谢急用!不要copy,要能自己调试成功的,现成的C代码也好!

刚用C语言写的,功能实现,但有很多可以优化的地方,自己改吧,不明白的追问:

#include <stdio.h>

#include <string.h>

//能统计的最大单词个数,可以自己改

#define MAX_WORD_COUNT 500

//结构体,保存每个单词及对应的个数

typedef struct WordCount

 {

 char cWord[20];

 int  iCount;

}T_WordCount;

 

int CalcEachWord(const char *pText);//计算单词个数及输出信息等

void LowerText(char *pText);//把单词变成小写形式

void SwapItem(T_WordCount *ItemA, T_WordCount * ItemB);//交换两个元素

void SortWord(T_WordCount *pWordSet);//排序

 

int main(int argc, char *argv[])

{

 //测试文本

 char pText[] ="Text HAs HAS ONE h-as MOrE Has MORE ha-S BLANk more blank or more oR blank  Between   wor-ds.";

 printf("The text is :\n");

 printf("----------------------------------\n");

 printf("%s\n", pText);

 printf("----------------------------------\n");

 printf("The top 5 words is :\n");

 

 CalcEachWord(pText); return 0;

}

 

int CalcEachWord(const char *pText)

{

 char cTmp[20] = {0}; 

 int  i   = 0;

 char *pTmp   = cTmp;

 int  iFlag   = 0;

 

 T_WordCount tWordSet[MAX_WORD_COUNT];

 memset(tWordSet, 0, sizeof(tWordSet));

 

 while (*pText != '\0')

 { 

  if ((*pText >= 'A' && *pText <= 'Z') || (*pText >= 'a' && *pText <= 'z'))

  {   

 

   *pTmp = *pText;

   pTmp++;

 

  }

  else if (*pText == '-')

  {

   ++pText;

   continue;

  }

  else

  { 

 

   if (strlen(cTmp) > 0)

   {

    LowerText(cTmp);

    iFlag = 0;

    for (i = 0; i < MAX_WORD_COUNT; ++i)

    {

     if (strlen(tWordSet[i].cWord) > 0)

     {

      if (strcmp(tWordSet[i].cWord, cTmp) == 0)

      {

       iFlag = 1;

       tWordSet[i].iCount++;

       break;

      }     

     }

     else

     {

      strcpy(tWordSet[i].cWord, cTmp);

      tWordSet[i].iCount = 1;

      iFlag = 1;

      break;

     }

 

    }

    if (!iFlag)

    {

     printf("No more space to save word.\n");

    }

 

   }

   memset(cTmp, 0, 20);

   pTmp = cTmp;

  }

 

  ++pText;

 }

 

//排序 SortWord(tWordSet);

 for (i = 0; i < 5; ++i)

 {

  if (strlen(tWordSet[i].cWord) > 0)

  {

   printf("%s:%d\n",tWordSet[i].cWord,tWordSet[i].iCount);

  }

 }

 

 return 0;

}

 

void LowerText(char *pText)

{

 char *pTmp = pText;

 while (*pTmp != '\0')

 {

  if ((*pTmp >= 'A' && *pTmp <= 'Z'))

  {

   *pTmp += 32 ;

  }

 

  pTmp++; }

}

 

void SwapItem(T_WordCount *ItemA, T_WordCount * ItemB)

{

 T_WordCount Tmp;

 memset(&Tmp, 0, sizeof(T_WordCount));

 strcpy(Tmp.cWord, ItemA->cWord);

 Tmp.iCount = ItemA->iCount;

 

 strcpy(ItemA->cWord, ItemB->cWord); ItemA->iCount = ItemB->iCount;

 strcpy(ItemB->cWord, Tmp.cWord); ItemB->iCount = Tmp.iCount;

}

//冒泡排序算法

void SortWord(T_WordCount *pWordSet){

 int i,j; 

 for (j = 0; j < MAX_WORD_COUNT - 1; j++) 

 {   

  for (i = 0; i < MAX_WORD_COUNT - 1 - j; i++) 

  {     

   if (pWordSet[i].iCount < pWordSet[i+1].iCount)     

   {                             

    SwapItem(&pWordSet[i], &pWordSet[i+1]);

   }     

  } 

 }

}

测试结果截图:

追问

太感谢了!!!怎么调用文件?

追答

把文件读取到一个缓冲区里面,把缓冲区的指针传给CalcEachWord函数就可以了。
比如:
FILE *fp=NULL;
fp=fopen("d:\\text.txt","r+");
if(NULL == fp)
{
return -1;
}
char cBuf[1001]={0};
fread(cBuf, 1, 1000,fp);
CalcEachWord(cBuf);
cBuf的大小也可以根据文件大小动态分配。

追问

我还是不太明白。就是我的一个文件的根目录已知,然后怎么样。我们没有学调用函数

追答

fp=fopen("d:\\text.txt","r+");这句就是打开你要读的文件,d:\\text.txt,换成你自己的文件就可以了。

追问

谢谢你,非常感谢

温馨提示:答案为网友推荐,仅供参考
相似回答