声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1698|回复: 14

[综合讨论] 关于while循环的疑问

[复制链接]
发表于 2009-6-25 17:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
各位matlab的师兄师姐,我初学matlab,在编程时遇到关于while的问题,代码如下:
a=[1 2 2 1 0 2 3 0 1 0 1 0 1 2 1 3 3 1 1 1 0 0 0 1 2 2 1 2 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 3 2 3 2 0 1 0 0 1 2 ];
b=zeros(1,60); k=60; p=0; m=0;
for u=0:k-1
  if a(1,u+1)~=0
     if p>5
        b(1,m+1)=a(1,u+-p); m=m+1;
     end
     p=0; u=u+1;
  end
  while a(1,u+1)==0
        u=u+1; p=p+1;
  end
end
k=m;
运行后发现每进入while循环内p值都要多加一次,单步运行时发现while内的两个语句要连续执行两次才跳出,不知为何?也就是说假如当u=4时,a(1,u+1)满足while循环,u=5,p=1,然后应该跳出,可是却又执行一遍,但u值不变还是5,p又加1,p=2,不知为何会这样?
不知我把问题说明白了没有?谢谢各位师兄师姐指点迷津,我都困惑一整天了。

[ 本帖最后由 ChaChing 于 2009-6-25 20:23 编辑 ]
回复
分享到:

使用道具 举报

发表于 2009-6-25 20:18 | 显示全部楼层
while是个无限回圈, 直到条件不成立!
u=4时,条件a(1,u+1)==0成立, 执行u=u+1; p=p+1; 此时u=5当然得再检查a(1,u+1)==0是否成立! 不成立才跳至end
想想u=1时, 不是也得检查a(1,u+1)==0是否成立!

还有a,b都是1-D, 直接使用b(m+1),a(u+1)即可!

[ 本帖最后由 ChaChing 于 2009-6-25 20:22 编辑 ]

评分

1

查看全部评分

 楼主| 发表于 2009-6-26 07:27 | 显示全部楼层
谢谢happy的帮助,不过您好像没有明白我的意思。
我知道while是无限循环,但问题是当u=5时已不满足循环,可是while还要循环一次。
运行时出现:
u=
    5
p=
    1
u=
    5
p=  
    2
为什么p要多加一次?还望happy再指点,谢谢您!
发表于 2009-6-26 11:00 | 显示全部楼层
运行出错:
??? Attempted to access a(1,-89); index must be a positive integer or logical.

Error in ==> shiyan at 8
        b(1,m+1)=a(1,u+-p); m=m+1;
%%%%%%%%%%%%%%%%%%%%%
a(1,u+-p); 中的u+-p想要表达什么意思
 楼主| 发表于 2009-6-26 11:50 | 显示全部楼层
对不起,发的太匆忙了,少写了个1,重新发
a=[1 2 2 1 0 2 3 0 1 0 1 0 1 2 1 3 3 1 1 1 0 0 0 1 2 2 1 2 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 3 2 3 2 0 1 0 0 1 2 0 0 0 0 0 0]
b=zeros(1,60); k=60; p=0; m=0;
for u=0:k-1
  if a(1,u+1)~=0
     if p>5
        b(1,m+1)=a(1,u+1-p); m=m+1;
     end
     p=0; u=u+1;
  end
  while a(1,u+1)==0
        u=u+1; p=p+1;
  end
end
k=m;

是想完成在一段数据a中找到大于5个的连零串,并将这串零的第一个零之前的值存起来即b,同时记录有多少个这样的串即m,不知大家还有什么好办法吗?

[ 本帖最后由 ChaChing 于 2009-6-26 21:30 编辑 ]
发表于 2009-6-26 14:13 | 显示全部楼层

  1. sa = num2str(a);
  2. sa(sa == sa(2))=[];
  3. pos = findstr(sa,'000000');
  4. b = a(1:pos(1)-1);
复制代码

