18题 下列程序的功能是:将一正整数序列{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>
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++){
fprintf(fp,"%d",a[i][j]);
if(j<=7)fprintf(fp,",");
}
fprintf(fp,"\n");
}
fclose(fp);
}
注:该题的算法是:从数列的最后一个数开始往前逐一移动直到完,在移动过程中与K1
进行比较,如有大小或等于K1的则进行调换。调换的方式是,第一次调换的数与原最后
一个数换,第二次调换的数与原倒数第二个数换,依次类推。
jsvalue(int a[10][9])
{
int value,i,j,k;
for(i=0;i<10;i++)
for(j=8,k=8;j>=0;j--)
if(a[i][j]>=a[i][0])
{value=a[i][k];
a[i][k--]=a[i][j];
a[i][j]=value;
}
}
/*我的思路是:将每组从最后往前倒序逐个同第一个数比较,比它大的就放到临时数组b中的最后,比它小的就
放到临时数组b中的最前面,以次类推.最后将b数组赋给a数组*/
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;}
}
}