【正确答案】
【答案解析】常规的可以通过两层for循环嵌套来进行二维数组的输出,设二维数组array[MAXX][MAXY],其中MAXX表示的是二维数组的行数,MAXY表示的是二维数组的列数,程序代码如下:
#include<stdio.h>
#define MAXX 2
#define MAXY 3
void printArray()
{
int array[MAXX][MAXY]={1,2,3,4,5,6};
for(int i=0;i<MAXX;i++)
for(int j=0;j<MAXY;j++)
{
printf("%d/n",array[i][j]);
}
}
int main()
{
printArray();
return 0;
}
而题目要求是只使用一次for循环,此时就需要明白二维数组在内存中是按照行存储的还是列存储的了(默认情况是行存储的),所以可以将数组array看成一个一维数组,i标识该数组在一维数组中的位置,则array在二维数组中的行号和列号分别[i/MAXY]、[i%MAXY]。具体实现代码如下:
#include<stdio.h>
#define MAXX 2
#define MAXY 3
void printArray()
{
int array[MAXX][MAXY]={1,2,3,4,5,6);
for(int i=0;i<MAXX*MAXY;i++)
{
printf("%d/n",array[i/MAXY][i%MAXY]);
}
}
int main()
{
printArray();
return 0;
}
再例如,对于一个三维数组而言,也可以采用类似的方法实现。程序示例代码如下:
#include<stdio.h>
int main()
{
int a[2][2][3]:{{{1,6,3},{5,4,15}},{{3,5,33},{23,12,7}}};
for(int i=0;i<12;i++)
printf("%d",a[i/6][(i/3)%2][i%3]);
printf("/n");
return 0;
}
程序输出结果:
1 6 3 5 4 15 3 5 33 23 12 7
上例中,需要考虑的是,数组中每一维数字的取值顺序问题。由于该数组为多维数组,第一维,前6次循环都取0,后6次取1,于是i/6可以满足要求;第二维,前3次为0,再3次为1,再3次为0,再3次为1,用量化的思想,i/3把12个数字分为4组,每组3个,量化为0、1、2、3,为了要得到0、1、0、1,这里就需要对(0、1、2、3)%2=(0、1、0、1),于是(i/3)%2;最后一维需要的是(0、1、2;0、1、2;0、1、2;0、1、2;),即i%3。