编写一个程序.功能是读入一篇英文文章,统计该文章中每个单词的出现次数,并输出出现次数最多的前5个单词及其出现次数.
来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/10 14:35:54
编写一个程序.功能是读入一篇英文文章,统计该文章中每个单词的出现次数,并输出出现次数最多的前5个单词及其出现次数.
注意:
① 单词不区分大小写,比如:The和the是相同的单词.
② 按照英文书写习惯,过长的单词遇到换行时,会加入连字符“-”.比如:“international”遇到换行时可能会写为“intern-ational”,统计时要注意除去连字符.
不要copy,要能自己调试成功的,现成的C代码也好!
注意:
① 单词不区分大小写,比如: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,换成你自己的文件就可以了。
再问: 谢谢你,非常感谢
再问:#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,换成你自己的文件就可以了。
再问: 谢谢你,非常感谢
编写一个程序.功能是读入一篇英文文章,统计该文章中每个单词的出现次数,并输出出现次数最多的前5个单词及其出现次数.
如何统计一篇英语文章单词重复出现的次数?
有没有能统计一篇英文文章中所有单词出现次数的软件
从文件中读入一段英语文章,统计文章中单词的数量,求出现次数最多和最少的单词和数量.用C怎么实现?
java编程 写一段程序统计一段字符串中每一个单词的出现次数 并按照次数的倒序输出
C语言:统计一篇英文文章中所要查询单词出现的次数以及出现的位置
JAVA统计一篇文章中所有单词出现的次数,并按字典序将单词及频数输出到文件中
求教一C程序题 计算英文文章中某一单词出现的次数
如何统计一篇文章中某些字的出现次数
统计若干行英文中单词的个数和每个单词出现的次数.
做一个C#程序;列出文本中的每个单词和每个单词出现的次数.以及每个单词在句子中出现的次数.
C语言 编写程序,从键盘输入若干个英文字母,并统计各字母出现的次数