早教吧 育儿知识 作业答案 考试题库 百科 知识分享
早教吧考试题库频道 --> 计算机类考试 -->计算机三级 -->

下列程序的功能是:将一个正整数序列{K1, K2,…, K9}重新排列成一个新的序列。在新序列中,比K1小的

题目

下列程序的功能是:将一个正整数序列{K1, K2,…, K9}重新排列成一个新的序列。在新序列中,比K1小的数都在K1的前面(左面),比K1大的数都在K1的后面(右面)。要求编写函数jsValue()实现以上功能,最后调用函数writeDat(),将新序列输出到文件out.dat中。说明:程序中已给出了10个序列,每个序列中有9个正整数,并存入数组a[10][9] 中,分别求出这10个新序列。例如:序列{6, 8, 9, 1, 2, 5, 4, 7, 3}重排后为{3, 4, 5, 2, 1, 6, 8, 9, 7}。部分源程序已给出。请勿改动主函数main() 和写函数writeDat() 的内容。#include<stdio.h>void jsValue(int a[10][9]){ } void main(){ int a[10][9]={{6,8,9,1,2,5,4,7,3} {3,5,8,9,1,2,6,4,7} {8,2,1,9,3,5,4,6,7} {3,5,1,2,9,8,6,7,4} {4,7,8,9,1,2,5,3,6} {4,7,3,5,1,2,6,8,9} {9,1,3,5,8,6,2,4,7} {2,6,1,9,8,3,5,7,4} {5,3,7,9,1,8,2,6,4} {7,1,3,2,5,8,9,4,6} }; int i,j; jsValue(a); for(i=0;i<10;i++){ for(j=0;j<9;j++) { printf("%d",a[i][j]); if(j<=7) printf(","); } printf("\n");}writeDat(a);}void writeDat(int a[10][9]){ FILE *fp; int i,j; fp=fopen("out.dat","w"); for(i=0;i<10;i++){ for(j=0;j<9;j++){ fprintf(fp,"%d",a[i][j]); if(j<=7) fprintf(fp,","); } fprintf(fp,"\n");} fclose(fp);}

参考答案
正确答案:参考试题解析
【解析及答案】
本题的任务是把排序函数jsValue() 补充完整。本题的处理过程是对数组a[10][9] 中的每行数据分别处理,然后再放置到原来的数组a[10][9] 中。求解时需要使用一个[10][9] 的临时数组b存放处理时的中间结果。数组a处理完以后,就用数组b的内容代替数组a的内容。对每行数据进行处理时,首先需要准备两个指示器nk,分别指向数组b中该行的开头和结尾。然后,反向扫描数组a中对应的行。如果碰到比该行第1个数据值大的元素,就将其放到指示器k指向的位置;如果碰到比其数据值小的元素,就将其放到指示器n指向的位置。处理完以后,还要移动指示器nk,使其定位在新的位置,以接收后面的数据。如果碰到和其数据值相等的元素,由题意可知,这样的元素在新数组中只允许出现1次,所以直接把这个元素放到指示器nk指向的位置即可,但不必移动指示器,否则该元素有可能出现多次。综上所述,完整的排序函数jsValue() 如下。
jsvalue(int a[10][9])
{
  int i,j,k,n,temp;
  int b[9]=0;
   for(i=0;i<10;i++)

    temp=a[i][0];
     k=8; 
    n=0;
    for(j=8,j>=0;j--)     
{    
      if(temp          b[k--]=a[i][j];
      if(temp>a[i][j])  
          b[n++]=a[i][j];
      if(temp==a[i][j])  
          b[n]=temp;     /*也可以b[k]=a[i][j];*/
}
    for(j=0;j<9;j++)
  {
      a[i][j]=b[j];
      b[j]=0;}
  }
}