之前去过杭州信雅达面试,有一个C上机编程题:
二维数组
a[5][5]={44,33,67,42,37,23,21,38,45,3,2,3,4,65,45,4,3,4,4,77,42,34,66,8,45}
给出另一个二维数组b,用a中的元素填充b。并把b数组打印出来。
条件:b[i][j]等于a[i][j]周围的全部元素按升序排列以后中间的那个数。例如a[0][0]周围有三个元素33,21,23升序21,23,33此时b[0][0]=23,中间值为Index=len/2。
我的想法是,将a[i][j]周围的全部元素先保存到一个一位数组中,然后对这个一位数组排序,一位数组的排序中间值就是b[i][j]。很惭愧,编码目前还不是我的强项,可能下面的代码水平太烂,还有优化的空间,请各位看官赐教。
#include
int main(void)
{
int a[5][5]={44,33,67,42,37,23,21,38,45,3,2,3,4,65,45,4,3,4,4,77,42,34,66,8,45};
int b[5][5]={0}; /*最终输出数组*/
int c[8]={0}; /*存放每个元素周围的元素*/
int m,n,i,j;
int len; /*c[8]的实际长度*/
int temp=0;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
/* 二维数组a附近包围的几个(3个、5个或8个)元素提取出来存到c数组中 */
len=0;
for(m=i-1;m<=i+1;m++)
{ if((m<0)||(m>4))
continue;
for(n=j-1;n<=j+1;n++)
{
if((n<0)||(n>4))
continue;
if((m==i)&&(n==j))
{
continue;
}
else
{ if((m>=0)&&(m<=4)&&(n>=0)&&(n<=4))
{
c[len]=a[m][n];
len++;
}
}
}
}
/*冒泡排序(升序)数组*/
for(m=0;m
{
for(n=0;n
{
if(c[n]>c[n+1])
{
temp=c[n];
c[n]=c[n+1];
c[n+1]=temp;
}
}
}
b[i][j]=c[len/2];
}
}
/* 打印二维数组b */
m=0;
for(i=0;i<=4;i++)
{
for(j=0;j<=4;j++)
{
m++;
printf("%2d ",b[i][j]);
if((m%5)==0) printf("\n");
}
}
return 0;
}
阅读(5177) | 评论(0) | 转发(1) |