题目
35
:统计网页词频
假如有
5
个文件
5
个网页,每个文件中都保存了一篇一定长度的英文文章,现在输入一个关键字,统计出这个关键字在每一个文件中的词频,并按照词频的大小,按照从大到小的顺序将这些文件输出到屏幕和结果文件中。
以下是代码,因为是用vc弄得,所以没有用stdbool.h
#include
#include
// qsort()排序函数定义在stdlib.h头文件中
#include
#include
// isalnum()函数定义在ctype.h的头文件中
/*数据输入模块*/
//表示文件的结构体
typedef struct _textfile
{
char name [128]; //表示文件名
char text[1024*128]; //文件中的文本
word* list; //保存单词的链表
int total; //单词总数
float frequency; //单词的词频
}textfile;
//读取文件子模块
void readfile (textfile* file)
{
//参数合法性检查
if(null==file)
return;
//以只读方式打开textfile结构体关联的文件
file* fp = fopen(file->name,"r");
//如果打开成功,则读取其中的文本内容
if(null != fp)
{
//逐行读取文件中的文本内容
char line[256];
while( null != fgets(line,256,fp) )
{
/*通过将line连接到file->text后面,实现将读取内容保存
到textfile结构体中的字符数组保存*/
strcat(file->text,line);
}
//读取完毕,关闭文件
fclose(fp);
}
}
/*数据处理模块*/
//清理文本模块(将其中的无效字符替换为空格)
void cleantext(char* text)
{
int i = 0;
//遍历访问字符串中的每个字符
while( i
{
/*盗用标准库函数isalnum()判断当前字符是否是无效字符(不是字母和数字)*/
if( !isalnum(text) )
text=' '; //无效字符替换为空格 ++i; //检查下一个字符 } }
//切分单词模块 char* cutword( char* text,char* word) {
continchar = 0; //表示字符串中没有字符
int i = 0; //源字符串的索引 int w = 0; //目标字符串的索引 //从源字符串开始文职,逐个字符向后遍历 while( i < strlen(text) ) {
//判断当前字符是否是空格符或者换行符 if( (' ' == text) || ('n' == text) ) {
if(continchar) break; else ++i;
} else {
//如果遇到有效字符将其复制到目标字符串中 continchar = 1; word[w] = text; ++i; ++w;
}
}
//在目标字符串加个字符串结束符 word[w] = ' ';
//将原字符串的指针向后移动i个字符,作为下一次开始的位置 return text + i;
}
//单词结点结构体 typedef struct _word {
char text[30]; //保持单词的数组 int count; //单词个数 struct _word* next; //指向链表的下一个单词
}word;
//根据切分的单词创建单词结点 word* creatnode(char* text) {
//为结点申请内存 word* node = malloc( sizeof(word) ); node->next = null; //将切分的单词复制到结点保存 strcpy(node->text,text); //初始单词数为1 node->count = 1; //返回新创建的结点 return node; }
//查找单词模块 word* finenode( word* head, char* key ) {
//遍历链表所有结点 word* node = head; while( null != node ) {
//判断当前结点的内容是否与药查找的内容相同 if( 0 == strcmp( node->text,key ) ) //如果相同,返回当前结点 return node; node = node->next;
}
//当前链表没有找到 return null; }
//组装数据预处理模块 void preword( textfile* file ) {
//需要处理的文本内容 char* text = file->text; //保存单词的链表,初始化状态为null file->list = null; //单词总数初始为0 file->total = 0; //前一个结点初始状态为null word* pre = null;
//利用清理文本子模块处理文本中的无效字符 cleantext(text);
while(1) {
char wd[30] = ' '; //利用切分单词模块,从文本内容的text中切分出单词保存在wd字符数组中 cutword( text,wd );
//判断是否成功切分单词 if( strlen(wd) > 0 ) {
//成功切分单词,文件的单词总数加1 file->total += 1;
//查找当前单词wd是否已经存在单词链表中,如果存在,则返回指向这个节点的word*指针,否则返回null word* exist = findnode( file->list,wd )
//如果不存在这个链表中,则创建新的结点 if( null = exist ) {
//调用创建单词结点模块,创建新的单纯结点 word* node = creatnode(wd);
//判断当前结点是否有前结点 if( null == pre) //如果木有,则说明这是当前链表的第一个结点,将文件的链表指针指向这个结点 file->list = node; else //如果有前结点,则将当前结点链接到前结点 pre->list = node;
//将当前结点作为前结点,方便下次连接下个结点 pre = node;
} else {
//如果这个单词存在这个链表中只需将这个单词数加1,不需要再开辟空间给它 exist->count += 1;
}
} else //相对于if( strlen(wd) > 0 ) //如果无法成功切分单词,表示整个文本内容已经切分完毕 break;
}
}
//计算词频模块 void countkeyword( textfile* files,int count,char* keyword ) {
//计算关键字在每一个文件中的词频 for( int i = 0; i < count; ++i) {
//在当前文件中查找关键字结点 word* keynode = findnode( files.list,keyword ) //如果找到结点则计算词频 if( null != keynode ) //利用单纯的个数除以文件的单词总数计算词频 if( null != keynode ) files.frequency = keynode->count/(float)files.total; else //如果没有找到,词频为0 files.frequency = 0.0f;
}
}
//比较规则函数 int cmp( const void* a,const void* b) {
//将void*类型转化为textfile*类型 const textfile* file1 = (textfile*)a; const textfile* file2 = (textfile*)b;
//比较textfile结构体的词频 if( fabs( file1->frequency - file2->frequency ) < 0.001 ) return 0; else if( file1->frequency > file2->frequency ) return 1; else return -1;
}
//文件排序模块 void sortfiles( textfile* files,int count ) {
//调用qsort函数直接进行排序 qsort(files,count,sizeof(textfile),cmp);
}
/*数据输出模块*/
void printfiles( textfile* files,int count,char* keyword)//参数files和和count是保存textfile结构体数据的数组,keyword是本次插叙的关键字 {
//输出本次查询的关键词 printf("the keyword is "%s"n", keyword);
//输出这个关键词在各个文件的词频 puts("the frequency is "); for (int i = 0; i < count; ++i) { printf( "%s %.4fn",files.name,files.frequency ); }
}
/*释放动态申请的内存*/
void clean( textfile* files,int count) {
//循环遍历所有文件的链表 for( int i=0;i
{
//让head指向链表的开始位置
word* head = files.list;
//判断链表是否为null while( null != head) {
//将首结点作为当前的结点 word* cur = head; //将下一个节点作为新的首结点 head = cur->next; //释放当前结点动态申请的内存 free(cur);
}
}
}
/*主函数*/ int main() {
//定义需要处理的文件数 const int filecount = 5; //构造需要处理的文件为一个数组并初始化 textfile files[] = { {"test1"}, {"test2"}, {"text3"}, {"test4"}, {"test5"} }; //循环读取files数组中的5个文件 for(int i = 0;i < filecount; ++i) {
readfile( &files);
}
//数据预处理 for(int i = 0;i < filecount; ++i) preword( &files);
while(1) {
puts("please input the keyword:") char keyword[30] = " "; //获取用户输入的关键字 scanf( "%s",keyword ); //如果用户输入的是#,则表示程序结束,退出循环 if( 0 == strcmp(keyword,"#") ) break; //计算用户输入的词频 countkeyword( files,filecount,keyword );
//按照关键词在各个文件中的词频,对文件进行排序 sortfiles( files,filecount );
}
//输出排序完成的数组和关键词 printfiles( files,filecount,keyword );
//清理堆区 clean( files, filecount );
return 0;
}
这里是我编译得到的错误 --------------------Configuration: 35 - Win32 Debug-------------------- Compiling... 35.c G:C-homeworkkechen3535.c(15) : error C2061: syntax error : identifier 'word' G:C-homeworkkechen3535.c(19) : error C2059: syntax error : '}' G:C-homeworkkechen3535.c(23) : error C2143: syntax error : missing ')' before '*' G:C-homeworkkechen3535.c(23) : error C2143: syntax error : missing '{' before '*' G:C-homeworkkechen3535.c(23) : error C2059: syntax error : ')' G:C-homeworkkechen3535.c(24) : error C2054: expected '(' to follow 'file' G:C-homeworkkechen3535.c(59) : warning C4018: '<' : signed/unsigned mismatch G:C-homeworkkechen3535.c(73) : error C2065: 'continchar' : undeclared identifier G:C-homeworkkechen3535.c(75) : error C2143: syntax error : missing ';' before 'type' G:C-homeworkkechen3535.c(76) : error C2143: syntax error : missing ';' before 'type' G:C-homeworkkechen3535.c(78) : error C2065: 'i' : undeclared identifier G:C-homeworkkechen3535.c(78) : warning C4018: '<' : signed/unsigned mismatch G:C-homeworkkechen3535.c(96) : error C2065: 'w' : undeclared identifier G:C-homeworkkechen3535.c(130) : error C2065: 'null' : undeclared identifier G:C-homeworkkechen3535.c(130) : warning C4047: '=' : 'struct _word *' differs in levels of indirection from 'int ' G:C-homeworkkechen3535.c(146) : warning C4047: '!=' : 'int ' differs in levels of indirection from 'struct _word *' G:C-homeworkkechen3535.c(158) : warning C4047: 'return' : 'struct _word *' differs in levels of indirection from 'int ' G:C-homeworkkechen3535.c(162) : error C2143: syntax error : missing ')' before '*' G:C-homeworkkechen3535.c(162) : error C2143: syntax error : missing '{' before '*' G:C-homeworkkechen3535.c(162) : error C2059: syntax error : ')' G:C-homeworkkechen3535.c(163) : error C2054: expected '(' to follow 'file' G:C-homeworkkechen3535.c(231) : error C2143: syntax error : missing ')' before '*' G:C-homeworkkechen3535.c(231) : error C2143: syntax error : missing '{' before '*' G:C-homeworkkechen3535.c(231) : error C2059: syntax error : 'type' G:C-homeworkkechen3535.c(231) : error C2059: syntax error : ')' G:C-homeworkkechen3535.c(253) : error C2018: unknown character '0xa3' G:C-homeworkkechen3535.c(253) : error C2018: unknown character '0xac' G:C-homeworkkechen3535.c(253) : error C2143: syntax error : missing ')' before 'const' G:C-homeworkkechen3535.c(253) : error C2143: syntax error : missing '{' before 'const' G:C-homeworkkechen3535.c(253) : error C2059: syntax error : ')' G:C-homeworkkechen3535.c(254) : error C2054: expected '(' to follow 'b' G:C-homeworkkechen3535.c(271) : error C2143: syntax error : missing ')' before '*' G:C-homeworkkechen3535.c(271) : error C2143: syntax error : missing '{' before '*' G:C-homeworkkechen3535.c(271) : error C2059: syntax error : 'type' G:C-homeworkkechen3535.c(271) : error C2059: syntax error : ')' G:C-homeworkkechen3535.c(283) : error C2143: syntax error : missing ')' before '*' G:C-homeworkkechen3535.c(283) : error C2143: syntax error : missing '{' before '*' G:C-homeworkkechen3535.c(283) : error C2059: syntax error : 'type' G:C-homeworkkechen3535.c(283) : error C2059: syntax error : ')' G:C-homeworkkechen3535.c(300) : error C2143: syntax error : missing ')' before '*' G:C-homeworkkechen3535.c(300) : error C2143: syntax error : missing '{' before '*' G:C-homeworkkechen3535.c(300) : error C2059: syntax error : 'type' G:C-homeworkkechen3535.c(300) : error C2059: syntax error : ')' G:C-homeworkkechen3535.c(334) : error C2065: 'textfile' : undeclared identifier G:C-homeworkkechen3535.c(334) : error C2146: syntax error : missing ';' before identifier 'files' G:C-homeworkkechen3535.c(334) : error C2059: syntax error : ']' G:C-homeworkkechen3535.c(341) : error C2143: syntax error : missing ';' before 'type' G:C-homeworkkechen3535.c(341) : error C2143: syntax error : missing ';' before 'type' G:C-homeworkkechen3535.c(341) : error C2143: syntax error : missing ')' before 'type' G:C-homeworkkechen3535.c(341) : error C2143: syntax error : missing ';' before 'type' G:C-homeworkkechen3535.c(341) : warning C4552: '<' : operator has no effect; expected operator with side-effect G:C-homeworkkechen3535.c(341) : error C2059: syntax error : ')' G:C-homeworkkechen3535.c(342) : error C2143: syntax error : missing ';' before '{' G:C-homeworkkechen3535.c(344) : warning C4013: 'readfile' undefined; assuming extern returning int G:C-homeworkkechen3535.c(349) : error C2143: syntax error : missing ';' before 'type' G:C-homeworkkechen3535.c(349) : error C2143: syntax error : missing ';' before 'type' G:C-homeworkkechen3535.c(349) : error C2143: syntax error : missing ')' before 'type' G:C-homeworkkechen3535.c(349) : error C2143: syntax error : missing ';' before 'type' G:C-homeworkkechen3535.c(349) : warning C4552: '<' : operator has no effect; expected operator with side-effect G:C-homeworkkechen3535.c(349) : error C2059: syntax error : ')' G:C-homeworkkechen3535.c(350) : error C2146: syntax error : missing ';' before identifier 'preword' G:C-homeworkkechen3535.c(350) : warning C4013: 'preword' undefined; assuming extern returning int G:C-homeworkkechen3535.c(356) : error C2143: syntax error : missing ';' before 'type' G:C-homeworkkechen3535.c(358) : error C2065: 'keyword' : undeclared identifier G:C-homeworkkechen3535.c(360) : warning C4047: 'function' : 'const char *' differs in levels of indirection from 'int ' G:C-homeworkkechen3535.c(360) : warning C4024: 'strcmp' : different types for formal and actual parameter 1 G:C-homeworkkechen3535.c(363) : warning C4013: 'countkeyword' undefined; assuming extern returning int G:C-homeworkkechen3535.c(366) : warning C4013: 'sortfiles' undefined; assuming extern returning int G:C-homeworkkechen3535.c(371) : warning C4013: 'printfiles' undefined; assuming extern returning int G:C-homeworkkechen3535.c(374) : warning C4013: 'clean' undefined; assuming extern returning int Error executing cl.exe.
35.obj - 55 error(s), 15 warning(s)
拜托大家了,我郁闷了几个小时了,老是调不出!!
0
|