一个在黑客界引起轰动的菜鸟教材—跟我学编程系列(4)

四篇(共六篇):

大家好, 昨天我休息了一天, 所以今天写第4章:循环结构

  我们先来看一道题:商场进行每日结算, 要求累加出今天的营业额, 每次输入一个数, 这道题其实很简单, 但就我们现在学

过的知识要完成这道题相当麻烦, 我们来分析一下. 首先, 我们需要知道买卖的次数, 这样才能控制输入的次数,但是, 这种设

计是非常低效的, 每天都要重新设计程序. 假定今天进行了5次交易, 以下是源程序:

dim sum
sum=0 '初始化变量
sum=sum + int(inputbox(“请输入交易额”))
'sum=sum+x 这种形式是把本身的值取出来, 进行一次运算, 再放回本身, 这种方法很有用处
'这里使用了函数嵌套, 把inputbox的返回值直接传给int函数, 转化成整数, 下同
sum=sum + int(inputbox(“请输入交易额”))
sum=sum + int(inputbox(“请输入交易额”))
sum=sum + int(inputbox(“请输入交易额”))
sum=sum + int(inputbox(“请输入交易额”))
msgbox(sum)

  看到了吗, 我通过把计算过程复制了5遍才设计好了程序, 这种程序在汽车交易所等交易次数少的地方还能凑合着用, 如果

放到超市岂不是要复制, 粘贴几千遍? 我们今天讲的内容就可以克服这种缺陷, 首先, 我们来讲以下Do…Loop语句.

  do…loop的结构看上去非常简单, 就是:do…loop, 仅此而已, 这个结构不断执行do和loop之间的语句(学名叫:循环体),
永不停止. 举个例子来说:

do
  msgbox(“这个信息会不断重复出现, 要停止程序请使用任务管理器(Ctrl+Alt+Del)中止wscript进程”)
loop

  运行这个程序, 当你点销掉一个对话框马上会出来另一个, 你永远点不完, 总有下一个. 谁会运行这样的程序? 除非是给

别人捣乱(我就干过这种事), 所以在do..loop结构中还有一个语句:exit do, 这个语句将终止循环, 跳到loop后面的语句继续

执行. 据个例子来说:

dim a '注意:常量不需要在dim里面声明,否则会引发错误
const pass=”123456″ '这是一个字符串 请用””包裹起来. 设定密码为常量, 不可变更
do
  a=inputbox(“请输入密码”)
  if a=pass then
       msgbox(“密码校验成功”)
       exit do
  end if
loop

  这个程序会一直不停的问你密码, 知道你输入了正确的密码为止.(if可以嵌套在另一个if当中, 也可以嵌套在循环体当中

, 所以一定要用缩进, 来分清楚程序的各个部分). 这个程序是很经典的, 早期的程序都是这么做的. 但是我们是Hacker, 所以

我们了解系统的安全性, 这种无限次认证程序很容易被穷举****, 我们要来限定认证的次数. 修改程序如下

dim a,ctr
ctr=0 '设置计数器
const pass=”pas123_” '上面的那个是弱密码, 这次改的强一点
do
  if ctr=3 then
      msgbox(“已经达到认证上限, 认证程序关闭”)
      exit do
  else
      a=inputbox(“请输入密码”)
      if a=pass then
          msgbox(“认证成功”)
          msgbox(“(你可以在这里加一段成功后得到的信息)”)
          exit do
      else
          ctr=ctr+1 '如果密码出错就增加一次错误认证计数
          msgbox(“认证出错, 请检查密码”)
      end if
   end if
loop

  运行这个程序试试看, 当你出了3此错误以后, 就会停止再次询问密码, 关闭程序. telnet认证用来限制次数的程序与此大

同小异. 要注意的是嵌套的if语句, 清仔细读一下这个程序, 可能比较难懂, 也请你试着自己设计一下类似的程序.

  其实, 要在do…loop加上验证的功能, 并不一定要用if, 我们可以直接利用do. 我来介绍一下while关键字, while可以放
在do或者是loop后面, 然后再接一个表达式, 当表达式的值为true的时候(表达式成立),才运行循环体.我们来看一下修改后的
程序”

