问答题
函数ReadDat()实现从文件in.dat中读取一篇英文文章存入到字符串数组xx中;请编制函数SortCharD(),其函数的功能是:以行为单位对字符按ASCII码从大到小的顺序进行排序,排序后的结果仍按行重新存入字符串数组xx中。最后main()函数调用函数WriteDat()把结果xx输出到文件out.dat中。
例:原文:dAe,BfC.
CCbbAA
结果:fedCBA.,
bbCCAA
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
#include <stdio.h>
#include <string.h>
char xx[50] [80];
unsigned int maxline=0; /*文章的总行数*/
int ReadDat(void);
void WriteDat(void);
void SortCharD(void)
{
}
void main(
{
if (ReadDat ())
{
printf ("数据文件in.dat不能打开! \n\007");
return;
}
SortCharD ();
WriteDat ();
}
/*从文件in.dat中读取一篇英文文章存入到字符串数组xx中*/
int ReadDat(void)
{
FILE *fp;
int i=0;
char *p;
if((fp= fopen ( "in.dat", "r"))==NULL)
return 1; //如果文件in.dat内容为空,则返回1
/*当从文件in.dat中读取79个字符存入xx[i]没有错误发生时,执行循环体中的语句*/
while(fgets(xx[i],80,fp) != NULL)
{
p=strchr(xx[i], "\n"); //在字符串xx[i]中查找回车换行符第一个匹配的位置
if(p) *p=0; //如果p的值不为零,则把其值设置为0
i++; //行变量加1
}
maxline=i; //把文章的总行数赋给变量maxline
fclose(fp);
return 0;
}
/*把结果xx输出到文件out.dat中*/
void WriteDat(void)
{
FILE *fp;
unsigned int i;
fp=fopen("out.dat", "w");
for(i=0; i<maxline; i++)
{
printf("%s\n", xx[i]);
fprintf(fp, "%s\n", xx[i]);
}
fclose (fp);
}
【正确答案】
【答案解析】char ch;
unsigned int i,j,k;
/*以行为单位对字符按ASCII码从大到小的顺序进行排序*/
for(i=0; i<maxline; i++)
{
for(j=0; j<strlen(xx[i]); j++)
{
for(k=j; k<strlen(xx[i]); k++)
{
/*如果字符xx[i][j]的ASCII码值小于xx[i][k]的ASCII码值,则两者进行互换*/
if(xx[i][j] <xx[i][k])
{
ch=xx[i][k];
xx[i][k]=xx[i][j];
xx[i][j]=ch;
}
}
}
}
[解析] 以行为单位对字符按从大到小排序,结果仍按行重新存入字符串数组中。
①首先定义字符变量ch和无符号整型变量i、j、k。
②对字符二维数组xx,在第一层for循环中,变量i从0开始,依次递增直到其值等于maxline,实现对文章每行的扫描,在第二层for循环中,变量j从0开始,依次递增直到其值等于strlen(xx[i]),即第i行的长度。在第三层循环语句中,变量k从j开始,依次递增直到其值等于strlen(xx[i]),对每一行中的数组元素xx[i][j]、xx[i][k]按照它们的ASCII码值的大小进行比较,如果xx[i][j]的ASCII码小于xx[i][k]的ASCII码,则两者交换,实现整篇文章中的字符按ASCII码值从大到小的顺序进行排序。