初级编程:一层循环如何依次遍历二维数组【附代码】

【说明】在现实中,我们经常使用如下的一个二层循环的方式就可以直接来遍历一个二维数组,并且也没有必要使用其他的方式。但是非要用一层循环来遍历二维数组,也是可以实现的。这个完全可以用来锻炼一下自己的思维,仅作为练习使用。以下讨论均出自于兴趣,感兴趣的朋友请看看。

 

 
  
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 }

 

【前提】首先作如下定义:

 

 
  
1 int name[][ 4 ] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 };
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  

 

【分析】

我们可以看到上面的while很简单,但是要遍历二维数组看似不可能,这如何实现呢?如果没有一个好的方法和过程我们怎么能够靠着自己的直观感觉和不断尝试修改而得到这样的一个while条件呢?

【实现】

如何实现呢?

首先,我们需要想,一层循环中必须实现下标的移动,如何使下标移到行尾时自动跳到数组的下一行就是我们着重需要进行的算法判断。下面是一个表示复杂但是可行的算法:

 

ContractedBlock.gif ExpandedBlockStart.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 }

 

大家看到这个算法非常复杂,表示很不简洁,谁都不会牺牲自己的两层循环的简洁方式来使用这样的一个方式来遍历一个数组,所以我们需要对其进行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 }

 

注意:要把打印语句对应换为…?…:…语句中的一个零。上述编码在VS2008中编译通过。有问题请留言。

转载于:https://www.cnblogs.com/Hiker/archive/2010/10/13/skill.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值