应用题
1. 函数reaaDat()是从文件in.dat中读取20行数据存放到字符串数组xx中(每行字符串长度均小于80)。请编制函数jsSort(),其函数的功能是:以行为单位对字符串按下面给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件out.dat中。
条件:字符串从中间一分为二,左边部分按字符的ASCII值升序排序,右边部分不变,左边经排序后再与右边部分进行交换。如果原字符串长度为奇数,则最中间的字符不参加处理,字符仍放在原位置上。
例如:位置 0 1 2 3 4 5 6 7 8
源字符串 d c b a h g f e
4 3 2 1 9 8 7 6 5
则处理后字符串 h g f e a b c d
8 7 6 5 9 1 2 3 4
请勿改动数据文件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("%s\n", xx[i]);
fprintf(out, "%s\n", xx[i]);
}
fclose (out);
}
【正确答案】char ch, str[80];
int i, j, k, len, p;
for(i=0; i<20; i++)
{
len= (int) 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)
{
strcpy(str, xx[i] +p+1);
strncat(str, xx[i] +p, i);
strncat(str, xx[i], p);
}
else
{
strcpy(str, xx[i] +p);
strncat(str, xx[i], p);
}
strcpy(xx[i], str);
}
【答案解析】 以行为单位从字符串左边部分升序排序,排序后左边部分与右边部分进行交换。如果原字符串长度为奇数,则最中间的字符不参加处理。
通过审题可以发现主要是对字符串左边部分排序时所采用的排序方式不同,参考答案的第11行,修改if条件语句的设置即可。