20180918 博客作业

此作业的要求参见https://edu.cnblogs.com/campus/nenu/2018fall/homework/2126

词频统计

程序需求:

从文件中读取字符串,摘取其中的单词并统计单词数量。可以从控制台读取文件名,还可以从控制台读取目录名批量统计,还可以重定向输出。

代码实现:

我的代码发布在:https://git.coding.net/wangyupan/fist-program.git

1.提取输入的单词,统计单词数量。

    long long total=0;
    long long num=0;
    fp=fopen(strtemp,"r");
    freopen(strtemp,"r",stdin);
    while(!feof(fp))
    {
        fscanf(fp,"%s",str);
        int len=strlen(str);
        int j=0;
        for(int i=0; i<len; i++)
        {
            if(str[i]>='A'&&str[i]<='Z')
            {
                str[i]+=32;
            }
            if(str[i]>='a'&&str[i]<='z')
            {
                str1[j++]=str[i];
            }
            else
            {
                str1[j]='\0';
                if(str1[0]=='\0')
                    continue;
                else
                    total++;
                bool flag=true;
                for(int i=0; i<num; i++)
                {
                    if(strcmp(Word[i].W,str1)==0)
                    {
                        Word[i].cnt++;
                        flag=false;
                        break;
                    }
                }
                if(flag)
                {
                    strcpy(Word[num].W,str1);
                    Word[num].cnt=1;
                    num++;
                }
                j=0;
            }
        }
        str1[j]='\0';
        if(str1[0]=='\0')
        {
            continue;
        }
        else
        {
            total++;
        }

        bool flag=true;
        for(int i=0; i<num; i++)
        {
            if(strcmp(Word[i].W,str1)==0)
            {
                Word[i].cnt++;
                flag=false;
                break;
            }
        }
        if(flag)
        {
            strcpy(Word[num].W,str1);
            Word[num].cnt=1;
            num++;
        }

    }

2.按照出现的频次对单词排序。

bool cmp(word a,word b)
{
    if(a.cnt>b.cnt)
        return true;
    return false;
}
sort(Word,Word+num,cmp);

3.对统计完的单词重定向输出,单词数量过大时,只输出前二十个。

    freopen("out.txt","a+",stdout);
    if(mode==2){
        printf("%s\n",strtemp);
        printf("\n");
    }

    if(num>20)
        num=20;
    printf("total %ld\n",total);
    for(int i=0; i<num; i++)
    {
        printf("%s %d\n",Word[i].W,Word[i].cnt);
    }

4.程序的main函数,控制文件名和目录名的输入。

int main(int argc, char *argv[])
{
    struct _finddata_t fa;
    long fHandle;
    /*printf("Mode:1为文件,2为文件夹.\n");
    printf("请选择模式:");
    scanf("%d",&mode);*/
    char string3[30];
    mode=1;
    int id;
    if(argc==2) {
        id=1;
        strcpy(string3,argv[1]);
        if(string3[1]==':')
            mode=2;
    }
    if(argc==3) id=2;
    if(argc==4) id=3;
    char string1[30];
    char string2[30];
    if(mode==1)
    {
        //printf("请输入文件名:");
        //scanf("%s",string1);
        strcpy(string1,argv[id]);
        int len=strlen(string1);
        strncpy(string2,&string1[len-4],4);
        string2[4]='\0';
        if(strcmp(string2,".txt")!=0){
            strcat(string1,".txt");
        }
        counter(string1);
    }
    else if(mode==2)
    {
        //printf("请输入文件夹的名字:");
        char fileN[30];
        strcpy(fileN,argv[1]);
        strcat(fileN,"\\*.txt");
        if((fHandle=_findfirst(fileN,&fa))==-1L)
        {
            printf("当前目录下没有txt文件\n");
        }
        do
        {
            counter(fa.name);
        }
        while(_findnext(fHandle,&fa)==0);
        _findclose(fHandle);
    }
    fclose(fp);
    return 0;
}

 

功能测试:

功能1  小文件输入。 

功能2 支持命令行输入英文作品的文件名。

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

功能4 实现重定向

PSP

PSP阶段 预计花费时间(min) 实际花费实际(min) 花费时间差距(min) 原因
功能1:小文件输入 52 74 22 读取字符串时,统计错误,修改程序逻辑比较花费时间。
功能2:支持命令行输入英文作品的文件名 17 58 41 只有英文名,不是*.txt文件,以前没接触过,查阅资料花费了一些时间。数组发生越界,调试时间过长。
功能3:支持命令行输入存储有英文作品文件的目录名,批量统计 13 36 23 读取目录名也没遇到过,处理起来不太顺畅,学习了好长时间相关博客
功能4:实现重定向 21 13 8 重定向向潘世维同学进行了请教,实现的较快。
posted @ 2018-09-24 13:05  王玉潘  阅读(195)  评论(0编辑  收藏  举报