二维数组在概念上是二维的,但在内存中是连续存放的;换句话说,二维数组的各个元素是相互挨着的,彼此之间没有缝隙。那么,如何在线性内存中存放二维数组呢?有两种方式:
按行排列, 即放完一行之后再放入第二行;
按列排列, 即放完一列之后再放入第二列。
【案例描述】
按下图将数字矩阵化输出。要求:输入数字,输出该数字的矩阵表示。输入的数字不是[0,9]上的整数时,需重新输入。
【案例分析】
从上面的数字化矩阵可以看出:组成数字的各行只有五种状态:
001:即左侧二个方格为空,右侧一个方格非空。标记为“0”状态。
010:只有中间方格非空,标记为“1”状态。
100:只有左侧方格非空,标记为“2”状态。
101:只有中间方格为空,标记为“3”状态。
111:三个方格均非空,标记为“4”状态。
用一个数组保存各状态的显示字符:
char a[5][7]={" ●"," ● ","● ","● ●","●●●"};
其中a[k]对应状态k的字符串。k=0,1,2,3,4。
注意:字符“●”显示时会占2个字符位,故在数组a中,一个空位需要输出2个空格。
十个数字各行显示的字符串用状态记录,得到以下数组:
char b[10][5]={{4,3,3,3,4},{1,1,1,1,1},{4,0,4,2,4}, {4,0,4,0,4},{3,3,4,0,0},{4,2,4,0,4},{4,2,4,3,4}, {4,0,0,0,0},{4,3,4,3,4},{4,3,4,0,4}};
那么,数字k第i行应显示的字符串就是a[b[k][i]]。
【参考代码】
#include<stdio.h>
main()
{ char i,k,a[5][7]={" ●"," ● ","● ","● ●","●●●"};
char b[10][5]={{4,3,3,3,4},{1,1,1,1,1},{4,0,4,2,4},
{4,0,4,0,4},{3,3,4,0,0},{4,2,4,0,4},{4,2,4,3,4},
{4,0,0,0,0},{4,3,4,3,4},{4,3,4,0,4}};
while(1)
{ setbuf(stdin,NULL);
scanf("%d",&k);
if(k>=0&&k<=9)break;
}
for(i=0;i<5;i++)printf("%s\n",a[b[k][i]]);
}