第二周作业——词频统计

题目需求具体如下:

https://edu.cnblogs.com/campus/nenu/2018fall/homework/2126

git地址:

https://git.coding.net/liu-xin/wf.git

功能1 小文件输入,为表明程序能跑。需要在控制台下输入命令,实现统计文件中不重复单词总个数,重复次数由高到低输出。

功能 2 命令行输入英文作品的文件名,实现作品不重复单词计数,重复次数由高到低输出前十位。

功能 3 命令行输入存储有英文作品文件的目录名,批量统计作品不重复单词总数,重复次数由高到低输出前十位。

功能 4从控制台读入英文单篇作品,表明你能提供更适合嵌入脚本的作品或者bing:linux重定向。

一、准备工作

  从头到尾浏览一遍题目要求以后,我第一反应不是编程思路是什么,而是先把准备工作做好。打开Excel表,随时记录时间,打开Word,随时记录遇到的困难和解决办法。

二、版本控制

  版本控制我之前是没有接触过的,刚开始是一脸懵,直接从度娘开始,查找什么是版本控制?什么是git?什么是tortoisgit?具体怎样操作都是一步一步跟着自己查找进行操作。但是,其中还是走了好多弯路,耗费了大量的时间在熟悉工具上。心得:只知道按步骤来,不思考,往往做着无用功。

第一步:下载、安装git和git客户端tortoisgit。

git下载地址:https://git-scm.com/download

tortoisgit下载地址:https://tortoisegit.org/download/

安装过程:点击下一步。

第二步:申请coding.net账号并新建一个项目

第三步:在coding.net上配置远程git ,具体请参见

https://blog.csdn.net/gyy930324/article/details/54575246

(PS:若是代码丢失,现在代码无法运行,找不到原版代码,需要恢复代码参见https://blog.csdn.net/jjs2749651/article/details/80763842。希望你用不到代码恢复,太惨了……)

三、学习过程

  准备工作做好之后,接下来是最核心的环节了,由于自己对C语言比较熟悉,选择了C语言进行编程。利用中午下课午休时间去图书馆借了谭浩强《C语言程序设计》,用于知识点的查漏补缺。

我把要求详细的分析了以后,列出了我认为比较关键的地方:

1. 文件的读取:

2. 文件遍历

3. 单词判断:a.重复   b.大小写  c.特殊符号

4. 词频排序:

5.控制台输出

6.代码整合

7.重定向

四、遇到的困难与解决办法

功能一:

  1. 忘记了C语言中文件的读。

解决办法:参见参见谭浩强《C语言程序设计》第四版第十章和https://blog.csdn.net/qq_29109941/article/details/74276375

  2.忘记了结构体和指针的用法。

解决办法:参见谭浩强《C语言程序设计》第四版 第八章和第九章。

  3.忘记了排序算法。

解决办法:参见谭浩强《C语言程序设计》第四版 P147。

  4.控制台使用命令行参数运行程序。

解决办法:int main(int argc,char *argv[])       

      //argv[0]指向程序运行的全路径名

    //argv[1]指向DOS命令行中执行程序名后的第一个字符串

    //argv[2]指向执行程序名后的第二个字符串

    //argv为存储命令行参数的字符串数组

功能二:

  1. 不知道怎么处理整本小说读。

解决办法:https://blog.csdn.net/yang332233/article/details/53081785 (实现txt读取)

  2.单词统计判断出现错误。

解决办法:除了大小写分别26个字母以外,处理特殊符号。

功能三 :

  1. 遍历文件夹中的txt困难。

解决办法:查找文件的类 struct _finddata_t结构体用法,chdir函数用法。

  2.无法自动输出文件中每一个txt的词频统计。

解决办法:每读取一个目录输出一次单词统计。

  3.各个功能代码整合困难。(判断输入是文件夹的名字,还是文件txt的名字比较困难)

解决办法:1)通过输入的参数判断:if (S_ISDIR(st.st_mode))

                  2)正则表达: 正则没看懂,最后选择的第一种解决办法。

功能四:

  1. 不理解题意。

解决办法:找度娘,浏览相关博客了解重定向的相关知识点。非自己实现,参考了潘世维同学的代码,在此表示感谢。

五、重要代码

1

long Handle;                                        //遍历文件夹中的txt
    struct _finddata_t fileinfo;
    struct stat st;                                        
    stat(argv[1],&st);                                    //判断某文件是文件夹还是文件
    if (S_ISDIR(st.st_mode))                            //是文件夹
    {
        chdir(argv[1]);                                    //chdir()用户将当前的工作目录改变成以参数路径所指的目录
        if((Handle=_findfirst("*.txt",&fileinfo))==-1L)  //findfirst搜索与指定的文件名称匹配的第一个实例,若成功则返回第一个实例的句柄,否则返回-1L。
            {
                printf("没有找到匹配的项目\n");
            }
        else
        {
            printf("%s\n",fileinfo.name);
            find(fileinfo);    
            while(_findnext(Handle,&fileinfo)==0)
            {
                printf("---\n"); 
                printf("%s\n",fileinfo.name);
                find(fileinfo);
                printf("---\n"); 
            }
            _findclose(Handle);
        }
    }
遍历文件夹中txt

2

1 FILE *fp;
2 fp=fopen(fileinfo.name,"r");
txt内容读取

3

void count(char s[])
{
    int i,j;
    int flag=0;
    for(i=0;i<=sum;i++)
    {
        if(strcmp(C[i].str,s)==0)
        {
            C[i].num++;
            flag=1;
            
        }
    }
    if(flag==0)
    {
        for(j=0;j<30;j++)
            C[sum].str[j]=s[j];
        C[sum].num++;
        sum++;
        
    }
}
单词计数

4

void paixu()
{
    int i,j;
    struct word a;
    for(i=0;i<sum;i++)
    {
        for(j=i+1;j<sum;j++)
        {
            if(C[i].num<C[j].num)
            {
                a=C[j];
                C[j]=C[i];
                C[i]=a;
            }
        }
    }
词频排序

六、 执行效果图

功能一

功能二

功能三

功能四

 

七、PSP阶段表格

PSP阶段预计花费时间实际花费时间时间差距
功能一480min804min324min 
txt文件的读取60min91min31min
结构体和指针的用法60min87min27min
单词计数30min42min12min
排序算法45nin65min20min
使用命令行参数运行程序---287min 
代码调试---232min 
功能二60min94min34min
读取txt内容60min48min12min
控制前十输出10min17min7min
代码调试---29min 
功能三480min546min66min
遍历文件夹180min233min53min
代码调试---81min 
代码优化---65min 
功能整合120min167min47min
功能四420min465min45min
需求分析120min134min14min
重定向180min112min68min
代码优化---219min 

 

  

 

转载于:https://www.cnblogs.com/liu-xin1995/p/9696826.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值