主题:[原创]do while语句的应用?
lcrxl1815
[专家分:110] 发布于 2008-09-15 12:47:00
怎样do while语句控制多个条件?
比如:变量buf是字符串型,如果它左边的第一位不是“=”,并且它的长度不为9,
(left(buf,1)<>"="and len(buf) <> 9)就进行循环,如果它左边的第一位是“=”,并且它的长度为9,就退出循环!
我这样写的程序:
do
if left(buf,1)<>"="and len(buf) <> 9 then
text1.text = ""
buf = ""
buf = msc.input
else
exit do
loop
这样写对吗?我运行了几次,好象逻辑上不对!有没有好的办法,请高手帮忙!
回复列表 (共33个回复)
21 楼
wdkshp [专家分:5490] 发布于 2008-09-17 12:52:00
我似乎明白你的一点意思了,txtReceive控件只显示最近一次接收的正确的数据,如果是这样:
12楼的代码
[quote] Do While (Left(buf, 1) <> "=" And Len(buf) <> 9)
txtReceive.Text = ""
buf = ""
buf = MSC.Input
Loop
txtReceive.Text = buf
[/quote]
的本意好像是:当接收的数据正确时,就写入到txtReceive控件,覆盖先前的数据,当数据不正确时,就将txtReceive控件的内容清空,然后接收下一个收据,判断下一个数据是否正确;如此循环。
判断数据是否正确的条件是:第一个字符为"="且接收的字符串长度为9位时数据正确,否则数据错误。
不知我的理解对不对?
如果我的理解正确,那么你的代码先改成
Do While (Left(buf, 1) <> "=" or Len(buf) <> 9)
试一试
另建议你:
将你的代码添加相应的注释,说明你的目的是在什么条件下完成什么任务,程序错误是不执行,还是执行错误,如果是执行错误,并给出错误的说明
22 楼
lcrxl1815 [专家分:110] 发布于 2008-09-17 14:24:00
谢谢wdkshp!我的意思就是你上面说的,不过用or能合适吗!or是有一个成立就为true,我要的是两个同时成立呀!
23 楼
lcrxl1815 [专家分:110] 发布于 2008-09-17 14:38:00
在这里还想问个简单的问题!
buf是一个九位的字符串,我把buf重新定义为动态数组:
ReDim ary(0 To Len(buf) - 1)
For i = 1 To Len(buf)
ary(i - 1) = Mid(buf, i, 1)
Next
For i = 0 To Len(buf) - 1
buf1 = buf1 + ary(i)
Next
txtReceive.Text = buf1
buf1 = ""
或者
ReDim ary(Len(buf) - 1)
For i = 1 To Len(buf)
ary(i - 1) = Mid(buf, i, 1)
Next
For i = 0 To Len(buf) - 1
buf1 = buf1 + ary(i)
Next
txtReceive.Text = buf1
buf1 = ""
怎么ReDim ary(Len(buf) - 1)或者 ReDim ary(0 To Len(buf) - 1)出现下标越界错误?
24 楼
wdkshp [专家分:5490] 发布于 2008-09-17 15:49:00
答23楼:
你的数据是不是如果正确,就必须同时满足 Left(buf, 1) = "=" 和Len(buf) = 9。
or的含义在这里是 只要有一个条件不满足就说明数据不正确
and的含义在这里是 只有两个条件同时不满足才说明接收的数据不正确,换句话说Left(buf, 1) = "=" 和Len(buf) = 9这两个条件只要有一个满足就说明接受的数据正确
do while (条件1 连接词 条件2 连接词……条件n)
loop的意思是当while后面的条件(即括号内的语句)满足时进入循环,否则退出循环
答24楼:
错误提示是不是停留在[quote]
For i = 0 To Len(buf) - 1
buf1 = buf1 + ary(i)
Next
[/quote]
这个循环中?如果是,建议你在for语句的最后面添上" step 1",我以前遇到过一次!
25 楼
lcrxl1815 [专家分:110] 发布于 2008-09-17 21:21:00
想问一个简单的问题?
假设:len(buf)=9
dim ary1(0 to 9) as string
redim ary2(o to len(buf)) as string
ary1()和ary2()的元素个数一样吗?
26 楼
moz [专家分:37620] 发布于 2008-09-17 21:35:00
1.要知道是否一样,在DIM前面加一行 msgbox len(buf) 就知道了
2.明知道所有len(buf)的值是9,可以直接使用常数,哪怕是变量也比三翻四次的计算函数值要稳定快捷
3.前后都是字符串,但你的处理真的令人称奇,先拆散再连接,看上去除了多此一举我没有其他解释呢.
27 楼
lcrxl1815 [专家分:110] 发布于 2008-09-17 21:58:00
其实这个程序已经用left和right写过了,现在不是想多用几种方法吗?一是扩大思维,二是练练手
28 楼
lcrxl1815 [专家分:110] 发布于 2008-09-17 23:42:00
想问一下25楼!
ReDim ary(Len(buf) - 1)和Dim ary(Len(buf) - 1)的元素个数应该是len(buf)呀!
怎么成了 ReDim ary(Len(buf) - 1)和ReDim ary(0 To Len(buf) - 1)的意思是数组共有 Len(buf) - 1 个元素!
29 楼
wdkshp [专家分:5490] 发布于 2008-09-18 15:07:00
搞错了,对不起搂主
30 楼
guoyong_cy [专家分:3050] 发布于 2008-09-18 18:55:00
我没用过这个控件,但我想问你一下:
buf = MSC.Input
这个msc.input的内部是不是需要执行事件的??
因为我看你说第一次获取数据正确就能执行,我猜想应该是。
你把这句前面加一个:Doevents 看看行不?
我来回复