作业帮 > 综合 > 作业

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

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/10 14:35:54
编写一个程序.功能是读入一篇英文文章,统计该文章中每个单词的出现次数,并输出出现次数最多的前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,换成你自己的文件就可以了。
再问: 谢谢你,非常感谢