微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > C语言 课程设计的程序问题 求助高手!

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)

拜托大家了,我郁闷了几个小时了,老是调不出!

自己慢慢找错吧。从第一个错误找起。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top