【说明】在现实中,我们经常使用如下的一个二层循环的方式就可以直接来遍历一个二维数组,并且也没有必要使用其他的方式。但是非要用一层循环来遍历二维数组,也是可以实现的。这个完全可以用来锻炼一下自己的思维,仅作为练习使用。以下讨论均出自于兴趣,感兴趣的朋友请看看。
1
for
(
int
i
=
0
; i
<
2
; i
++
)
2 {
3 for ( int j = 0 ; j < 3 ; j ++ )
4 {
5 cout << name[i][j] << endl;
6 }
7 }
2 {
3 for ( int j = 0 ; j < 3 ; j ++ )
4 {
5 cout << name[i][j] << endl;
6 }
7 }
【前提】首先作如下定义:
1
int
name[][
4
]
=
{
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
};
2 int ii = 2 , jj = 4 ;
3 int i = 0 ,j = 0 ;
2 int ii = 2 , jj = 4 ;
3 int i = 0 ,j = 0 ;
【结果】要实现的结果可以为如下形式:
1
while
(。。。)
2
3 {
4
5 cout << name[i][j] << endl;
6
7 }
8
2
3 {
4
5 cout << name[i][j] << endl;
6
7 }
8
【分析】
我们可以看到上面的while很简单,但是要遍历二维数组看似不可能,这如何实现呢?如果没有一个好的方法和过程我们怎么能够靠着自己的直观感觉和不断尝试修改而得到这样的一个while条件呢?
【实现】
如何实现呢?
首先,我们需要想,一层循环中必须实现下标的移动,如何使下标移到行尾时自动跳到数组的下一行就是我们着重需要进行的算法判断。下面是一个表示复杂但是可行的算法:
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1
while
(
1
)
2 {
3 if (i < ii)
4 {
5 if (j < jj)
6 {
7 cout << name[i][j ++ ] << endl;
8 }
9 else
10 {
11 if (i == ii - 1 )
12 {
13 break ;
14 }
15 else
16 {
17 j = 0 ;
18 ++ i;
19 if (i)
20 {
21 cout << name[i][j ++ ] << endl;
22 }
23 }
24 }
25 }
26 else
27 break ;
28 }
2 {
3 if (i < ii)
4 {
5 if (j < jj)
6 {
7 cout << name[i][j ++ ] << endl;
8 }
9 else
10 {
11 if (i == ii - 1 )
12 {
13 break ;
14 }
15 else
16 {
17 j = 0 ;
18 ++ i;
19 if (i)
20 {
21 cout << name[i][j ++ ] << endl;
22 }
23 }
24 }
25 }
26 else
27 break ;
28 }
大家看到这个算法非常复杂,表示很不简洁,谁都不会牺牲自己的两层循环的简洁方式来使用这样的一个方式来遍历一个数组,所以我们需要对其进行if…else…语句到…?…:…语句的转换。转换之后即可得到下述的简洁结果。
1
while
(( (i
<
ii)
?
((j
<
jj)
?
1
: ((i
==
ii
-
1
)
?
0
:(j
=
0
,
++
i))) :
0
))
2 {
3 cout << name[i][j ++ ] << endl;
4 }
2 {
3 cout << name[i][j ++ ] << endl;
4 }
注意:要把打印语句对应换为…?…:…语句中的一个零。上述编码在VS2008中编译通过。有问题请留言。