• 作业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失败! ", fname1 );
              return 0;
          }
          else
              printf ( "打开文件%s成功! ", fname1 );
       
          SqList L;               // 建立线性表
          SqListInit ( &L );          // 初始化线性表
       
          char fword[MAX_CHARACTER];          // 使用fword数组保存文件中的单词
          fword[MAX_CHARACTER - 1] = '';
          int i = -1;             // 设置i为插入位置
       
          while ( !feof ( f1 ) )      // 读文件未结束
          {
              int judge = pickword ( f1, fword ); // 从f指向的文件中提取单词到fword中
       
              if ( -1 == judge )          // 数组越界时提示并退出
              {
                  printf ( "存在单词字符长度超过数组界限 " );
                  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失败! ", fname2 );
              return 0;
          }
          else
              printf ( "文件已写入%s! ", 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] = '';
       
                  fword[j] = '';                // fword数组以''结尾
                  return 0;
              }
          }
      }
    • 结果截图:
    • 心得体会:学会了对文件的调用与输出
  • 相关阅读:
    excel 2003系列
    DataTab转换XML XML转换DataTable 的类[转]
    全角转半角与半角转全角
    Day2
    Day6 && Day7图论
    Day1
    Android为何以及如何保存Fragment实例
    Android应用的本地化及知识拓展之配置修饰符
    Leetcode NO.136 Single Number 只出现一次的数字
    经典排序算法(四) —— Quick Sort 快速排序
  • 原文地址:https://www.cnblogs.com/mengshen/p/5308330.html
Copyright © 2020-2023  润新知