要求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();
- 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(),在此不做赘述