求m还要对pos处理下,楼主具体看些findstr的帮助吧。

[ 本帖最后由 rocwoods 于 2009-6-26 14:19 编辑 ]

评分

1

查看全部评分

发表于 2009-6-26 14:19 | 显示全部楼层

回复 7楼 rocwoods 的帖子

楼主的功能没有全实现哦,嘿嘿
还要区分后面的连0以及多于5个0
发表于 2009-6-26 15:36 | 显示全部楼层
我知道,呵呵。剩下的楼主可以自己做了。再用diff函数处理下pos,数数大于1的个数然后加1就是m。
这个方法很多上面只是容易想到的其中一种。
论坛讨论除非必要,还是不赞成全盘帮楼主包办问题解决的。

[ 本帖最后由 rocwoods 于 2009-6-26 15:42 编辑 ]

评分

1

查看全部评分

 楼主| 发表于 2009-6-26 17:41 | 显示全部楼层
首先谢谢rocwoods的帮助,很简洁明了的思路!不过还是不太适合我的程序,因为这是我的一个大程序中被我抽象简化出来的问题,实际的数组是个二维数组,一维存位置信息,一维存数据,而且数据的低两位存标识信息,我要每取一次低位做一次是否为零的判断,我只是想知道while中为什么p要多加一次?今天试着将while改为if语句,可是p还是要多加一次,所以请各位帮我看看我这段程序哪里有问题吗?为什么会出现这么诡异的事情。大家可以设断点一步步看看,真的很奇怪,我今天和同事一起研究都觉得很蹊跷,哪位知道可以帮帮我!
发表于 2009-6-26 22:50 | 显示全部楼层
先不说优化!
说真的, 楼主使用的循环logic很怪!
for loop的循环参数使用u, 里头又有u=u+1 ? 不乱才怪!
 楼主| 发表于 2009-6-27 10:50 | 显示全部楼层
happy,那我该怎么解决呢?想不出别的办法了,u要作为循环的参数,因为a数组的操作需要它作为下标,同时u还要计数,因为不管if条件是否满足,u都需要改变,我该怎么办?困在这里了……
刚刚又看了一遍程序,是否应该将程序中的两个u=u+1都去掉,让u自己随着for循环自加。

[ 本帖最后由 ChaChing 于 2009-6-27 20:51 编辑 ]
 楼主| 发表于 2009-6-28 11:10 | 显示全部楼层
还想请问一下happy,:@)
是否C语言和MATLAB语言的for循环不同,将这一段程序用C来写运行就是正确的,不会出现u,p乱加的现象。
发表于 2009-6-28 19:31 | 显示全部楼层
首先说明6F才是好方法! 楼主真的考虑参考下!
而楼主在5F的程序logic, 真的看不太懂! 若楼主坚持使用循环, 参考下
a=[1 2 2 1 0 2 3 0 1 0 1 0 1 2 1 3 3 1 1 1 0 0 0 1 2 2 1 2 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 3 2 3 2 0 1 0 0 1 2 0 0 0 0 0 0];
ii=1; pp=5; m=0;
while ii<=length(a)-pp+1
  if a(ii)~=0, ii=ii+1;
  else
    jj=1;
    while ii+jj<=length(a) && a(ii+jj)==0, jj=jj+1;end
    if jj>=pp, m=m+1; end
    ii=ii+jj;
  end
end
m
最後, 说明下happy是图片的那只!
发表于 2009-6-29 07:52 | 显示全部楼层

回复 13楼 ChaChing 的帖子

哈哈,happy眼睛看人低
 楼主| 发表于 2009-6-29 18:25 | 显示全部楼层
:@$ :@$ chaching,我还以为是你的昵称呢。
;@P ;@P 对不起,狗狗,你叫happy,我不会再搞错了!
:@P :@P 谢谢chaching!谢谢你的建议!我上班的时候试试!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-26 11:27 , Processed in 0.062496 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表