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