编写一个程序。功能是读入一篇英文文章,统计该文章中每个单词的出现次数,并输出出现次数最多的前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的大小也可以根据文件大小动态分配。