C语言高分求助 统计词频
要求是从名为“123.txt”的文件中导入一篇英文文章,文中各个单词以一个空格区分,文章中单词个数不定,可能会很大,能统计出某个单词出现多少次,如果还能统计出某个字母出现...
要求是从名为“123.txt”的文件中导入一篇英文文章,文中各个单词以一个空格区分,文章中单词个数不定,可能会很大,能统计出某个单词出现多少次,如果还能统计出某个字母出现多少次更好。比如:“this is a dog and that is a pig” 中“is”出现了2次,“and”出现了1次。
另外说明一下,这个不是作业,只是我自己想的,如果没那么多时间可以给个思路,我自己再看看,我也是才学C语言不长时间
谢谢
麻烦三楼的朋友具体写一下能用链表的方法
谢谢 展开
另外说明一下,这个不是作业,只是我自己想的,如果没那么多时间可以给个思路,我自己再看看,我也是才学C语言不长时间
谢谢
麻烦三楼的朋友具体写一下能用链表的方法
谢谢 展开
4个回答
展开全部
“keefo”的答案运拍皮不错
不过有一个地方可以完善,单词统计,使用定长的数组不好,还是改成链表来存储。
要是单词超过了数组的长度,就会溢出,那可就不好了。
需要的话,一会儿写出来^_^
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int WORD_LENGTH = 256; //使用const int 比用define要好
struct wordNode
{
char word[WORD_LENGTH]; //存放单词
int iWordCount; //单词出现次旁差数
wordNode *pNext; //结构体的指针
};
wordNode *pHeader = NULL; //链表的头指针
//声明需要的函数
void CountWord(char *current);
wordNode * SearchWord(char *current);
void PrintResult();
void Release();
int main()
{
//临时存放单词的词组
char temp[WORD_LENGTH];
//打开要读取的文件
FILE *fp;
if( NULL == (fp=fopen("123.txt", "r")) ) //把NULL写在前面是一种编程习惯,不用觉得奇怪
{
printf("Open file failed!!\n");
exit(1);
}
//循环读取文本中的内容
while( EOF != (fscanf(fp,"%s",temp)) )
{
CountWord(temp);
}
//关闭文件
fclose(fp);
//输出统计结果
PrintResult();
//释放内存,养成好习惯
Release();
return 0;
}
//单词统计
void CountWord(char *current)
{
wordNode *pNode = NULL;
pNode = SearchWord(current);
if(NULL == pNode)
{
return;
}
else
{
pNode->iWordCount++;
}
}
//查找贺伏单词所在节点
wordNode * SearchWord(char *current)
{
//当链表为空的时候,也就统计第一个单词时
if( NULL == pHeader)
{
pHeader = new wordNode;
strcpy(pHeader->word, current);
pHeader->iWordCount = 0;
pHeader->pNext = NULL;
return pHeader;
}
//搜索现有的链表
wordNode *pCurr = pHeader;
wordNode *pPre = NULL;
while( (NULL != pCurr) && (0 != strcmp(pCurr->word, current)) )
{
pPre = pCurr;
pCurr = pCurr->pNext;
}
//该单词不存在
if(NULL == pCurr)
{
pCurr = new wordNode;
strcpy(pCurr->word, current);
pCurr->iWordCount = 0;
pCurr->pNext = NULL;
pPre->pNext = pCurr;
}
return pCurr;
}
//输出结果
void PrintResult()
{
if(NULL == pHeader)
{
printf("No Word!!\n");
}
else
{
wordNode *pCurr = pHeader;
while(NULL != pCurr)
{
printf("%s\t%d\n", pCurr->word, pCurr->iWordCount);
pCurr = pCurr->pNext;
}
}
}
void Release()
{
if(NULL == pHeader)
{
return;
}
wordNode *pCurr = pHeader;
while(NULL != pCurr)
{
pHeader = pCurr->pNext;
delete pCurr;
pCurr = pHeader;
}
}
字母的统计工作,和单词一样,其实更简单一些。
不过有一个地方可以完善,单词统计,使用定长的数组不好,还是改成链表来存储。
要是单词超过了数组的长度,就会溢出,那可就不好了。
需要的话,一会儿写出来^_^
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int WORD_LENGTH = 256; //使用const int 比用define要好
struct wordNode
{
char word[WORD_LENGTH]; //存放单词
int iWordCount; //单词出现次旁差数
wordNode *pNext; //结构体的指针
};
wordNode *pHeader = NULL; //链表的头指针
//声明需要的函数
void CountWord(char *current);
wordNode * SearchWord(char *current);
void PrintResult();
void Release();
int main()
{
//临时存放单词的词组
char temp[WORD_LENGTH];
//打开要读取的文件
FILE *fp;
if( NULL == (fp=fopen("123.txt", "r")) ) //把NULL写在前面是一种编程习惯,不用觉得奇怪
{
printf("Open file failed!!\n");
exit(1);
}
//循环读取文本中的内容
while( EOF != (fscanf(fp,"%s",temp)) )
{
CountWord(temp);
}
//关闭文件
fclose(fp);
//输出统计结果
PrintResult();
//释放内存,养成好习惯
Release();
return 0;
}
//单词统计
void CountWord(char *current)
{
wordNode *pNode = NULL;
pNode = SearchWord(current);
if(NULL == pNode)
{
return;
}
else
{
pNode->iWordCount++;
}
}
//查找贺伏单词所在节点
wordNode * SearchWord(char *current)
{
//当链表为空的时候,也就统计第一个单词时
if( NULL == pHeader)
{
pHeader = new wordNode;
strcpy(pHeader->word, current);
pHeader->iWordCount = 0;
pHeader->pNext = NULL;
return pHeader;
}
//搜索现有的链表
wordNode *pCurr = pHeader;
wordNode *pPre = NULL;
while( (NULL != pCurr) && (0 != strcmp(pCurr->word, current)) )
{
pPre = pCurr;
pCurr = pCurr->pNext;
}
//该单词不存在
if(NULL == pCurr)
{
pCurr = new wordNode;
strcpy(pCurr->word, current);
pCurr->iWordCount = 0;
pCurr->pNext = NULL;
pPre->pNext = pCurr;
}
return pCurr;
}
//输出结果
void PrintResult()
{
if(NULL == pHeader)
{
printf("No Word!!\n");
}
else
{
wordNode *pCurr = pHeader;
while(NULL != pCurr)
{
printf("%s\t%d\n", pCurr->word, pCurr->iWordCount);
pCurr = pCurr->pNext;
}
}
}
void Release()
{
if(NULL == pHeader)
{
return;
}
wordNode *pCurr = pHeader;
while(NULL != pCurr)
{
pHeader = pCurr->pNext;
delete pCurr;
pCurr = pHeader;
}
}
字母的统计工作,和单词一样,其实更简单一些。
展开全部
这个程序腊颤枝轮敏vc6下运行良好洞敏
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1024
typedef struct{
char word[32];
int num;
} wordlist;
wordlist wl[MAX];
int wordnum=0;
int main()
{
char st[32];
int found;
FILE *fp;
if((fp=fopen("123.txt","r"))==NULL)
exit(1);
while(fscanf(fp,"%s",st)!=EOF)
{
found=0;
for(int i=0;i<wordnum;i++)
{
if(strcmp(wl[i].word,st)==0)
{
wl[i].num++;
found=1;
break;
}
}
if(!found)
{
strcpy(wl[i].word,st);
wl[i].num=1;
wordnum++;
}
}
fclose(fp);
for(int i=0;i<wordnum;i++)
printf("%s %d\n",wl[i].word,wl[i].num);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1024
typedef struct{
char word[32];
int num;
} wordlist;
wordlist wl[MAX];
int wordnum=0;
int main()
{
char st[32];
int found;
FILE *fp;
if((fp=fopen("123.txt","r"))==NULL)
exit(1);
while(fscanf(fp,"%s",st)!=EOF)
{
found=0;
for(int i=0;i<wordnum;i++)
{
if(strcmp(wl[i].word,st)==0)
{
wl[i].num++;
found=1;
break;
}
}
if(!found)
{
strcpy(wl[i].word,st);
wl[i].num=1;
wordnum++;
}
}
fclose(fp);
for(int i=0;i<wordnum;i++)
printf("%s %d\n",wl[i].word,wl[i].num);
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;
int main()
{
ifstream fin( "D:\庆芹\1.txt" );
ofstream fout( "D:\\轿基3.txt" );
if( !fin || !fout )
{
cerr << "error: failed to open file\n";
fin.close();
fout.close();
return -1;
}
map< string, unsigned long > token_table;
string word;
while( fin >> word )
{
++token_table[ word ]; //词频加1
}
fin.close();
map< string, unsigned long >::iterator iter = token_table.begin();
while( iter != token_table.end() )
{
fout<<iter->first<<"\t"<<iter->second<<"\n";
++iter;
}
fout.close();
return 0;
}
这个是C++泛型的程序,用到map结构。有输入有输出。实际的统计代码只有一行:++token_table[ word ]; 因为map对于自己不存在的键出现的时候做法是新建一个这个键名的值出来闭差谨而不是返回异常
#include <fstream>
#include <string>
#include <map>
using namespace std;
int main()
{
ifstream fin( "D:\庆芹\1.txt" );
ofstream fout( "D:\\轿基3.txt" );
if( !fin || !fout )
{
cerr << "error: failed to open file\n";
fin.close();
fout.close();
return -1;
}
map< string, unsigned long > token_table;
string word;
while( fin >> word )
{
++token_table[ word ]; //词频加1
}
fin.close();
map< string, unsigned long >::iterator iter = token_table.begin();
while( iter != token_table.end() )
{
fout<<iter->first<<"\t"<<iter->second<<"\n";
++iter;
}
fout.close();
return 0;
}
这个是C++泛型的程序,用到map结构。有输入有输出。实际的统计代码只有一行:++token_table[ word ]; 因为map对于自己不存在的键出现的时候做法是新建一个这个键名的值出来闭差谨而不是返回异常
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
学习学习~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询