天天看点

第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

要求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]!='\n');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\n");
}      

但是想要实现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\n");
}      

到此,准备工作已经全部完成,我们可以开始编写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\n",sumlin(lin));
    for(i=0;i<1000;i++)
        if(lin[i]>0)printf("%s  %d\n",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]!='\n');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\n",sumlin(lin));

    while(n)
    {
        int m=n;
        printf("%s  %d\n",med[no[m-n]],lin[no[m-n]]);
        n-=1;
    }
    //printf("funn is OK");
}      

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

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