郭自轻

作业4 词频统计

  • 结对对象:梁开宝  博客地址:http://www.cnblogs.com/liangkaibao/  贡献比例 50% 50%
  • 基于作业3的结果,读取一个较小的文本文件A_Tale_of_Two_Cities.txt,统计该文件中的单词的频率,并将统计结果输出到当前目录下的 Result1.txt 文件。 (第一阶段初稿完成该要求)
  • 命令行格式: 提示符> Myapp.exe -f filename.txt > Result.txt (PS:C++ 程序,Java 程序输出方式类似) filename.txt 为前面下载的文件名。
  • 部分源程序:
  • #include <stdio.h>
    #include "SqList.h"             // 线性表的存储与操作
     
    int pickword ( FILE *f, char *fword );
     
    int main()
    {
        FILE *f1, *f2;
     
        // 指定默认文件名,用字符串保存文件名,便于操作
        const int MAX_FILENAME = 20;                // 文件名长度
        char fname1[MAX_FILENAME] = "TUT.txt";
        char fname2[MAX_FILENAME] = "result.txt";
     
        // 用户指定源文件名
        printf ( "请指定源文件名(不超过%d个字符):", MAX_FILENAME );
        scanf ( "%s", fname1 );
     
        // 用户指定输出文件名
        printf ( "请指定要输出结果的文件名(不超过%d个字符):", MAX_FILENAME );
        scanf ( "%s", fname2 );
     
        //打开文件
        if ( ( f1 = fopen ( fname1, "r" ) ) == NULL )   // 异常处理
        {
            printf ( "打开文件%s失败!\n", fname1 );
            return 0;
        }
        else
            printf ( "打开文件%s成功!\n", fname1 );
     
        SqList L;               // 建立线性表
        SqListInit ( &L );          // 初始化线性表
     
        char fword[MAX_CHARACTER];          // 使用fword数组保存文件中的单词
        fword[MAX_CHARACTER - 1] = '\0';
        int i = -1;             // 设置i为插入位置
     
        while ( !feof ( f1 ) )      // 读文件未结束
        {
            int judge = pickword ( f1, fword ); // 从f指向的文件中提取单词到fword中
     
            if ( -1 == judge )          // 数组越界时提示并退出
            {
                printf ( "存在单词字符长度超过数组界限\n" );
                return -1;
            }
     
            if ( SqListBSearch ( &L, fword, i ) )   // i返回插入位置或单词在线性表中位置
            {
                // 在线性表中找到该单词
                L.elem[i].count++;          // 单词出现次数加1
            }
            else
            {
                // 线性表中未找到该单词
                SqListInsert ( &L, i, fword );      // 在第i个位置上插入
            }
        }
     
        // 打开文件fname2,将内容写入
        if ( ( f2 = fopen ( fname2, "w" ) ) == NULL )   // 异常处理
        {
            printf ( "写入文件%s失败!\n", fname2 );
            return 0;
        }
        else
            printf ( "文件已写入%s!\n", fname2 );
     
        // 将结果写入f2指向的文件中
        SqListPrint ( f2, fname1, &L );
     
        // 关闭文件
        fclose ( f1 );
        fclose ( f2 );
    }
     
    int pickword ( FILE *f, char *fword )       // 从f指向的文件中提取单词到fword中
    {
        char ch;                    // ch储存待检测字符
     
        for ( int j = 0 , flag = 0 ; !feof ( f ) ; )    // 逐个对字符进行检测,flag用于标记,为0时表示单词中无字母
        {
            if ( j >= MAX_CHARACTER )            // 判断数组是否越界
            {
                return -1;
            }
     
            ch = fgetc ( f );               // 获取字符
     
            if ( ch >= 'A' && ch <= 'Z' )         // 大写字符转小写保存在fword数组中
            {
                fword[j++] = ch + 32;
                flag = 1;
            }
     
            if ( ( ch >= 'a' && ch <= 'z' ) )     // 小写字符保存在fword数组中
            {
                fword[j++] = ch;
                flag = 1;
            }
     
            if ( '-' == ch && fword[j - 1] >= 'a' && fword[j - 1] <= 'z' )    // 若单词中带连字符,将连字符保存在fword数组中
            {
                fword[j++] = ch;
            }
     
            if ( ! ( ( ch >= 'A' && ch <= 'Z' ) || ( ch >= 'a' && ch <= 'z' ) || '-' == ch )
                    && flag == 1 )              // 过滤单词中的非字母字符
            {
                if ( fword[j - 1] == '-' )          // 排除类似于 a- 的单词
                    fword[j - 1] = '\0';
     
                fword[j] = '\0';                // fword数组以'\0'结尾
                return 0;
            }
        }
    }
  • 结果截图:
  • 心得体会:学会了对文件的调用与输出

posted on 2016-03-22 20:31  郭自轻  阅读(223)  评论(1编辑  收藏  举报

导航