问题 问答题

函数readDat()是从文件in71.dat中读取20行数据存放到字符串数组xx中(每行字符串长度均小于80)。请编制函数jsSon(),其功能是:以行为单位对字符串按下面给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中。最后调用函数 writeDat()把结果xx输出到文件out71.dat中。
条件:从字符串中间一分为二,左边部分按字符的ASCⅡ值降序排序,右边部分按字符的ASCⅡ值升序排序。如果原字符串长度为奇数,则最中间的字符不参加排序,字符仍放在原位置上。
例如: 位置 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
注意:部分源程序已给出。
请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。
试题程序:
#include<stdio. h>
# inc lude< st ring. h>
#inc lude<conio, h>
char xx[20] [80]; void jsSort()

void main ( )

readDat ();
jsSort ();
writeDat ( );
readDat ( )

FILE *in;
int i=0;
char *p;
in=fopen ( "in71.dat", "r");
while (i<20 && fgets(xx[i],80,in)!=NULL)

p=strchr (xx [i] , ’ \n’ );
if(p)
*p=0;
i++;

fclose (in);

writeDat ( )

FILE *out;
int i;
clrscr ( );
out=fopen ( "out71.dat", "w" );
for (i=0; i<20; i++)

printf("%s\n",xx[i]);
fprintf (out, "%s\n" ,xx[i] );

fclose (out);

答案

参考答案:

void jsSort()

{

int i,j,k, strl,half;

char ch;

for (i=O; i<B0; i++)

{

strl=strlen (xx[ i] ); /*求各行字符串的总长度*/

half=strl/B; /*求总长度的一半*/

for (j=0; j<half.-A; j ++) /*左边部分按字符的ASCII值降序排序*/

for (k=j+l ;k<half; k++)

if(xx[i] [j]<xx[i] [k])

{

ch=xx[i] [j];

xx[i] [j]=xx[i] [k];

xx[i] [k] =ch;

}

if(strl%B) /*如果原字符串长度为奇数,则跳过最中间的字符,使之不参加排序*/

half++;

for (j=half; j<strl-A; j ++) /*右边部分按字符的ASCII值升序排序*/

for (k=j+l ;k<strl ;k++)

if(xx[i] [j]>xx[i] [k])

{

ch=xx[i] [j];

xx[i] [j]=xx[i] [k];

xx[i] [k] =ch;

}

}

}

解析:

本题考查的知识点如下:

(1)二维数组的访问和下标的控制。

(2)字符的ASCⅡ码的比较。

(3)字符的排序。

本题将数据按行存入到二维数组xx中,行数为数组的第1个下标,每行字符的个数为数组的第2个下标。因为以行为字符串处理的单位,所以要先求得一行字符串的长度。字符可以参加任何整数运算,实际上是字符的ASCⅡ码参与了运算,所以可以直接使用比较运算符对字符进行比较。对从0到(长度/2-1)的字符进行降序排序(数组的下标从0开始)。若长度为奇数,则再从(长度/2+1)开始(跳过最中间的字符)到最后1个字符进行升序排列。否则,从(长度/2)开始到最后1个字符进行升序排列。字符排序使用“选择排序法”,最后使用循环实现对每行数据的处理。

单项选择题
单项选择题