当前位置: 首页 > news >正文

第二周 词频统计

原需求

1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符。

2.统计英文单词在本文件的出现次数

3.将统计结果排序

4.显示排序结果

新需求:

1.小文件输入. 为表明程序能跑

2.支持命令行输入英文作品的文件名

3. 支持命令行输入存储有英文作品文件的目录名,批量统计

4. 从控制台读入英文单篇作品,重定向输出

1.

 
  

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

int main()

{

           char name[100];

           FILE *fp;

           char **string1, ch, *string;

           int len, i, j, k;

           int sign, same;

           if((fp = fopen("c://special.txt", "rb")) == NULL)

                 printf("打不开\n");

/*移到文件尾*/

          if(!fseek(fp, 0, 2))// 找到为执行 未找到不执行 

         {

              len = ftell(fp); // 获取文件长度

          }

         else

        {

          fclose(fp);

          printf("找不到尾\n");

         }

/*移到文件头*/

          if(fseek(fp, 0, SEEK_SET)) //找到不执行 未找到执行 

        {

            fclose(fp);

            printf("找不到头\n");

        }

          int number=0, num = 0;

          if(string = (char *)malloc(sizeof(char) * (len+ 1))) // +1是为了把buf分配的足够大

        {

            memset(string, 0, (len + 1)); // buf

            fread(string, 1, len, fp); // 把文件内容全部读到buf

            fclose(fp); 

      } 

          else 

         {

          fclose(fp);

          fprintf(stderr, "分配空间错误\n");

          }

/*统计总的单词个数*/

         sign= 1;

         for(i = 0; i < len; i++)

         {

         ch = *(string + i);

         if((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))

        {

             sign= 0;

         }

          else if(!sign)

         {

             number++;

             sign= 1;

           }

        }

         string1 = (char **)malloc(number* sizeof(char *));

         for(i = 0; i < number; i++)

        {

             string1[i] = (char *)malloc(20 * sizeof(char));

             memset(string1[i], 0, 20);

         }

         sign = 1;

         k = 0;

         j = 0;

         for(i = 0; i < len; i++)

        {

              ch = *(string + i);

              if((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))

             {

                  string1[k][j++] = ch;

                  sign= 0;

              }

              else if(!sign)

              {

                      k++;

                      j = 0;  

                     sign = 1;

              }

            }

           free(string);

 

/*计算每个单词的个数*/

         for(i = 0; i < number; i++)

        {

/*判断此单词是否和前面统计过的单词相同*/

            same = 0;

            for(j = 0; j < i; j++)

            {

                if(!strcmp(string1[i], string1[j]))

               {

                  same = 1;

                  break;

                }

            }

 

/*统计单词个数*/

 

            if(!same)

           {

              num = 0;

              for(j = i; j < number; j++)

              {

                 if(!strcmp(string1[i], string1[j]))

                 {

                    num++;

                  }

                }

            printf("%s : %d\n", string1[i], num);

      }

   }

          free(string1);

          return 1;

}

 
 

 

1.

 

2、

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

int main()

