回 帖 发 新 帖 刷新版面

主题:[原创]do while语句的应用?

怎样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 楼

我似乎明白你的一点意思了,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 楼

谢谢wdkshp!我的意思就是你上面说的,不过用or能合适吗!or是有一个成立就为true,我要的是两个同时成立呀!

23 楼

在这里还想问个简单的问题!
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 楼

答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 楼

想问一个简单的问题?
 假设:len(buf)=9
       dim ary1(0 to 9) as string
       redim ary2(o to len(buf)) as string
    ary1()和ary2()的元素个数一样吗?

26 楼

1.要知道是否一样,在DIM前面加一行 msgbox len(buf) 就知道了
2.明知道所有len(buf)的值是9,可以直接使用常数,哪怕是变量也比三翻四次的计算函数值要稳定快捷
3.前后都是字符串,但你的处理真的令人称奇,先拆散再连接,看上去除了多此一举我没有其他解释呢.

27 楼

其实这个程序已经用left和right写过了,现在不是想多用几种方法吗?一是扩大思维,二是练练手

28 楼

想问一下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 楼

搞错了,对不起搂主

30 楼

我没用过这个控件,但我想问你一下:
buf = MSC.Input
这个msc.input的内部是不是需要执行事件的??
因为我看你说第一次获取数据正确就能执行,我猜想应该是。
你把这句前面加一个:Doevents 看看行不?

我来回复

您尚未登录,请登录后再回复。点此登录或注册