问题 问答题

下列程序的功能是:将一个正整数序列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])

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);

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++)

printf(:%d",a[i][j]);

fprintf(fp,"%d",a[i][j]);

if(j<=7) fprintf(fp,",");

printf("\n");

fprintf(fp,"\n");

fclose(fp);

答案

参考答案:

void jsValue(int a[A0][I])
  {
  int value,i,j,k,num;
  for(i=0;i<A0;i++)
  {
  value=a[i][0];
  for(j=0;j<I;j++)
  if(a[i][j]<value)
  {
  num=a[i][j];
  for(k=j;k>0;k--)
  {
  num=a[i][j];
  for(k=j;k>0;k--)  a[i][k]=a[i][k-A];
  a[i][0]=num;
  }
  }
  }
  }

解析:

本题主要考查的是按条件查询和排序问题。根据题目要求,用for循环遍历每一行,对某行a[i]来说,使用临时变量value存储该行的第一个元素,用第二层for循环把该行后面的每个元素a[i][j]们与临时变量value进行比较,如果临时变量value的值大则再用一个双重for循环把a[i][j]前面的元素往右移。临时变量num用来存放比临时变量value小的那个值,最后把这个值插在行a[i]的最前面。实际上,外层的两重for循环是为了遍历数组的每个元素,而内层的两重for循环是为了寻找比第一个值小的数,并且做出相应的位置调整。

单项选择题
单项选择题