函数readDat()是从文件in71.dat中读取20行数据存放到字符串数组xx中(每行字符串长度均小于80)。请编制函数JsSon(),其功能是:以行为单位对字符串按下面给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中。最后调用函数wri

admin2010-01-09  40

问题 函数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()和写函数writeDatO的内容。
   试题程序:
   #include<stdio.h>
   #include<string.h>
   #include<conio.h>
   char xx[20][80];
   void isSoYt()
   {
   }
   void main()
   {
      readDat();
      isSort();
      writeDat();
    {   
   readDat ( )
   {
      FILE *in;
      int i=0;
      char *p;
      in=fopen ("in71.dat", "r");
      while (i<20 && fgets(xx,80,in)!=NULL)
     {
           p=strchr (xx , ’\n’ );
            if (p)
                *p=0;
            i++;
     }
     fclose (in);
   }
   writeDat ()
   {
     FILE *out;
     int i;
     clrscr ();
     Out=fopen ("out71. dar ", "w");
     for (i=0; i<20; i++)
     {
          printf("%s\n",xx);
          fprintf {out, "%s\n", xx );
     }
      fclose (out);
}

选项

答案void jsSort () { iht i, j, k, strl,half; char ch; for(i=0;i<20;i++) { strl=strlen (xx[i] ); /*求各行字符串的总长度*/ half=strl/2; /*求总长度的一半*/ for (j=0; j <half-1; 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%2) /*如果原字符串长度为奇数,则跳最中间的字符,使之不参加排序*/ half++; for (j=half; j <strl-1; 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)字符的ASCII码的比较。
   (3)字符的排序。
   本题将数据按行存入到二维数组xx中,行数为数组的第1个下标,每行字符的个数为数组的第2个下标。因为以行为字符串处理的单位,所以要先求得一行字符串的长度。字符可以参加任何整数运算,实际上是字符的ASCII码参与了运算,所以町以直接使用比较运算符对字符进行比较。对从0到(长度/2-1)的字符进行降序排序(数组的下标从0开始)。若长度为奇数,则再从(长度/2+1)开始(跳过最中间的字符)到最后1个字符进行升序排列。否则,从(长度/2)开始到最后1个字符进行升序排列。字符排序使用“选择排序法”,最后使用循环实现对每行数据的处理。
转载请注明原文地址:https://jikaoti.com/ti/0Yp7FFFM
0

相关试题推荐
最新回复(0)