VBS基礎教程
VBScript(Microsoft Visual Basic Script Editon).,微軟公司可視化BASIC腳本版). 正如其字麵所透露的信息, VBS(VBScript的進一步簡寫)是基於Visual Basic的腳本語言. Microsoft Visual Basic是微軟公司出品的一套可視化編程工具, 語法基於Basic. 腳本語言, 就是不編譯成二進製文件, 直接由宿主(host)解釋源代碼並執行, 簡單點說就是你寫的程序不需要編譯成.exe, 而是直接給用戶發送.vbs的源程序,
用戶就能執行了.
第一篇(共六篇)
我知道菜鳥現在最關心的就是用什麼工具來開發VBS程序了, 答案是:記事本(Notepad),我不是開玩笑, 其實任何一種文本編輯器都可以用來開發VBS開發, 隻不過記事本是由係統自帶的, 比較好找而已. 盡管如此, 我還是建議你去下載一個專業的文本編輯器, 因為這些工具可以提供 "語法高亮"等功能, 更加方便開發, 用哪一個隨你喜好, 我比較喜歡Edit Plus ScriptCryptor也不錯 OK, 我們先來寫一個VBScript程序熱熱身。
REM 輸入並回顯你的名字
'使用InputBox和Msgbox函數
'(上麵及本行可以不必寫入源代碼中,下麵才是運行的代碼)
Dim name,msg
msg="請輸入你的名字:"
name=Inputbox(msg)
Msgbox name
把上麵的程序清單輸入到記事本裏麵, 然後保存為以.vbs為擴展名的文件(如果在文件名上沒有“.***”,就打開控製麵板-文件夾選項-查看-取消隱藏已知文件類型的擴展名).然後雙擊, 觀察運行結果。
注意:為了使你學得更好,推薦自己輸入程序清單, 盡量不要複製->粘貼
我來解釋一下這個程序, 第一行和第二行的開頭分別是"REM"語句和" ' ", 這兩個東西的作用是相同的, 表示之後的文字是注釋, 就是說符號後的什麼也不幹,隻是用來說明這段程序的功能, 版權信息等等. 注釋行是程序最重要的部分之一, 盡管它不是必需的, 但對於其他人閱讀源代碼, 以及自己分析源代碼是很有好處的. 好的習慣是在必要的地方加上清晰, 簡潔的注釋。
Dim用來聲明一個變量, 在VBS中, 變量類型並不是那麼重要, 就是說VBS會幫你自動識別變量類型, 而且變量在使用前不一定要先聲明, 程序會動態分配變量空間. 在VBS中你不用考慮name儲存的是一個整數還是一個小數(學名叫"浮點數"), 也不用考慮是不是字符串(一串字符, 比如:"Hello World"), VBS會自動幫你搞定. 所以第三行語句可以刪除, 效果不會變, 但我強烈反對這麼做, 一個變量的基本原則就是:先聲明,後使用.變量名用字母開頭,可以使用下劃線,數字,
但不能使用vbs已經定義的字, 比如dim, 也不能是純數字。
下一行被稱之為"賦值", "="是賦值符號, 並不是數學中的等於號, 盡管看起來一樣.這是正統的理解, 你要理解成等於也沒有什麼不可. 賦值號的左邊是一個變量, 右邊是要賦給變量的值, 經過賦值以後, msg這個變量在程序中等同於"請輸入你的名字:"這個字符串,但當msg被再次賦值的時候, 原值就會消失. 不光字符串, 其他任何變量都這樣被賦值, 例如: a=2, b=12.222等等。
再往下,Inputbox和Msgbox是VBS內建的函數, 一個函數就相當於一個"黑箱", 有輸入(參數)和輸出(返回)值, 你可以不用了解函數是怎麼運作的, 隻要了解這個函數能幹什麼就行了, 我們也可以定義自己的函數,
不過那要等到以後再講. 現在我們隻要了解, 一個函數可以有返回值也可以沒有, 可以有參數也可以沒有. 例如Inputbox就是有返回值的函數, 我們用賦值號左邊的變量來"接"住InputBox的返回值--就是你輸入的內容. 在inputbox右邊的括號裏是參數列表, 每個參數用","分隔開, 每個參數有不同的功效, 比如第一個參數會顯示在提示裏, 我們把msg這個變量作為第一個參數傳給了Inputbox 函數, 而msg="請輸入你的名字:", 所以我們在對話框的提示欄就會看到"請輸入你的名字:" 第二個參數是對話框的標題,
我們用直接量(學名叫"常量", 這裏是"字符串常量")傳遞給函數, 當然你也可以傳遞變量. Inputbox還有很多參數, 比如你在"名稱"後麵再加一個","然後輸入隨便一串字符(字符串,用雙引號""包裹起來的一串字符叫做字符串)然後運行, 看看結果. 你會發現用於輸入的文本框有了默認的值, 這就是第三個參數的作用。
Msgbox函數是用來輸出的函數, 在VBS中沒有專門的輸出函數(BASIC中的print,C中的printf), 所以我們隻能用對話框來觀察輸出結果, Msgbox的必要參數隻有一個, 就是要輸出的內容, 在這種情況下, 我們不需要理會msgbox的返回值. 關於Msgbox和Inputbox我們以後還會在討論, 今天隻是熱熱身, 到此為止。
要點:
1) 注釋(以REM或'開頭)行在程序中不起作用, 但能讓別人更容易讀懂你的程序.
2) 變量好像一個盒子, 或一個代號, 可以代表你想代表的東西. 變量賦值使用"="
3) 以""包裹起來的字符稱之為"字符串"
4) 函數像一個"黑箱", 有參數和返回值, 用"="左邊的變量可以接住返回值
5) Inputbox函數彈出一個輸入對話框,Msgbox則用於輸出
作業:
1) 試驗Inputbox的第三個參數
2) 寫一段程序輸出你的年齡
3) 寫一段程序進行3次輸入, 分別輸入你和你父母的姓名(要求顯示提示), 並分3次輸出
第二篇(共六篇)
今天講各種"量"和基本運算
先說常量, 這個比較簡單.
什麼是常量呢, 常量就是其值不可變化的量.
常量分為兩種:第一種, 自然常量. 這叫是因為它們本身就是常量, 你怎麼更改21的值呢? 他永遠都是21, 不可能變成46 。
如果你在程序中使用"21=46", 這樣的語句將會引發一個錯誤. 同樣的, 字符串也是常量 (還記得字符串嗎? 就是包裹在""之間的一串字符), "Hello World"就是一個例子, 如果你用"Hello World"="Bye"這樣的語句同樣會引發一個錯誤. 你能舉出自然常量的更多例子嗎?
第二種, 是我們自己定義的常量,這種量也使用代號, 它們也被賦值, 但和變量的不同點在於, 他們在定義的時候被賦值,以後就不能改變了,如果企圖改變將會引發一個錯誤. 定義一個常量,我們使用"const"這個關鍵字(關鍵字的意思是係統定義了有特殊功能的字, 不能作為變量名或常量名使用)
格式是:const 常量名=常量值.
例如:
const PI=3.1415962
const NAME="記憶碎片"
這樣我們就定義了兩個常量, PI和NAME, 一般說來, 常量名全部使用大寫, 但也可以不用, 隨你喜好. 將一些在程序中不需要改變的值定義為常量是個好習慣, 這樣能防止不必要的意外. 另外, 使用自定義常量也可以減少你的工作量. 比如:
msgbox "Hello World"
msgbox "Hello World"
msgbox "Hello World"
msgbox "Hello World"
msgbox "Hello World"
這個程序輸出五次Hello World, 如果你想要改變輸出為Bye-Bye, 就必須修改全部程序, 當然你可以手動修改5次, 但如果你要輸出1000次呢? 常量就可以替我們解決這個問題:
const hw="Hello World"
msgbox hw
msgbox hw
msgbox hw
msgbox hw
msgbox hw
這樣當你要修改輸出的時候隻要修改hw的值就行了.
好了, 現在我們來看看編程的第一塊重要"基石":變量. 解釋變量最好的辦法我覺得是"盒子", 一個變量好像一個盒子, 裏麵隻能裝一個東西, 當你要裝進去別的東西的時候必須把原有的東西拿出來. 這個"盒子"是有名稱的, 當你在程序中使用變量的時候, 係統會打開盒子取出裏麵的東西, 讓這些東西參與處理, 而不是盒子. 有些語言是很依賴"盒子"裏麵裝些什麼東西, 這樣才能找到合適的"盒子"(比如C語言), 但VBS給我提供的是能夠自動伸縮的"魔術盒", 我們不用關心裝進去的是什麼東西,
VBS會自動調整盒子的大小. 例如:
Dim a1,a2,a3
a1=14
a2=12.23
a3="Hello"
而不用像C語言那樣麻煩: 或者是VB的正規聲明(VB可以聲明也可以不用)那樣:
int a1; Dim a1 as integer
float a2; Dim a2 as Double
char* a3; Dim a3 as string
a1=14; a1=14
a2=12.23; a2=12.23
a3="Hello"; a3="Hello"
嗯……扯遠了……
變量有什麼用呢? 哇, 那用處可大了. 最簡單, 你並不能確定程序運行時變量的值, 比如前一節課我們編的輸入姓名的程序, 你不能確定InputBox返回的是什麼(還記得Inputbox的返回值嗎? 就是你輸入的內容), 所以你就沒有辦法應對各種情況, 但我們用name這個"盒子"把用戶的名字裝起來, 到用的時候我們隻要知道name這個盒子的名字就行了, 係統會自己打開它並把裏麵的內容拿出來用. 再舉個例子, 我們編寫一個程序計算一個矩形的麵積, 比如這個程序要發給小學生使用:
dim a,b,s
a=15
b=12
s=a*b
msgbox s
這樣就可以求出長為15,寬為12的矩形的麵積了, 是不是很簡單? 當然, 這個程序也可以這樣寫:
dim s
s=15*12
msgbox s
這樣看起來程序短了許多, 也節約內存, 但兩種都不是鼓勵的做法, 為什麼? 請看下麵.
現在, 我們的程序要變得像點樣子才行, 誰的程序寫出來還要別人修改源代碼才能用啊?
所以, 我們要接受用戶的輸入, 還記得嗎? InputBox函數.
修改後程序如下:
dim a,b,s
a=inputbox("請輸入矩形的長:")
b=inputbox("請輸入矩形的寬:")
s=a*b
msgbox s
ok, 這麼一修改, 無論用戶輸入怎樣的數據, 我們都能計算出矩形的麵積了. 如果你用s=15*12能改嗎? 當然不行。
我想你已經發現了, vbs中的數學計算和真正的算術沒有什麼不同, +,-,*,/,(),[],{}都是一樣的用法, 比如:
dim ans
ans=12+32/4+[(23-10)*2]
msgbox ans
四則運算的法則在編程中同樣生效, 你可以在編程中重新獲得小學時候的樂趣(你恨數學?那就別學電腦了)。
在編程中有一個有趣的運算符是"mod", 這個運算符叫做"取餘運算符", 就是取得一次除法的餘數, 例如
dim a
a=16 mod 5
你知道a等於幾嗎? Bingo! 沒錯, 就是1. 因為16 / 5 =3....1, 所以mod計算的結果就是1.
還有一個運算符是"^"(就是鍵盤"6"上麵的小箭頭), 他表示"乘冪"(或者是"方") 比如:
dim a,b,c
a=2
b=a^2
c=a^3
msgbox b
msgbox c
則b=a*a=4, c=a*a*a=8
好了,我們一次不要講太多, 這次就講到這裏, 現在總結一下.
要點:
1) 常量分為自然常量和自定義常量, 常量的值不可修改
2) 變量就像盒子, 我們不在乎盒子裏裝的是什麼, 但一定要知道盒子的名字
3) 四則運算在編程中沒有任何不同
4) MOD是取餘運算
作業:
1) 編一個程序, 計算圓形的麵積, 半徑由用戶給出 (使用Inputbox) PI取值3.14159
2) 編一個程序取得20 / 3 的餘數
第三篇(共六篇)
首先, 我來解決一下上次課程的幾個疑問
第一, 那個餘數問題, 16 / 5 = 3……1, 是因為我改過前麵的部分, 後麵的忘了改了, 不好意思。
第二, 請看一下程序清單:
(1)
Dim a,b,c
a=inputbox("a是:","輸入半徑")
b=Inputbox("b是:","輸入半徑")
c=a*2+b*2
msgbox c
這個 輸入1、2時是6
(2)
Dim a,b,c
a=inputbox("a是:","輸入半徑")
b=Inputbox("b是:","輸入半徑")
c=(a+b)*2
msgbox c
這個輸入1、2時是24
為什麼會不一樣呢? 在數學上c=(a+b)*2 和 c=a*2+b*2是等價的, 在VBS中也是如此. 問題出在"+"上, 在VBS中, +不僅僅是加號的意思還表示把兩個字符串連接起來,例如"Hello"+"World"="HelloWorld" ,have you understood? 你還記得InoutBox函數的返回值嗎? 是字符串! 這就看出問題了吧, 在編程中"1"不等於(<>)1, "1"是一個字符, 而1是一個數, 所以a,b都是字符串變量, "1"+"2"="12",
這就好像我們小時跟夥伴開玩笑問他們1+1=?一樣, 我們總是笑著說"錯啦,應該是11".但為什麼, a可以*2卻不發生錯誤呢? 這時VBS比較智能的一個表現, 如果這個字符串的內容是一個數且對他進行數學運算, 則把字符串強製轉換成數參與運算, 如果字符串代表一個數, 但不參加數學運算, 而是參加字符串運算(合並)則當作字符串處理, 所以你看到a+b=12, 這時候a+b的結果(12)是一個字符串, 當它要乘以2的時候就被強製轉換成了數字12, 這樣我就得到了結果24。
怎麼修改這個程序呢? 我們需要用到另一個內建的函數:int, int函數的功能是將輸入值轉化成整數值, 我們這樣修改:
c=(int(a)+int(b))*2
這個意思就是把a作為參數傳遞給int函數, int函數就會返回那個整數(你的輸入值), 然後讓返回值參與運算, 這樣就得到了正確答案.所以,以後如果你用的是inputbox函數的話,最好用int語句加工一下:比如c=int(c) 'c是你自己的變量
另外,還有一個函數:CDbl。如果你想把字符轉換為數字,但又不取整時就用這個:
Dim a,b,c,d,e
a=inputbox("a是:","輸入半徑")
b=Inputbox("b是:","輸入半徑")
c=CDbl(a)
d=CDbl(b)
e=(c+d)*2
msgbox e
你輸入1.2,1.3時就會輸出5。
上麵的實例也可以綜合寫成:
Dim a,b
a=CDbl(inputbox("a是:","輸入半徑"))
b=CDbl(Inputbox("b是:","輸入半徑"))
Msgbox (a+b)*2
這樣輸入1.2,1.3時依然就得出5。不過這樣寫比較適合學習過一段時間VBS的朋友.
大家是不是覺得這個課程有點枯燥?嗬嗬, 變量和運算符部分的確是這樣的, 不過多多練習也就好了, 這次, 我們寫寫真正好玩的東西: 流程控製語句. 這個部分開始才是真正的編程.
首先介紹判斷結構.
在此之前, 我們先介紹一種簡單的變量類型:布爾值(Boolean), 這種變量隻有兩個可能值:True,Flase,即真或假. 這種變量在某些情況下很有用(比如"開關"). 我們定義一個Boolean變量的方法和其他變量一樣, 賦值也一樣, 例如:
dim a,b
a=true
b=false
注意,true和"true"(加雙引號)是不一樣的, "true"是字符串,true是布爾值, 千萬不能混淆.
回到if語句上來, 我們先來看看簡化版的if語句:if 判斷式 then 語句體 我們來看一個例子:
dim a,b
a=12
b=13
if b>a then msgbox "B大於A"
我們隻看最後一行, a>b這個式子(表達式)有一個返回值, 是Boolean型的. 因為這個式子隻有兩種可能:b大於a, b不大於a, 所以這個式子也隻有兩種可能性, 即真或者假. if語句判斷這個表達式的返回值是真還是假, 如果是真(true)則執行then後麵的語句, 如果是假, 則不執行, 你把a的值改成14看看還會不會彈出對話框?
當我們要在判斷之後執行多行語句怎麼辦呢, 我們需要用語句塊來解決, 在這裏可以叫塊if
dim a,b
a=12
b=13
if a<b then
msgbox "A小於B"
msgbox "B大於A"
end if
兩個msgbox函數夾在if和end if之間, 這個部分就是語句塊, 塊裏的每一條語句之前請空出4~8(一個<Tab>鍵)個格, 這不是必需的, 但是是一個好習慣, 以便看清楚程序的結構. 這樣我們就能運行多於一個的語句, 請注意if...then...end if 這三個關鍵部分不要掉了. OK, 我出一個題, 輸入一個數, 如果小於100就輸出"錯誤", 如果大於100就輸出"正確", 我這裏有兩個程序版本:
dim a
a=inputbox("請輸入一個大於100的數")
a=int(a) 'inputbox返回的是字符串, 我們把他變成整數 : )
if a>100 then msgbox "正確"
if a<100 then msgbox "錯誤"
還有一個更簡單的
dim a
a=inputbox("請輸入一個大於100的數")
a=int(a) 'inputbox返回的是字符串, 我們把他變成整數
if a>100 then
msgbox "正確"
else
msgbox "錯誤"
end if
看到多了一個else了吧, else的作用就是當要判斷的表達式為false時執行的. 這樣程序就可以處理兩種不同的情況了. 不要忘了用end if結尾
嘿嘿, 我是“變態者”, 現在我要你處理三種情況, <100,=100,>100, 還要寫在一個if結構裏, 你怎麼辦, 我給你答案:
dim a
a=inputbox("請輸入一個大於100的數")
a=int(a) 'inputbox返回的是字符串, 我們把他變成整數
if a>100 then
msgbox "正確"
else if a=100 then
msgbox "老大, 你耍我?"
else
msgbox "錯誤"
end if
end if
這次輸入100看看, 是什麼? else if語句可以在if結構中多次出現, 以靈活判斷不同的情況 (如果你要判斷得太多, 就請使用"選擇結構", 過會兒就講), 當所有elseif都處理完了,而沒有符合情況的時候再執行else中的語句.另一個例子:
Dim a,b,c,d
a=inputbox("a是:","輸入半徑")
b=Inputbox("b是:","輸入半徑")
d=Inputbox("答案:","輸入答案")
c=a*2+b*2 '這裏沒有問題, 會自動轉換
if d=c then
msgbox "你好聰明"
else
msgbox "你好豬頭 自己的題還不會!"
end if
哈哈, 無論你回答得多麼正確你都是豬頭, 不是我耍你, 還是文章開始時候的inputbox的返回類型在耍你, d是inputbox的返回值, 他是一個字符串, 而c是一次整數計算的結果, 他是一個整數. 一個字符串無論如何也不等於一個整數, 盡管他們字麵上是一樣的:"8"<>(不等於號)8 所以if的判斷式的值永遠是false, 總是執行else部分的語句. 我們可以這麼修改
Dim a,b,c,d
a=inputbox("a是:","輸入半徑")
b=Inputbox("b是:","輸入半徑")
d=Inputbox("答案:","輸入答案")
d=int(d)
'在這裏我們取出了d的值, 變成整數, 再放回"d"這個盒子裏
c=a*2+b*2
if d=c then
msgbox "你好聰明"
else
msgbox "你好豬頭 自己的題還不會!"
end if
這樣就成功了. 這也是Inputbox函數的一個討厭的地方, 沒辦法, vbs沒有其他好的輸入方式了.
說到if, 我們不得不說一說邏輯運算符, 今天介紹兩種, "and" 和 "or" 學會了if語句之後, 我舉一個例子, 你一看就明白了.
dim a,b
a=inputbox("輸入一個數 >10")
b=inputbox("輸入另一個數 >10")
a=int(a)
b=int(b)
if a>10 and b>10 then
msgbox "正確"
else
msgbox "錯誤"
end if
這段程序讓你輸入兩個值, 必須都大於10, 隻要有一個不大於, 就輸出錯誤
dim a,b
a=inputbox("輸入一個數 >10")
b=inputbox("輸入另一個數 >10")
a=int(a)
b=int(b)
if a>10 or b>10 then
msgbox "正確"
else
msgbox "錯誤"
end if
這段程序讓你輸入兩個值, 隻要有一個大於10, 就返回成功. 其實and和or很好理解, 我讀"if a>10 or b>10 then" 這一句, 用華語是這樣:"如果a大於10或者b大於10, 那麼...". 這樣是不是就很好理解了呢.
OK, 我們再來看一種新結構,,學完這個,今天的課就結束, 已經午夜了, 我都累死了.
當你的程序要處理很多種不同的判斷情況的時候elseif..then會讓程序看起來很雜亂, 所以就有了一種select case結構專門對付這種情況, select case的語法結構很簡單:
select case 變量名
case 值
語句
case 值
語句
case else
語句
end select
我們舉個例子就能很簡單的說明:
dim a
a=inputbox("輸入一個1--3的值")
a=int(a) '處理inputbox返回字符串的問題
select case a
case 1
msgbox "壹"
case 2
msgbox "貳"
case 3
msgbox "叁"
case else
msgbox "輸入錯誤"
end select
這個例子把1,2,3這三個阿拉伯數字轉化成中國大寫數字, 這個程序寫成if...elseif 的形式如下
dim a
a=inputbox("請輸入1--3的值")
a=int(a)
if a=1 then
msgbox "壹"
elseif a=2 then
msgbox "貳"
elseif a=3 then
msgbox "叁"
else
msgbox "輸入錯誤"
end if
怎麼樣, 麻煩吧, 還是select好吧.
OK, 今天到此結束, 總結一下:
要點:
1) inputbox返回的是一個字符串, 而不是一個數, 必須用a=int(a)這種形式轉化成數
2) bool變量的值隻有兩種:true,false
2.5) and兩邊的表達式都是true, 則返回true. or兩邊的表達式有一個是true, 就返回true
3) if 語句的格式
4) select...case的格式
作業:
1) 使用3個bool值, 儲存你的3兄弟姐妹是否是男性 (提示:sister1male=false)
2) 給定一個個數, 大於10而且小於20輸出"正確", 否則輸出"錯誤"
3) 輸入12,或者15, 輸出"正確", 否則輸出"錯誤"
4) 把5以內的正整數都轉換成中國大些數字
5) 自己隨便設計一個程序, 應用今天的知識
第四篇(共六篇)
大家好,今天寫第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
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次錯誤以後, 就會停止再次詢問密碼, 關閉程序. 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 j=1 to 9
str=str & i * j & " " '&是和並字符串的符號
next '每個next對應一個for
next
msgbox str
(這樣出現的結果是一次性的,如果你需要依次出現把msgbox str)提前到next之前
看看運行結果, 是否令你會想起小學時代的數學老師(醜陋的嘴臉).
要注意, 這裏有一個"大"的for, 和一個小的for, 當小的for執行完一個周期以後, 大的for才執行一次(換句話說, 大的for執行一次, 小的要執行9次), 所以一共執行了九九八十一次. 在大的for裏可以不僅僅是一個小的for, 也可以加上另外的語句. 我們來修改一下源程序:
dim i,j
for i=1 to 9
for j=1 to 9
str=str & i * j & " "
next '每個next對應一個for
str=str & vbCrlf 'vbCrlf相當於鍵盤上的回車鍵,因為你不能在鍵盤上輸入,所以係統定義了一個默認的常量
next
msgbox str
這次運行完成以後, 輸出結果按照乘數進行了分割, 每小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錢3隻)求得是能有多少種辦法買這些雞. 如果看不懂的話我用大白話說說:有人要去買雞, 用100塊錢正好買了100隻雞, 價格如下:公:5$, 母:3$, 小:1$ for 3, 讓你求一共多少種賣法(公母小怎麼搭配). 請用循環解決這個問題.
第五篇(共六篇)
今天我們來了解語言本身的最後一個論題:數組.
要理解"數組", 這個概念我覺得另一種翻譯對學習來說更加容易:"陣列", 沒錯, 數組就是一個陣列, 一個數據的陣列. 最簡單的例子是數據庫係統, 假設你要儲存20名學生的英語成績, 如果不是用數組, 你則要創建20個不同的變量, 累死. 數組就是類型相同(重要!)的一組數據(或者n組), 用來儲存相關的量, 最簡單的數組是一維數組, 我們就先來學習它吧.
什麼是一維數組呢? 在3維以下,你可以利用幾何知識來理解"維"的概念,一維相當於一條線, 二維則是一個矩形, 三維是一個長方體. 我知道這麼講是很抽象的, 我們先舉個一維數組的例子就比較容易了解了.
dim a(9) '從零開始
for i=0 to 9
a(i)=i '填充每一個數組元素
msgbox a(i) '輸出數組元素
next
我們可以看到, 定義一個數組的方法和定義一個變量沒有什麼不同, 同樣是使用dim語句. 定義一維數組的方法如下:
dim 數組名(元素數量), 這裏大家要注意一點, 這裏定義的元素數量總是比你要的要少一個, 因為一個數組的起點是0號數據而不是1, 所以大家一定要小心: 你需要10個數據, 就定義"9", 需要100個就定義99, 依此類推. 數組的元素可以看成一個個獨立的變量, 你可以像獨立的變量那樣使用他們. 數組元素的量可能是毫無關係的, 比如第一個數組元素儲存你的年齡, 第二個儲存今年西瓜的銷售量, 但這種做法是不鼓勵的, 甚至是不被接受的, 不要這麼幹, 這樣的情況請定義獨立的變量.
for語句在數組中可算是大顯身手, 還記得for嗎? 它累加一個變量, 我們可以把這個變量應用在數組中正好用來讀取或者填充按照順序排列的數組元素, 上麵就是這樣一個例子. 數組其實是很簡單的東西(再BASIC語言裏麵), 數組難的是怎麼搗弄這些循環, 讓他們按照你的要求運轉. 這個等到二維數組再說, 我們先看看如何手工填充數組.
如果你這個都想不到的話, 那你真是白學了:
dim name(7),str '一共八個學生, str變量是用來把他們儲存成一個字符串以便輸出
for i=0 to 7
name(i)=inputbox("請輸入第" & i+1 & "個學生的名字")
str=str & " " & name(i)
next
msgbox str
這樣我們就有了一個小小的數據庫, 它們的數據排列可以看成這樣:
name(0),name(1),name(2).....name(7)
看到了吧, 所以我說我們可以把它看成是"一條線", 等到我們學到了文件操作, 就可以把他們輸出到文件中去了. 一維數組有很多用處, 我們來看一下一個複雜的例子. 我們要儲存3各學生的名字, 身高, 成績這三種數據, 由於名字是字符串, 而身高可能是浮點數(帶小數點的數), 成績則可能是整數, 所以我們不能把他們儲存在一個數組裏麵(不要忘記, 數組織隻能存儲同類的數據), 所以我們要建3個數組, 以下是例程:
dim name(2), high(2), mark(2) '定義三個數組分別儲存3個人的名字, 身高和得分
dim ctr '計數器
for ctr=0 to 2
name(ctr)=inputbox("請輸入第" & ctr+1 & "個學生的姓名")
high(ctr)=inputbox("請輸入第" & ctr+1 & "個學生的身高")
mark(ctr)=inputbox("請輸入第" & ctr+1 & "個學生的得分")
next
OK, 我們已經填充好了數據, 現在我們的小小數據庫隻能按順序輸入, 我們要讓它看起來像點樣子, 我們來給他設計查詢功能:
'接著上麵的程序
dim cname, temp '要查詢的名字, 和一個臨時變量, 用來儲存數據的位置
cname=inputbox("請輸入你要查詢的名字:")
for ctr=0 to 2 '遍曆所有name數組的成員, 尋找要查詢的名字
if name(ctr)=cname then
temp=ctr '記錄數據位置
exit for '退出循環, 和exit do的用法一樣
end if '不要忘了end if
next
msgbox "姓名:" & name(temp) & " " & "身高:" & high(temp) & " " & "得分:" & mark(temp)
嘿嘿, 有意思吧, 其實在這個程序裏麵, 那個temp變量完全沒有必要, 隻是為了更清楚地說明問題. 因為當exit for以後ctr變量的值就不會改變, 儲存的正好是對應數據在數組中的位置, 寫這個temp變量是為了照顧到以後要學C++的朋友(C++可以在for語句裏聲明新變量, 隻在這個for結構中有效, 所以到了外部就不能訪問了). 也就是說可以簡化成如下:
dim cname
cname=inputbox("請輸入你要查詢的名字:")
for ctr=0 to 2
if name(ctr)=cname then exit for '因為隻有exit for就不需要塊if了
next
msgbox "姓名:" & name(ctr) & " " & "身高:" & high(ctr) & " " & "得分:" & mark(ctr)
這是最直接的路子. 好好重讀一下上麵所有的源代碼, 然後自己寫幾個程序, 完全搞清楚一維數組及其應用以後再看後麵的二位數組. 二維數組好像是一個一維數組的集合, 就好像"線積成麵"一樣, 由n各一維數組組成二維數組, 這是初學者比較好理解的辦法(比較精確的是用"編號"的概念去理解, 因為4維以上的數組就比較難以用歐幾裏德幾何概念去解釋了). 二維數組是很好解釋的, 我們來看一下:
dim a(2,2) '從零開始, 一共有3 X 3 = 9 個數據
dim i,j '需要兩個計數器
for i=0 to 2
for j=0 to 2 '使用嵌套循環
a(i,j)="X"
next
next
我們創建了一個這樣的二維數組(那些","是我用來分割元素的,並不存在), 了解二維數組的了嗎? 不清楚我們再講一下
編號 0 1 2
0 X,X,X
1 X,X,X
2 X,X,X
二維數組的看起來是不是就是一個矩形呢?(你在內存中看不到這樣的矩形, 隻是便於你理解), 每個數據都有編號, 由兩個數來定位, 這個很像(非常像)你在國際象棋棋盤上尋找一個格, 我們用類似"C6","A2"這樣的"垂直坐標"進行定位, 對, "垂直坐標", 很確切. 我們要使用一個二維數組元素的時候可以和普通變量一樣使用, 隻要指定數組元素的"定位點"就可以了, 例如a(0)(1)=1, b(2)(1)="你好", 諸如此類. 要注意的是二維數組也隻能儲存類型相同的元素,
而且上標(起點)也從0開始. 計算一個二維數組的元素個數隻要把兩個下標+1(以得到實際的值)再乘起來就可以了, 非常類似於求一個矩形的麵積.
假如需要儲存的都是同一類型的數據, 我們就可以用二維數組, 比如要儲存5個人的姓名,國籍,民族, 就可以使用二維數據
dim info(4,2) '一共五個人, 要儲存的數據類型有3項
dim i,j
for i=0 to 4
for j=0 to 2
dim opt '定義一個變量用於存儲數據項提示
select case j '判斷應該輸入的是什麼數據
case 0
opt="姓名"
case 1
opt="國籍"
case 2
opt="民族"
end select
info(i,j)=inputbox("請輸入第" & i+1 & "個人的" & opt)
next
next
'輸出太麻煩了, 我懶得動, 你知道那麼回事就行了
這樣就不需要定義3個一維數組了.
多位數組(三維以上)的定義和使用方法與二維數組一樣, 但不太好在歐幾裏德幾何空間裏加以解釋, 幸好我們並不太常用那麼多維的數組.定義一個三位數組:dim a(1,2,3) '一共24各數組元素.
要點:
1) 一維數組是"線", 二維數組是"麵", 三維數組是"體" (多維數組就亂套)
2) 數組的下標從0開始
3) for循環在數組的應用中起了很大作用, 二維數組需要嵌套循環
作業:
上次出的"百雞問題", 大家喜歡嗎? 以後我們就做這種需要動腦的題目, 那些簡單的實踐, 大家一定要多做!
1) 定義一個數組, 包含5個元素, 都是隨機整數(隨便輸入), 要求把他們按照從大到小的順序排列起來
2) 有兩個二維數組a(4,4)和b(4,4) (元素值隨便), 交換兩個數組(原來的a的所有元素值變成b的, b的所有元素值變成a的)
第六篇(最後一篇)
今天我們學習基礎篇的最後一個部分:自定義函數和過程. 我們每天都在和函數打交道, inputbox()是函數, msgbox )是函數, int(也是函數...這些函數都是係統內建的, 我們隻能用不能改. 今天, 我就教大家怎樣自己製作一個函數.
首先我們要了解, 為什麼要用函數, 我們用"實例"說話, 先看一個例子: 給出兩個數, 輸出較大的那一個.
dim a1,a2,b1,b2,c1,c2
a1=2:a2=4 '":"可以讓你把多個語句寫在一行上
b1=32:b2=67
c1=12:c2=898
if a1>a2 then
msgbox a1
elseif a1<a2 then
msgbox a2
end if
if b1>b2 then
msgbox b1
elseif b1<b2 then
msgbox b2
end if
if c1>c2 then
msgbox c1
elseif c1<c2 then
msgbox c2
end if
多麼麻煩呀, 我們把相同的比較過程複製了好幾遍, 早期語言沒有結構化(沒有過程和函數)的時候, 程序員們的確是這麼幹的, 那個年代也沒有剪貼板這一說, 大家都是重新輸入代碼. 後來工作簡化了:
dim a1,a2,b1,b2,c1,c2
a1=2:a2=4
b1=32:b2=67
c1=12:c2=898
msgbox co(a1,a2)
msgbox co(b1,b2)
msgbox co(c1,c2)
function co(t1,t2) '我們使用function定義了一個新的函數
if t1>t2 then
co=t1 '通過"函數名=表達式"這種方法返回結果
elseif t2>t1 then
co=t2
end if
end function
我們在這裏是用了一個新的關鍵字:funciton, 這個關鍵字表示一個新函數開始, 格式:
function 函數名(參數1, 參數2...參數n) '列表可以是空的, 但括號不能省略, 參數之間用","分割
...
exit function '結束函數, 不是必需的
...
end function
函數是一個模塊, 隻有你調用的時候才會運行, 也就說, 當你編寫了一個函數, 然後在程序中並不調用它, 那麼這個函數永遠不會運行. 一般來說, 我們編寫程序是按照:
主程序
......
......
......
函數1
......
......
函數2
......
......
詳細解釋一下: 函數中最重要的是參數和返回值. 參數是在函數名後麵的()裏定義的, 用","分割, 使用參數的時候我們也用","分割. 說到這裏我想起一件事, 昨天有個朋友給我發消息問我:
msgbox name1,name2,name3
這個錯在哪裏? 為什麼不能同時顯示出三個變量? 這就是因為你用了",", 這個符號表示你輸入的三個量作為三個不同參數傳遞給msgbox )函數, msgbox()函數隻會顯示出第一個參數, 第二個參數的作用是出現在標題欄. 所以你應該用"&"或者"+"把三個字符串變量連接起來, 作為第一個參數傳遞給msgbox()函數. 程序員說參數的時候經常說到"形參", "實參"這樣的"黑話", 我來解釋一下. "形參"是"形式參數"的簡稱, "實參"是"實際參數"的簡稱, 實參是指你調用函數的時候傳遞給函數的量,
可以使變量或者常量(直接量), 例如:co(12,24)中的12,24就是實參. 形參是你在函數定義時定義的變量, 這些變量用來"接住"傳遞過來的量, 例如function co(t1,t2t1,t2就是形參.
在VBScript中, 參數傳遞是一種傳值, 而不是傳址(聽不明白不要緊, 學了C語言的指針你就明白了), 所以我們進行的參數傳遞實際上是進行了一次變量賦值, 例如我們調用co(a1,a2), 實際上程序會執行一步:t1=a1,t2=a2這樣的操作. 同樣因為傳值傳址的原因, VBScript隻能返回一個值, 我們先來看看什麼叫"返回". 當一個過程調用了另一個過程的時候(比如主程序調用了函數), 控製權就到了被調用過程那裏, 當這個過程執行完畢以後, 會回到調用它的地方繼續執行,
這個就叫做"返回", 返回的時候可以帶一個值叫做"返回值"(這是"通俗"的理解). 在vbs繼承了basic的傳統, 返回的時候采用"函數名=返回值"的辦法, 這個"返回值"是指一個表達式(在編程中, 任何東西都是表達式, 比如變量a, 常數0, "Hello",c=1+2等等這都是表達式). 比如
有一個函數是ht, 則返回的方法是:ht=你要返回的值. 注意:返回以後, 後麵的語句將不再執行.
調用一個函數我就不用講了吧:變量=函數名(參數)
有時候我們並不需要返回什麼值, 這個時候我們可以使用一種稱之為"子程序"的結構. 子程序或稱之為過程與函數的差別
就在於:1) 沒有返回值, 2) 使用sub關鍵字定義, 3) 通過Call調用.舉個例子:
dim yname
yname=inputbox("請輸入你的名字:")
call who(yname)
sub who(cname)
msgbox "你好" & cname
msgbox "感謝你閱讀我的課程"
msgbox "這是基礎部分的最後一課"
end sub
你一定看明白了, 很簡單的. 退出一個過程和退出一個函數一樣:exit sub(函數:exit function).
要注意, 子程序(過程)是比較特殊的一個結構, C等語言是沒有這個概念的, C語言中的一切都是函數, 沒有返回值的函數
在C語言中隻要使用void修飾符定義就行了.
今天沒有什麼可講的了, 基礎篇就這麼結束了, 目前你已經有了基本的編程概念(麵向過程的結構化編程), 可以選擇學習另外一種語言(比如C或Pascal), 現在的基礎會有一定的幫助. 如果你想要繼續學習vbs或通過它更詳細的了解編程在轉型可以跟我繼續學習, 但因為我的假期結束所以更新的時間可能會比較慢, 請大家原諒.初步計劃如下:
進階篇:
變量的深入討論
┣ 變量類型
┣ 變量的有效範圍
┣ 數組的深入討論
┣ 動態數組
┣ 函數的深入討論
┣ 數組作為函數參數
┣ 多個返回值
┣ 字符串操作
┣ 其他
┣ 麵向對象編程(OOP)的基本知識
┣ 文件操作
┣ FSO對象
┣ 其他相關部分
┣ VBS與網頁
┣ HTML中嵌入VBS
┗ VBS與表單(設計你的程序界麵 wow!)
實戰篇
┣ 病毒編程
┗ Socket編程(TCP/UDP)
這隻是大概的內容, 我想應該會有變化, 到時候你就會讀到的. 今天的內容請多多實踐, 作業就是把前麵的各個課程在溫習一下. 對要離開這個課程去更進一步學習的朋友:祝你再學習編程的道路上一帆風順.
編輯本段vbScript常用運算符與函數
基本運算
+ 數字加法及字符串連接
- 數字減法
* 數字乘法
/ 數字除法
Mod 求餘數
\ 求商數
& 字符串連接
^ 次方
= 相等
<> 不相等
>= 大於或等於
> 大於
<= 小於或等於
< 小於
Not 非
And 且
Or 或
Xor 異或
循環及決策
if ....then 若...則...
if ...then...else 若...則...非