应用题
1. 函数readDat()是从文件in.dat中读取20行数据存放到字符串数组xx中(每行字符串长度均小于80)。请编制函数jsSort(),其函数的功能是:以行为单位对字符串按下面给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件out.dat中。
条件:字符串从中间一分为二,左边部分按字符的ASCII值降序排序,右边部分按字符的ASCII值升序排序。如果原字符串长度为奇数,则最中间的字符不参加排序,字符仍放在原位置上。
例如:位置 0 1 2 3 4 5 6 7 8
源字符串 a b c d h g f e
1 2 3 4 9 8 7 6 5
则处理后字符串 d c b a e f g h
4 3 2 1 9 5 6 7 8
请勿改动数据文件in.dat中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
#include <string.h>
void readDat();
void writeDat();
char xx[20] [80];
void jsSort()
{
}
void main()
{
readDat ();
jsSort ();
writeDat ();
}
/*从文件in.dat中读取20行数据存放到字符串数组xx中*/
void readDat()
{
FILE *in;
int i=0;
char *p;
in=fopen("in.dat", "r");
while(i<20 && fgets(xx[i], 80, in) != NULL)
{
p=strchr(xx[i], '\n');
if(p) *p=0;
i++;
}
fclose(in);
}
/*把结果xx输出到文件out.dat中*/
void writeDat()
{
FILE *out;
int i;
out=fopen("out.dat", "w");
for(i=0; i<20; i++)
{
printf("%skn", xx[i]);
fprintf(out, "%s\n", xx[i]);
}
fclose (out);
}
【正确答案】char ch;
int i, j, k, len, p;
for(i=0; i<20; i++)
{
len= (Ant) strlen(xx[i]);
p=len / 2;
/*对文章第i行左半部分的字符串进行降序排列*/
for(j=0; j<(p-l); j++)
{
for(k=j+i; k<p; 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;
}
}
}
if(len % 2) p++; //如果文章第i行的长度为奇数,则其中间字符不参与排序
/*对文章第i行左半部分的字符串进行升序排列*/
for(j=p; j< (len-l); j++)
{
for(k=j+i; k<len; 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和表示字符串长度的变量len、p。
②在第一层for循环中,变量i从0开始,依次递增直到其值等于20,在循环体中,首先调用库函数strlen(xx[i])求得字符串xx[i]的长度,把此值转化成整型赋给变量len,用len的值除以2,得到字符串xx[i]的长度的一半赋给变量p;在第二层for循环中,变量j从0开始,依次递增直到其值等于(p-1),在循环体中执行第三层for循环,循环变量k从j+1开始,依次递增直到其值等于p,对字符串xx[i]左半部分的子字符串中的字符xx[i][j]和xx[i][k]按照ASCII码值的大小进行比较,如果xx[i][j]的ASCII码值小于xx[i][k]的ASCII码值,则两者进行互换,实现对字符串xx[i]左半部分的子字符串按照降序排列。然后,有if条件语句判断,len对2的余数是否等于1,如果等于1,说明字符串xx[i]的长度为奇数,则变量p加1,因为这时字符串的中间字符不参与排序。再对字符串xx[i][j]右半部分的字符串按升序排列。在for循环中,变量j从p开始,依次递增直到其值等于len-1,在循环体中,执行for循环中,变量k从j+1开始,依次递增直到其值等于。len,对字符xx[i][j]和xx[i][k]按其ASCII码值的大小进行比较,如果字符xx[i][j]的ASCII码值大于xx[i][k]的ASCII码值,则两者进行互换,实现字符串xx[i]右半部分的字符串按照升序排列。