{

           char name[100]; 

           printf("请输入");

           gets(name);

           strcat(name, ".txt");

           FILE *fp;

           char **string1, ch, *string;

           int len, i, j, k;

           int sign, same;

           if((fp = fopen(name,"rb")== NULL)

                 printf("打不开\n");

/*移到文件尾*/

          if(!fseek(fp, 0, 2))// 找到为执行 未找到不执行 

         {

              len = ftell(fp); // 获取文件长度

          }

         else

        {

          fclose(fp);

          printf("找不到尾\n");

         }

/*移到文件头*/

          if(fseek(fp, 0, SEEK_SET)) //找到不执行 未找到执行 

       {

           fclose(fp);

           printf("找不到头\n");

        }

          int number=0, num = 0;

          if(string = (char *)malloc(sizeof(char) * (len+ 1))) // +1是为了把buf分配的足够大

           {

               memset(string, 0, (len + 1)); // buf

               fread(string, 1, len, fp); // 把文件内容全部读到buf

               fclose(fp); 

            } 

          else 

       {

          fclose(fp);

          fprintf(stderr, "分配空间错误\n");

       }

/*统计总的单词个数*/

          sign= 1;

          for(i = 0; i < len; i++)

       {

              ch = *(string + i); 

              if((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))

            {

                sign= 0;

             }

         else if(!sign)

           {

                number++;

                sign= 1;

               }

           }

        string1 = (char **)malloc(number* sizeof(char *));

        for(i = 0; i < number; i++)

           {

             string1[i] = (char *)malloc(20 * sizeof(char));

             memset(string1[i], 0, 20);

           }

        sign = 1;

        k = 0;

        j = 0;

        for(i = 0; i < len; i++)

          {

        ch = *(string + i);

        if((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))

           { 

            string1[k][j++] = ch;

            sign= 0;

            }  

        else if(!sign)

             {

               k++;

               j = 0;  

               sign = 1;

             }

        }

        free(string);

/*计算每个单词的个数*/

        for(i = 0; i < number; i++)

     {

/*判断此单词是否和前面统计过的单词相同*/

        same = 0;

        for(j = 0; j < i; j++)

       {

            if(!strcmp(string1[i], string1[j]))

          {

              same = 1;

              break;

           }

       }

/*统计单词个数*/

        if(!same)

        {

         num = 0;

         for(j = i; j < number; j++)

           {

              if(!strcmp(string1[i], string1[j]))

               {

                  num++;

               }

          }

        printf("%s : %d\n", string1[i], num);

       }

     }

        free(string1);

        return 1;

}

 

4.

 
  

#include<stdio.h>

#include<string.h>

#define max 100

int main()

{

     char str[max][max];

     char str1[max][max];

     int num[max];

     char string[max];

     int i,j,k,l,n,m;

     int t;

     gets(string);

     n = 0;

     k = 0;

     for(m = 1;m<strlen(string);m++)

       {

         if(string[m] ==' ')  

         {

           strncpy(str[k++],string+n,m-n);

           n = m+1;

         }

       }

       strncpy(str[k++],string+n,m-n);

        l = 0;

       for(i=0;i<k;i++)

        {

          if(i==0)

          {

             strcpy(str1[l++],str[i]);

          }

          else 

         {

          t = 0;

         for(j=0;j<l;j++)

        {

            if(strcmp(str1[j],str[i])==0)

           {

               t = 1;

               break;

             }

           } 

        }

         if(t==0)

         strcpy(str1[l++],str[i]);

       }

         for(i=0;i<l;i++)

          {

           printf("%s\n",str1[i]);

           }   

         for(i=0;i<l;i++)

          {

           num[i] = 0;

       }

      for(i=0;i<l;i++)  

       {

        for(j=0;j<k;j++)

         {

          if(strcmp(str1[i],str[j])==0)

           {

             num[i]++;   

            }       

          }

       }

     for(i=0;i<l;i++)

     {

      printf("%d\n",num[i]);

       }

      return 0;

   }

 

 

 

 

 

 

coding.net的地址为 https://git.coding.net/brilliant/cptj2.git

                          git@git.coding.net:brilliant/cptj2.git

 小结:这个大概花了3天的时间。学习文件的知识,之前一直奇怪别人做的时候为什么没有用if(==“ ”)判断空格的语句就能完成对单词的分割,后来才发现文件的fscanf语句特别强大。后来又学fseek等语句,知道if还可以在if(=)中使用等等,总之收获颇丰。在操作台中输入就不能用文件了,就用了之前词频统计的改进版。最近学习经常弄到12点,可能是我基础薄弱,努力学习掌握方法应该就会好了。

        

转载于:https://www.cnblogs.com/brilliant2016/p/5873961.html

相关文章:

  • java之struts2的action的创建方式
  • linux安装openssl、swoole等扩展的具体步骤
  • CSS 分享
  • VS2017 常用快捷键
  • Vue.js源码(2):初探List Rendering
  • 如何把文字转换成语音,文字转语音转换器能帮你
  • 面试官:你接受免费加班吗?程序员这样怼回去,网友:老铁没毛病
  • fseek的使用
  • assert()函数用法
  • Python Day29
  • java socket之多人聊天室Demo
  • NCRE考试感想 四级嵌入式(下)
  • ps调整图层
  • 使用zabbix系统批量监控Url返回码
  • 1 weekend110的hdfs源码跟踪之打开输入流 + hdfs源码跟踪之打开输入流总结
  • 4个实用的微服务测试策略
  • Asm.js的简单介绍
  • conda常用的命令
  • IndexedDB
  • orm2 中文文档 3.1 模型属性
  • VUE es6技巧写法(持续更新中~~~)
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 笨办法学C 练习34:动态数组
  • 初识 webpack
  • 多线程事务回滚
  • 给Prometheus造假数据的方法
  • 缓存与缓冲
  • 机器学习 vs. 深度学习
  • 每天一个设计模式之命令模式
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 如何选择开源的机器学习框架?
  • 微信小程序填坑清单
  • 想写好前端,先练好内功
  • 小程序button引导用户授权
  • Mac 上flink的安装与启动
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​Spring Boot 分片上传文件
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • # Java NIO(一)FileChannel
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)大型网站架构演变和知识体系
  • .Net 6.0 处理跨域的方式
  • .NET Micro Framework初体验
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .net分布式压力测试工具(Beetle.DT)
  • /dev/sda2 is mounted; will not make a filesystem here!
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • /run/containerd/containerd.sock connect: connection refused
  • ::什么意思