问答题 函数readDat()是从文件in.dat中读取20行数据存放到字符串数组xx中(每行字符串长度均小于80)。请编制函数jsSort(),其函数的功能是:以行为单位对字符串按下面给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果XX输出到文件out.dat中。
条件:字符串从中间一分为二,左边部分按字符的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
则处理后字符串 h g f e d c b a
8 7 6 5 9 4 3 2 1
请勿改动数据文件in.dat中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
#include <string.h>
char xx[20] [80];
void readDat();
void writeDat();
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]); //计算文章第i行的长度
p=len / 2; //把文章第i行的长度的一半赋给变量p
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] =xz[i] [j];
xx[i] [j] =ch;
}
}
}
if(len % 2) //如果文章第i行的字符串的长度为奇数
{
strcpy(str, xx[i]+p+i); //把字符串的右半部分复制到字符数组str中
strncat(str, xx[i]+p, 1); //把字符串的中间字符连接到右半部分的后面
strncat (str, xx[i], p); //把字符串的左半部分连接到字符数组str中
}
else //如果文章第i行的字符串的长度为偶数
{
strcpy(str, xx[i] +p); //把字符串的右半部分复制到字符数组str中
strncat (str, xx [i] , p); //把字符串左半部分连接到右半部分的后面
}
strcpy(xx[i] , str); //把字符串左右部分互转后的结果字符串拷贝给字符数组xx[i]
} [解析] 以行为单位从字符串左边部分降序排序,排序后左边部分与右边部分进行交换。如果原字符串长度为奇数,则最中间的字符不参加处理。
①定义循环变量i、j、k和整型变量len、p。
②第一层for循环中,循环变量i从0开始,依次递增直到其值等于20,实现对20行数据的逐行处理。在循环体中,对于i行首先调用函数strlen(xx[i])求得第i行字符串的长度,并把其值赋给变量len,再用len除以2,得到第i行字符串长度的一半,赋给变量p。在第二层for循环中,循环变量j从0开始,依次递过来增直到其值等于(p-1),在第三层for循环中,循环变量k从j+1开始,依次递过来增直到其值等于p,比较字符xx[i][j]ASCII码值与xx[i][k]ASCII码值的大小,如果字符xx[i][j]的ASCII码值小于xx[i][k]的ASCII码值,则两者进行互换实现对第i行字符串左半部分的字符串按降序排列。
③用变量len的值对2求余数,如果余数为1,则调用函数字符串拷贝函数strcpy(),把从字符串xx[i]+p+1开始直到字符串xx[i]的结尾的子字符拷贝到字符串变量str中,再调用字符串连接函数strncat()把字符串xx[i]的中间字符连接到字符串变量str的后面,再调用字符串连接函数strncat()把符串xx[i]的左半部分的子字符串连接到变量str的后面:如果余数不等于1,则调用字符串拷贝函数strcpy(),把从字符串xx[i]+p开始直到字符串xx[i]的结尾的子字符拷贝到字符串变量str中,再调用字符串连接函数strncat()把字符串xx[i]的左半部分的子字符串连接到变量str的后面,实现字符串xx[i]左右部分子字符串的交换。
④调用字符串拷贝函数strcpy(),把字符串变量str的值拷贝到字符串xx[i],实现把排序后的结果仍按行重新存入字符串数组xx中。