dim a,ctr
ctr=0
const pass=”pas123_”
do while ctr<3
  a=inputbox(“请输入密码”)
  if a=pass then
      msgbox(“认证成功”)
      msgbox(“(你可以在这里加一段成功后得到的信息)”)
      exit do
  else
      ctr=ctr+1 '如果密码出错就增加一次错误认证计数
      msgbox(“认证出错, 请检查密码”)
  end if
loop

  这样实现的功能和上一个例子完全一样, 我们再来看看把while放在loop后面:

dim a,ctr
ctr=0
const pass=”pas123_”
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(表

达式不成立)的时候才执行循环体, 请自己试验一下

  ok, 我们来看另外一种循环结构,for….next, 这种循环结构是基于计数的, 也是在编程中最常见到的循环结构.

dim i
for i=0 to 5
  msgbox(i)
next

  看到了吗?每次输出的i都是递增的, 但我们没有明确指出i要递增, 当i达到5的时候, 循环就结束了, 因为由0开始, 所以

循环体执行了6次, 这一点很重要, 大部分东西都是从0开始而不是1. 这个程序也可以写成

do的形式:

dim i
i=0
do while i<5
  msgbox(i)
  i=i+1 '因为do不能自动计数, 必须手动加
loop

  怎么样, 还是for比较好用吧. for在编程中很有用途, 我们再举一个例子, 顺便讲一下嵌套循环.

dim i,j
for i=1 to 9
  for i=1 to 9
     str=str & i * j & ” ” '&是和并字符串的符号
  next '每个next对应一个for
next

  看看运行结果, 是否令你会想起小学时代的数学老师(丑陋的嘴脸). 要注意, 这里有一个”大”的for, 和一个小的for, 当

小的for执行完一个周期以后, 大的for才执行一次(换句话说, 大的for执行一次, 小的要执行9次), 所以一共执行了九九八十

一次. 在大的for里可以不仅仅是一个小的for, 也可以加上另外的语句. 我们来修改一下源程序:

dim i,j
for i=1 to 9
  for i=1 to 9
     str=str & i * j & ” “
  next '每个next对应一个for
  str=str & vbCrlf 'vbCrlf相当于键盘上的回车键,因为你不能在键盘上输入,所以系统定义了一个默认的常量
next

  这次运行完成以后, 输出结果按照乘数进行了分割, 每小for运行完一次, 就换一行(通过vbcrlf).

  这次的内容对菜鸟可能比较难懂, 掌握的办法只有一个:多实践. 另外, 我在论坛看到很多人还是问:”VBScript要用什么工

具编?”我就很气愤, 我在第一篇里面已经说明:用记事本编辑源代码, 然后保存为以.vbs为扩展名的程序就可以了, 请大家不要

再问. 另外, 国产的一种垃圾软件”超级X霸”抢占了vbs这个扩展名, 请把那个垃圾卸载掉.

  我们总结一下:

要点:

1) do..loop和exit do的用法

2) while当表达式true的时候执行循环体,until反之

3) for…next是计数循环, 每次执行计数器递加

4) 嵌套循环的作用和写法

4.5) &用于连接字符串

5) vbCrLf相当于键盘上的回车键

作业:

1) 在我国的数学经典著作”九章算术”中有这样一道题:百钱买百鸡, 公鸡5钱一只, 母鸡3钱一只, 小鸡1钱2只(这个数据我是参

考一本编程书的, 但我记得是公3,母1,小1钱3只? 不管了, 就按照书上得来吧)求得是能有多少种办法买这些鸡. 如果看不懂的

话我用大白话说说:有人要去买鸡, 用100块钱正好买了100只鸡, 价格如下:公:5$, 母:3$, 小:1$ for 2, 让你求一共多少种卖

法(公母小怎么搭配). 请用循环解决这个问题.

ps:今天要去移民局办事, 所以文章写的很仓促. 大部分代码都没有实验, 请大家帮我找错. 另外, 上次的作业大家在论坛应该

看到了, 我就不重复答案了, 不知道大家喜欢做这种题, 还是以前那种比较简单的?

You May Also Like

About the Author: admin

发表评论

您的电子邮箱地址不会被公开。