下列程序的功能是:将一正整数序列K1,K2,…,K9重新排成一个新的序列。新序列中,比K1小的数都在K1的左面(后续的再向左存放),比K1大的数都在K1的右面(后续的再向右存放),从K1向右扫描。要求编写函数jsValue()实现此功能,最后调用函数writeDat()把新序列输出到文件out72.dat中。
说明:在程序中已给出了10个序列,每个序列中有9个正整数,并存入数组a[10][9]中,分别求出这10个新序列。
注意:部分源程序已给出。
请勿改动主函数main()和写函数writeDat()的内容。
试题程序:
#include <stdio.h>
void writeDat();
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("out72.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);
参考答案:void jsValue(int a[10][9])
{
int i,j,k; /*定义循环控制变量*/
int num,temp; /*定义暂存变量*/
for(i=0;i<10;i + +) /*逐行取数进行处理*/
{
num=a[i][0]; /*暂存每行的第一个元素*/
for(j=0;j<9;j + +) /*取每行的所有元素*/
if(a[i][j]<num) /*若后面的数中有比第1个数据小的数*/
{
temp=a[i][j]; /*则把这个数取出,赋给temp*/
for(k=j;k>0;k - -) /*将这个数据左侧的数依次向右移动*/
a[i][k]=a[i][k-1];
a[i][0]=temp; /*再将这个数放在最左侧*/
}
}
}
解析: 本题考查的是如何通过双重循环实现对二维数组的访问。
数据存放在一个二维数组中,以行为数据处理的基本单位。将第1个数取出依次同后面的数进行比较,若后面的数中有比第1个数据小的数,则将这个数取出。将这个数据左侧的数依次向右移动(包括第1个数),然后将这个数放在最左侧。扫描完一行后,比第1个数小的数就都在第1个数的左侧,而比它大的就在它的右侧。