介绍
大家好,今天我们学第4章:循环结构
小伙伴们可能会想:上节课说好的彩蛋呢?先别急嘛,我们学完循环再揭晓。
我们先来看一道题:班里要进行总分统计,要求累加出一个班60人的总分数(分数由用户输入),请问你该怎么设计这个程序?
下面是原程序:
dim a
a=0
a=a+int(inputbox("请输入一个同学的分数"))
a=a+int(inputbox("请输入一个同学的分数"))
a=a+int(inputbox("请输入一个同学的分数"))
a=a+int(inputbox("请输入一个同学的分数"))
a=a+int(inputbox("请输入一个同学的分数"))
...
a=a+int(inputbox("请输入一个同学的分数"))'第60遍
这什么时候才能打完呀?
这时候,循环大人就闪亮登场了。首先我们来讲第一个循环结构: do…loop语句。
do…loop
do…loop的结构看上去非常简单, 就是:do…loop, 仅此而已, __这个结构不断执行do和loop之间的语句{死循环}(学名叫:循环体), 永不停止. __举个例子来说:
do
msgbox "这个信息会不断重复出现, 要停止程序请使用任务管理器(Ctrl+Alt+Del)中止wscript.exe进程"
loop
是不是有一丝熟悉?(第一节课我们做恶搞程序就用的这个)不过,除了恶搞别人,谁会干这种事呢?更别提做程序了。
所以在do…loop结构中还有一个语句:exit do, 这个语句会终止循环,做下面的语句,下面我来举个栗子:
dim a
const pass="123456" '这是一个字符串 请用""包裹起来. 设定密码为常量, 不可变更
'自定义常量我们在第二节课讲过
do
a=inputbox("请输入密码")
if a=pass then
msgbox "密码验证成功"
exit do
end if
loop
嗯…我用大白话说说意思:
定义一个变量
定义一个字符串为常量
进入循环
要求用户输入密码储存在a这个变量里
如果a等于前面自定义的字符串常量:
那么输出:密码验证成功
退出循环
退出if语句
不满足if语句的条件继续循环,直到满足为止
大家都清楚这个程序的功能吧!它会一直不停的问你密码, 直到你输入了正确的密码为止。我们知道用循环,别人难道就不能用循环来破解密码吗?这种无限次认证程序很容易被穷举破解, 我们要来限定认证的次数. 修改程序如下
dim a,ctr
ctr=0 '设置变量统计输入次数
const pass="tycxt478f__y7h" '上面的那个是弱密码, 这次改的强一点
do
a=inputbox("请输入密码")
if a=pass then
msgbox "认证成功"
exit do
else
if ctr=3 then
msgbox "已经达到认证上限, 认证程序关闭"
exit do
else
ctr=ctr+1 '注意:这一句是赋值句,要从右往左读,即每出错一次就把ctr加上1,然后再放回ctr里面,使得这个常量加1
msgbox "认证出错, 请检查密码"
end if
end if
loop
运行这个程序试试看, 当你出了3次错误以后, 就会停止再次询问密码, 关闭程序。要注意的是嵌套的if语句, 请仔细读一下这个程序, 可能比较难懂, 也请你试着自己设计一下类似的程序.
while
我们再来看另一种循环结构: while语句。__while可以放在do或者是loop后面, 然后再接一个表达式, 当表达式的值为true的时候(表达式成立),才运行循环体。__我们来看一看用while编写同样的程序。
dim a,ctr
ctr=0
const pass="yu76tfy7bvr66__"
do while ctr<3
a=inputbox("请输入密码")
if a=pass then
msgbox "认证成功"
msgbox "(你可以在这里加一段成功后得到的信息)"
exit do
else
ctr=ctr+1 '如果密码出错就增加一次错误认证计数
msgbox "认证出错, 请检查密码"
end if
loop
或者:
dim a,ctr
ctr=0
const pass="yu76tfy7bvr66__"
do
a=inputbox("请输入密码")
if a=pass then
msgbox "认证成功"
msgbox "(你可以在这里加一段成功后得到的信息)"
exit do
else
ctr=ctr+1 '如果密码出错就增加一次错误认证计数
msgbox "认证出错, 请检查密码"
end if
loop while ctr<3
请自己动手运行这两个程序,看看有什么不同。
答案: 功能是一样的, 为什么要放在loop后面呢? 你把ctr的值改成3就知道了, while在do后面的程序会直接退出, 而在loop后面还会允许一次认证, 到了loop才结束.和while相反的是until, 用法和while一样, 不过他只有当后面的表达式的值为false(表达式不成立)的时候才执行循环体
for… next
还有一种循环: for…next.这种循环结构是基于计数的, 也是在编程中最常见到的循环结构,下面举个栗子
dim i
for i=0 to 5
msgbox i
next
'定义一个i变量
i从一循环到五
输出每一次循环的结果
结束
结果为:0~5
这个程序也可以写成:
dim i
i=0
do while i<5
msgbox i
i=i+1 '因为do不能自动计数, 必须手动加
loop
除了单个循环,还有__嵌套循环__。
dim i,j
for i=1 to 9
for j=1 to 9
str=str & i * j & " " '&是和并字符串的符号
next '每个next对应一个for
next
msgbox str
这里面有一个大的for,一个小的for,小的for执行九次,大的for执行1次,一共执行9*9=81次,把81个数打印了出来.
要点
(1) do…loop和exit do的用法
(2) while当表达式true的时候执行循环体
(3) for…next是计数循环, 每次执行计数器递加
(4) 嵌套循环的作用和写法
(5) &用于连接字符串
作业
在我国的数学经典著作"九章算术"中有这样一道题:百钱买百鸡, 公鸡5钱一只, 母鸡3钱一只, 小鸡1钱3只)求得是能有多少种办法买这些鸡. (建议用for… next)