问题 问答题

请编制一个函数arrange(int inBuf[10][9]),其功能是:将一正整数序列K[1],K[2],…,K[9]重新排成一个新的序列。新序列中,比K[1]小的数都在K[1]的左面(后续的再向左存放),比K[1]大的数都在K[1]的右面(后续的再向右存放),从K[1]向右扫描。函数WriteData()负责将outBuf[]中的数据输出到文件OUT.DAT中。
说明:在程序中已给出了10个序列,每个序列中有9个正整数,并存入数组inBufE10][9]中,分别求出这10个新序列。
例如:序列排序前3,5,8,9,1,2,6,4,7
序列排序后2,1,3,5,8,9,6,4,7
注意:部分源程序已给出。
请勿改动主函数main()和写函数WriteData()的内容。

试题程序:


#include<stdio.h>
void writeData();
int inBuf[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,

void arrangeValue()


void main()

int i,j;
arrangeValue();
for(i=0;i<10;i++)

for(i=0;i<9;i++)

printf(”%d”,inBuf[i][j]);
if(j<=7)printf(",");

printf("n");

writeData();

void writeData()

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",inBuf[i][j]);
if(j<=7)fprintf(fp,",");

fprintf(fp,"\n");

fclose(fp);

答案

参考答案:<davoid arrangeValue()
{
int i,j,temp[9],num_low,num_high;
for(i+0;i<10;i++) //对10行数据进行扫描
{
num_low=0,num_high=8;
for(j=8;j>=0;j——)//从最后一列向前扫描
{
if(inBuf[i][j]>inBuf[i][0])//如果当前数据比首位数据大
{
temp[num_high]=inBuf[i][j];//将当前数据放到temp中的第num_high位
num_high—; //将存放比首位数据大的数据的下标前移,以指定下次存放的位置
}
else
{
temp[num_low]=inBuf[i][j];//将当前数据放到temp中的第num_low位
hum_low++; //将存放比首位数据小的数据的下标后移,以指定下次存放的位置
}
}
temp[num_high]=inBuf[i][0]; //将最后留下的位置上存放原数组的首位数据
for(j=0;j<9;j++)
inBuf[i][j]=tempi[j];//将temp中的内容复制到inBuf中
}
}

解析: 本题主要考查数组中数据按指定要求重新排序的方法。
从左边开始扫描时,不管是比第一个大的还是小的,都以第一个元素所在的位置来确定起始位置,由于第一个元素的位置不确定,所以比第一个元素大的和小的元素的起始存放位置也不能确定。若从右侧开始扫描,则比第一个元素大的和小的元素的起始存放位置是数组的两侧,起始位置固定。
程序步骤:①从右侧开始查找,如果当前元素比第一个元素大,则从数组temp的右侧起存放,反之,则从数组temp的左侧起存放,最后将第一个元素存放在剩下的位置;②将temp中的值赋给数组inBuf。
>

单项选择题
单项选择题