• 软件工程第二周作业--词频统计


    代码链接:https://git.coding.net/Rainbows/wc.git

    发表博客,介绍上述“项目”中每个功能的重点/难点,展示重要代码片断,展示你感觉得意、突破、困难的地方。

    1、基本操作:如何重定向

     if(argc==3)
        {
            string arg=argv[2];
            file_get_map(arg);
        }//从命令行参数读取文件名
    void file_get_map(string Arg)
    {
        string filename;
        filename=Arg;
        // cin.get();
        ifstream fin(filename.c_str());                    //重定向
        string  temp;
        map<string,int> wmap;
        while(fin>>temp)
        {
            int len=temp.size();
            char tmp[20]="";
            int j=0;
            for(int i=0; i<len; i++)
            {
                if (isalpha(temp[i]))
                {
                    tmp[j]=temp[i];
                    j++;
                }
    
            }
            string tmp2(tmp);
            wmap[tmp2]++;
        }
        display_map(wmap);
        fin.close();
        cin.get();
    }

    2、如何判断单词(其实有错的),我是判断的连续的字母,没有考虑到连词符。连词符应该加上,每一个位置都判断是否连词符。(新的问题,hello和he-llo是否应该算同一个单词呢?)

    while(fin>>temp)
        {
            int len=temp.size();
            char tmp[20]="";
            int j=0;
            for(int i=0; i<len; i++)
            {
                if (isalpha(temp[i]))//是字母
                {
                    tmp[j]=temp[i];//tmp保存它,不是字母就不保存了
                    j++;
                }
    
            }
            string tmp2(tmp);//转string
            wmap[tmp2]++;//插入map
        }

    3、如何处理目录

    void one_backslash_become_two_backslash(char* Path)
    {
        int len=strlen(Path);
        char Path2[100];
        for(int i=0,j=0; i<len; i++)
        {
            if(Path[i]=='\')
            {
                Path2[j++]='\';
                Path2[j++]='\';
            }
            else Path2[j++]=Path[i];
        }
        strcpy(Path2,Path);
    }
     char a[200]="",b[20]="*.txt",c[20]="\",d[20]="-s";
        if(strcmp(d,argv[1])==0)
        {
            console_get_name();//控制台读
            return 0;
        }
        char buf[80];
        getcwd(buf,sizeof(buf));
        strcat(a,buf);
        strcat(a,c);
        strcat(a,argv[1]);
        strcat(a,c);
        strcat(a,b);//构造地址
        //printf("%s
    ",argv[0]);
        one_backslash_become_two_backslash(a);//双斜杠
        // strcat(a,b);
        //printf("%s
    ",a);
        long Handle;
        struct _finddata_t FileInfo;
        if((Handle=_findfirst(a,&FileInfo))==-1L)//不是一个目录
        {
            char aa[200];
            strcpy(aa,argv[1]);
            file_txt_get_map(aa);
        }
        else//是一个目录,遍历它,从里边取txt
        {
    
            file_info_get_map(FileInfo.name);
            while(_findnext(Handle,&FileInfo)==0)
                file_info_get_map(FileInfo.name);
            _findclose(Handle);
        }
    void file_info_get_map(char* fileinfo)
    {
        string filename=fileinfo;
        // cin >> filename;
        //  cin.get();
        ifstream fin(filename.c_str());                    //  read  in  str[]
        string  temp;
        map<string,int> wmap;
        while(fin>>temp)
        {
            int len=temp.size();
            char tmp[20]="";
            int j=0;
            for(int i=0; i<len; i++)
            {
                if (isalpha(temp[i]))
                {
                    tmp[j]=temp[i];
                    j++;
                }
    
            }
            string tmp2(tmp);
            wmap[tmp2]++;
        }
        display_map(wmap);
        fin.close();
    //   cin.get();
    }

    难点大致就是这些。

    任务 预计时间 实际时间 难点
    重定向原型 10min 15min 在网上找的,没难点,差距并不大。
    单词分割原型 10min 75min 在网上找那个处理一些数据是错的,尝试了处理标点,最后尝试了只处理字母(似乎是错的),高估了自己的第一判断的准确性。
    输出模块原型 5min 5min 遍历map,用迭代器,没啥难点,而且在网上找的重定向原型自带输出模块,改一点就可以用。
    命令行参数处理原型 15min 15min 在网上找的,没难点。
    功能整合,做出成品 20min 180min 从程序入口进来,如何进入不同的子程序的条件判断算了一会,然后乱七八糟的小bug解决了之后都忘了它们是怎么发生的。还有一些是写子程序的时候懒得实现的细节在最后实现了。

    实际写代码的时间并不是很多,而且很顺利,但是在路上和吃饭的时间也思考了,不知道怎么算进去。前后花了两天的时间吧。预计时间和实际时间是我根据印象编的,当时没记。

    代码及版本控制:感谢郑蕊师姐!好人一生平安!其实老师也在提示中说了“建议使用tortoisegit”,我搜的全是命令行的教程,用这个客户端老快了。

  • 相关阅读:
    144.二叉树的前序遍历
    103.二叉树的锯齿形层次遍历
    shiro系列二、身份验证和授权
    shiro系列一、认识shiro
    发送短信——java
    redis系列二: linux下安装redis
    redis系列一: windows下安装redis
    BootstrapValidator 表单验证超详细教程
    Linux ps 命令详解
    Vmvare 虚拟机固定IP
  • 原文地址:https://www.cnblogs.com/gaoyb348/p/7544865.html
Copyright © 2020-2023  润新知