问答题
函数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
处理后 d c b a e f g h
注意:请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。
【试题程序】
#include < stdio.h >
#include < string.h >
#include < stdlib.h >
char xx[20][80];
void readDat();
void writeDat();
void jsSort()
{
}
void main()
{
readDat();
jsSort();
writeDat();
}
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) ;
}
void writeDat ()
{
FILE * out;
int i ;
system ("CLS") ;
out = fopen ( "OUT. 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; /*定义循环控制变量*/
int str,half; /*定义存储字符串长度的变量*/
char temp; /*定义数据交换时的暂存变量*/
for(i=0;i<20;i++) /*逐行对数据进行处理*/
{
str=strlen(xx[i]); /*求各行字符串的总长度*/
half=str/2; /*求总长度的一半*/
for(j=0;j<half-1;j++) /*左边部分按字符的ASCII值降序排序*/
for(k=j+1;k<half;k++)
if(xx[i][j]<xx[i][k])
{
temp=xx[i][j];
xx[i][j]=xx[i][k];
xx[i][k]=temp;
}
if(str%2==1) /*如果原字符串长度为奇数,则跳过最中间的字符,使之不参加排序*/
half++;
for(j=half;j<str-1;j++) /*右边部分按字符的ASCII值升序排序*/
for(k=j+1;k<str;k++)
if(xx[i][j]>xx[i][k])
{
temp=xx[i][j];
xx[i][j]=xx[i][k];
xx[i][k]=temp;
}
}
}
[考点] 本题是对字符的排序问题。考查的知识点主要包括:字符串元素的遍历访问,逻辑表达式,数组排序算法。
[解析] 此题属于字符排序题型;分析题干要求需主要解决2个问题:问题1如何实现从字符串中间一分为二,并将左边部分按字符的ASCII值降序排序;问题2如何按照要求将字符串的右边部分按照升序排列。
接着分析具体的解决方法,首先用字符串处理函数strlen获得字符串的长度,进而求得该长度的二分之一,并由其实现对字符串左右两半部分元素的访问,排序可以使用起泡法实现。