第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]!='\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();
- 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(),在此不做赘述