应用题 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]右半部分的字符串按照升序排列。