C语言 课程设计的程序问题 求助高手!
时间:10-02
整理:3721RD
点击:
题目35:统计网页词频
假如有5个文件5个网页,每个文件中都保存了一篇一定长度的英文文章,现在输入一个关键字,统计出这个关键字在每一个文件中的词频,并按照词频的大小,按照从大到小的顺序将这些文件输出到屏幕和结果文件中。
以下是代码,因为是用vc弄得,所以没有用stdbool.h
#include<stdio.h>
#include<stdlib.h> // qsort()排序函数定义在stdlib.h头文件中
#include<string.h>
#include<ctype.h> // 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<strlen(text) )
{
/*盗用标准库函数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] = '\0';
//将原字符串的指针向后移动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 %.4f\n",files.name,files.frequency );
}
}
/*释放动态申请的内存*/
void clean( textfile* files,int count)
{
//循环遍历所有文件的链表
for( int i=0;i<count;++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-homework\kechen\35\35.c(15) : error C2061: syntax error : identifier 'word'
G:\C-homework\kechen\35\35.c(19) : error C2059: syntax error : '}'
G:\C-homework\kechen\35\35.c(23) : error C2143: syntax error : missing ')' before '*'
G:\C-homework\kechen\35\35.c(23) : error C2143: syntax error : missing '{' before '*'
G:\C-homework\kechen\35\35.c(23) : error C2059: syntax error : ')'
G:\C-homework\kechen\35\35.c(24) : error C2054: expected '(' to follow 'file'
G:\C-homework\kechen\35\35.c(59) : warning C4018: '<' : signed/unsigned mismatch
G:\C-homework\kechen\35\35.c(73) : error C2065: 'continchar' : undeclared identifier
G:\C-homework\kechen\35\35.c(75) : error C2143: syntax error : missing ';' before 'type'
G:\C-homework\kechen\35\35.c(76) : error C2143: syntax error : missing ';' before 'type'
G:\C-homework\kechen\35\35.c(78) : error C2065: 'i' : undeclared identifier
G:\C-homework\kechen\35\35.c(78) : warning C4018: '<' : signed/unsigned mismatch
G:\C-homework\kechen\35\35.c(96) : error C2065: 'w' : undeclared identifier
G:\C-homework\kechen\35\35.c(130) : error C2065: 'null' : undeclared identifier
G:\C-homework\kechen\35\35.c(130) : warning C4047: '=' : 'struct _word *' differs in levels of indirection from 'int '
G:\C-homework\kechen\35\35.c(146) : warning C4047: '!=' : 'int ' differs in levels of indirection from 'struct _word *'
G:\C-homework\kechen\35\35.c(158) : warning C4047: 'return' : 'struct _word *' differs in levels of indirection from 'int '
G:\C-homework\kechen\35\35.c(162) : error C2143: syntax error : missing ')' before '*'
G:\C-homework\kechen\35\35.c(162) : error C2143: syntax error : missing '{' before '*'
G:\C-homework\kechen\35\35.c(162) : error C2059: syntax error : ')'
G:\C-homework\kechen\35\35.c(163) : error C2054: expected '(' to follow 'file'
G:\C-homework\kechen\35\35.c(231) : error C2143: syntax error : missing ')' before '*'
G:\C-homework\kechen\35\35.c(231) : error C2143: syntax error : missing '{' before '*'
G:\C-homework\kechen\35\35.c(231) : error C2059: syntax error : 'type'
G:\C-homework\kechen\35\35.c(231) : error C2059: syntax error : ')'
G:\C-homework\kechen\35\35.c(253) : error C2018: unknown character '0xa3'
G:\C-homework\kechen\35\35.c(253) : error C2018: unknown character '0xac'
G:\C-homework\kechen\35\35.c(253) : error C2143: syntax error : missing ')' before 'const'
G:\C-homework\kechen\35\35.c(253) : error C2143: syntax error : missing '{' before 'const'
G:\C-homework\kechen\35\35.c(253) : error C2059: syntax error : ')'
G:\C-homework\kechen\35\35.c(254) : error C2054: expected '(' to follow 'b'
G:\C-homework\kechen\35\35.c(271) : error C2143: syntax error : missing ')' before '*'
G:\C-homework\kechen\35\35.c(271) : error C2143: syntax error : missing '{' before '*'
G:\C-homework\kechen\35\35.c(271) : error C2059: syntax error : 'type'
G:\C-homework\kechen\35\35.c(271) : error C2059: syntax error : ')'
G:\C-homework\kechen\35\35.c(283) : error C2143: syntax error : missing ')' before '*'
G:\C-homework\kechen\35\35.c(283) : error C2143: syntax error : missing '{' before '*'
G:\C-homework\kechen\35\35.c(283) : error C2059: syntax error : 'type'
G:\C-homework\kechen\35\35.c(283) : error C2059: syntax error : ')'
G:\C-homework\kechen\35\35.c(300) : error C2143: syntax error : missing ')' before '*'
G:\C-homework\kechen\35\35.c(300) : error C2143: syntax error : missing '{' before '*'
G:\C-homework\kechen\35\35.c(300) : error C2059: syntax error : 'type'
G:\C-homework\kechen\35\35.c(300) : error C2059: syntax error : ')'
G:\C-homework\kechen\35\35.c(334) : error C2065: 'textfile' : undeclared identifier
G:\C-homework\kechen\35\35.c(334) : error C2146: syntax error : missing ';' before identifier 'files'
G:\C-homework\kechen\35\35.c(334) : error C2059: syntax error : ']'
G:\C-homework\kechen\35\35.c(341) : error C2143: syntax error : missing ';' before 'type'
G:\C-homework\kechen\35\35.c(341) : error C2143: syntax error : missing ';' before 'type'
G:\C-homework\kechen\35\35.c(341) : error C2143: syntax error : missing ')' before 'type'
G:\C-homework\kechen\35\35.c(341) : error C2143: syntax error : missing ';' before 'type'
G:\C-homework\kechen\35\35.c(341) : warning C4552: '<' : operator has no effect; expected operator with side-effect
G:\C-homework\kechen\35\35.c(341) : error C2059: syntax error : ')'
G:\C-homework\kechen\35\35.c(342) : error C2143: syntax error : missing ';' before '{'
G:\C-homework\kechen\35\35.c(344) : warning C4013: 'readfile' undefined; assuming extern returning int
G:\C-homework\kechen\35\35.c(349) : error C2143: syntax error : missing ';' before 'type'
G:\C-homework\kechen\35\35.c(349) : error C2143: syntax error : missing ';' before 'type'
G:\C-homework\kechen\35\35.c(349) : error C2143: syntax error : missing ')' before 'type'
G:\C-homework\kechen\35\35.c(349) : error C2143: syntax error : missing ';' before 'type'
G:\C-homework\kechen\35\35.c(349) : warning C4552: '<' : operator has no effect; expected operator with side-effect
G:\C-homework\kechen\35\35.c(349) : error C2059: syntax error : ')'
G:\C-homework\kechen\35\35.c(350) : error C2146: syntax error : missing ';' before identifier 'preword'
G:\C-homework\kechen\35\35.c(350) : warning C4013: 'preword' undefined; assuming extern returning int
G:\C-homework\kechen\35\35.c(356) : error C2143: syntax error : missing ';' before 'type'
G:\C-homework\kechen\35\35.c(358) : error C2065: 'keyword' : undeclared identifier
G:\C-homework\kechen\35\35.c(360) : warning C4047: 'function' : 'const char *' differs in levels of indirection from 'int '
G:\C-homework\kechen\35\35.c(360) : warning C4024: 'strcmp' : different types for formal and actual parameter 1
G:\C-homework\kechen\35\35.c(363) : warning C4013: 'countkeyword' undefined; assuming extern returning int
G:\C-homework\kechen\35\35.c(366) : warning C4013: 'sortfiles' undefined; assuming extern returning int
G:\C-homework\kechen\35\35.c(371) : warning C4013: 'printfiles' undefined; assuming extern returning int
G:\C-homework\kechen\35\35.c(374) : warning C4013: 'clean' undefined; assuming extern returning int
Error executing cl.exe.
35.obj - 55 error(s), 15 warning(s)
拜托大家了,我郁闷了几个小时了,老是调不出!
自己慢慢找错吧。从第一个错误找起。