• 第1次作业


    要求0:作业地址:https://edu.cnblogs.com/campus/nenu/2016CS/homework/2110

    要求1:Git仓库地址:https://coding.net/u/liyz342/p/wf/git

    要求2:PSP表格(实践简单不涉及需求)

    功能 function1 function2 function3
    时间/小时 2 2 2

    要求3:

    ##在拿到题目后我很轻易的就想到了该项目应该如何实现:

    • 写三个函数func,funf,funn用来实现三个相应功能;
    • 在主函数中输入字符串c[30]如“wf -c input.txt”截取其中片段来操作

    到这里,我的主函数已经在我脑中成型了:

    int main()
    {
        char c[30];
        while(scanf("%s",c)!=EOF)
        {
            int i;
            char filename[20];
    
    
            if(c[4]=='c'||c[4]=='f')
            {
                for(i=6;(c[i]!=' '&&c[i]!='
    ');i++)
                filename[i-6]=c[i];
                createtx(filename);
                for(i=0;i<1000;i++)
                     strcpy(med[i],tx[i]);
                SortMed();
                
                if(c[4]=='c')func();
                if(c[4]=='f')funf();
            }
            if(c[4]=='n')funn(c);
        }
        return 0;
    }

    然后就是对三个函数进行编写了,其中实现功能一的func()与实现功能二的funf()及其相似,funf()也能实现func()的功能,因此在这里写funf();

    1. funf()实现"wf -f input.txt"功能

    在这之前,我们需要对数据进行处理,得到文件里的原始数据并进行清洗,得到只含有单词而五其他字符的数据,函数createtx的构建过程如下

    • 利用fopen获取文件首地址,得到包含符号、空格的原始数据
    • 利用二维char数组tx[1000][20]存放清洗后的次原始数据
    void createtx(char *file)
    {
        int i,j=0,q=0;
        char word[20],p;
        FILE *fp;
        fp=fopen(file,"r");
        char* ch=(char*)fp;
    
        for(i=0;i<1000;i++)
            {
                p=ch[i];
                if(p>'a'&&p<'z')
                    word[j++]=p;
                else if(p>'A'&&p<'Z')
                    word[j++]=p+32;
                else
                {
                    strcpy(tx[q++],word);
                    j=0;
                }
            }
        //printf("createtx is OK
    ");
    }

    但是想要实现funf的功能必须得到一个字典序排序的数组,为此利用数组med拷贝tx中的全部内容,构建函数SortMed对med排序

    void SortMed()
    {
        int i,j;
        char t[20];
        for(i=0;i<1000;i++)
            for(j=i;j<1000;j++)
                if(strcmp(med[i],med[j])>0)
                {
                    strcpy(t,med[i]);
                    strcpy(med[i],med[j]);
                    strcpy(med[j],t);
                }
        //printf("SortMed is OK
    ");
    }

    到此,准备工作已经全部完成,我们可以开始编写funf()了!!

    • 利用int数组lin[1000]计数
    • 输出时输出lin[i]非0位置的数值lin[i]与对应位置单词med[i]
    void funf()
    {
        int lin[1000];
        memset(lin,0,sizeof(lin));
        char t[20];
        strcpy(t,med[0]);
        int i,j=0;
        for(i=0;i<1000;i++)
            if(strcmp(med[i],t)==0)lin[j]++;
        else
        {
            j=i;
            strcpy(t,med[i]);
            lin[j]=1;
        }
        printf("total  %d words
    ",sumlin(lin));
        for(i=0;i<1000;i++)
            if(lin[i]>0)printf("%s  %d
    ",med[i],lin[i]);
        //printf("funf is OK");
    
    }

        2.funn()实现“wf -n 数量 -c input.txt ”

    由于方法三形式多样较为复杂,因此这里只采用一种形式实现,即“wf -n 数量 -c input.txt”,但是当文件名到末尾了,因此我们要对main函数进行修改

    int main()
    {
        char c[30];
        while(scanf("%s",c)!=EOF)
        {
            int i;
            char filename[20];
    
    
            if(c[4]=='c'||c[4]=='f')
            {
                for(i=6;(c[i]!=' '&&c[i]!='
    ');i++)
                filename[i-6]=c[i];
                createtx(filename);
                for(i=0;i<1000;i++)
                     strcpy(med[i],tx[i]);
                SortMed();
    
                if(c[4]=='c')func();
                if(c[4]=='f')funf();
            }
            if(c[4]=='n')
            {
                int j=0;
                for(i=strlen(c);(c[i]!=' ');i--)
                filename[20-(j++)]=c[i];
                createtx(filename);
                for(i=0;i<1000;i++)
                     strcpy(med[i],tx[i]);
                SortMed();
            }
        }
        return 0;
    }

    然后,funn的构建思路如下

    • 其他方法同funf(),增加数组no[1000],no[i]=i,记录lin[]中的数从大到小的次序
    • 增加int n,表示输出次数
    void funn(char* ch)
    {
        int i,j=0;
        char nu[10];
        for(i=0;i<strlen(ch);i++)
            if(ch[i]>'0'&&ch[i]<'9')
            nu[j++]=ch[i];
        int n=atoi(nu);
    
        int lin[1000];
        memset(lin,0,sizeof(lin));
        char t[20];
        strcpy(t,med[0]);
        j=0;
        for(i=0;i<1000;i++)
            if(strcmp(med[i],t)==0)lin[j]++;
        else
        {
            j=i;
            strcpy(t,med[i]);
            lin[j]=1;
        }
    
        int no[1000],temp;
            for(i=0;i<1000;i++)
                no[i]=i;
            for(i=0;i<1000;i++)
                for(j=i+1;j<1000;j++)
                if(lin[i]<lin[j])
            {
                temp=no[i];
                no[i]=no[j];
                no[j]=temp;
            }
        printf("Total words is %d
    ",sumlin(lin));
    
        while(n)
        {
            int m=n;
            printf("%s  %d
    ",med[no[m-n]],lin[no[m-n]]);
            n-=1;
        }
        //printf("funn is OK");
    }

          3.func()实现“wf -c input.txt”

    方法同funf(),在此不做赘述

  • 相关阅读:
    vue cli3使用官方方法配置sass全局变量报错ValidationError: Invalid options object. Sass Loader has been initialised using an options object that does not match the API schema.
    面试必备:HashMap、Hashtable、ConcurrentHashMap的原理与区别
    Lombok介绍、使用方法和总结
    位运算
    【ZooKeeper系列】3.ZooKeeper源码环境搭建
    【ZooKeeper系列】2.用Java实现ZooKeeper API的调用
    【ZooKeeper系列】1.ZooKeeper单机版、伪集群和集群环境搭建
    弄明白CMS和G1,就靠这一篇了
    面试官,不要再问我三次握手和四次挥手
    【面试必备】小伙伴栽在了JVM的内存分配策略。。。
  • 原文地址:https://www.cnblogs.com/liyz342/p/9682440.html
Copyright © 2020-2023  润新知