作业4 词频统计

时间:2022-01-03 21:57:09
  • 结对对象:梁开宝  博客地址: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;        }    }}
  • 结果截图:作业4 词频统计
  • 作业4 词频统计
  • 心得体会:学会了对文件的调用与输出