博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第二周 词频统计
阅读量:6537 次
发布时间:2019-06-24

本文共 4475 字,大约阅读时间需要 14 分钟。

原需求

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

你可能感兴趣的文章
jrtplib编译指南
查看>>
VS2015 中统计整个项目的代码行数
查看>>
Anaconda入门使用指南
查看>>
UWP控件与DataBind
查看>>
bash: php: command not found
查看>>
XVIII Open Cup named after E.V. Pankratiev. Eastern Grand Prix
查看>>
数据恢复软件如何换机使用?
查看>>
《高性能mysql》到手
查看>>
(转)关于如何学好游戏3D引擎编程的一些经验
查看>>
使用Kotlin为你的APP自定义一个统一的标题栏
查看>>
EF各版本增删查改及执行Sql语句
查看>>
拓扑排序
查看>>
jQGrid API
查看>>
MySQL定时检查是否宕机并邮件通知
查看>>
Bzoj1758: [Wc2010]重建计划
查看>>
LOJ2541:「PKUWC2018」猎人杀
查看>>
从零开始学习Sencha Touch MVC应用之十四
查看>>
redis集群部署及踩过的坑
查看>>
j2EE监听器-listener
查看>>
使用pip命令报You are using pip version 9.0.3, however version 18.0 is available pip版本过期.解决方案...
查看>>