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

代码链接: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”,我搜的全是命令行的教程,用这个客户端老快了。

原文地址:https://www.cnblogs.com/gaoyb348/p/7544865.html