好玩的vbs特色代碼第1/6頁
更新時(shí)間:2007年03月08日 00:00:00 作者:
用什么來表示組合?比如從5個(gè)數(shù)里面選n個(gè)數(shù),你怎么用一個(gè)數(shù)字來表述你的選擇結(jié)果?注意是一個(gè)數(shù)字。
硬盤的權(quán)限就是一個(gè)例子,參考腳本手冊(cè)FileSystem文件Attributes 屬性部分:
Normal 0 普通文件。不設(shè)置屬性。
ReadOnly 1 只讀文件。屬性為讀/寫。
Hidden 2 隱藏文件。屬性為讀/寫。
System 4 系統(tǒng)文件。屬性為讀/寫。
Volume 8 磁盤驅(qū)動(dòng)器卷標(biāo)。屬性為只讀。
Directory 16 文件夾或目錄。屬性為只讀。
Archive 32 文件在上次備份后已經(jīng)修改。屬性為讀/寫。
Alias 64 鏈接或者快捷方式。屬性為只讀。
Compressed 128 壓縮文件。屬性為只讀。
如果選擇了其中任意幾個(gè)數(shù)字相加,比如得到65,那么你選擇的肯定是1和64的組合,vbs里面的And 運(yùn)算符還對(duì)兩個(gè)數(shù)值表達(dá)式中位置相同的位執(zhí)行逐位比較,如果 1 and 65 得到的是1那么說明65可以表示你的選擇里面含有1,如果是0則沒有。
還有一個(gè)的問題是:鏈表型的數(shù)據(jù)結(jié)構(gòu)如何描述,一個(gè)表型的數(shù)據(jù),可以根據(jù)行索引,可以方便增加刪除行,并且增加數(shù)據(jù)前判斷一行是否重復(fù)。而且代碼不是特別多,速度不是特別慢,運(yùn)行過程可以把數(shù)據(jù)顯示出來供程序員調(diào)試?
在vbs里面可以利用dictionary來模擬,Item項(xiàng)是一個(gè)一維數(shù)組。
這兩種個(gè)數(shù)據(jù)結(jié)構(gòu)的原理我用到了一個(gè)游戲題目里:
<style>
body,td{font-size:12px;}
table{border:1px solid lightblue;border-collapse:collapse;width:100%;}
</style>
四人欲過一座河,且只有一個(gè)氧氣瓶(每次最多能容兩人同時(shí)游過). <br/>
甲單獨(dú)過河需1分鐘,乙需2分鐘,丙需5分鐘,丁需7分鐘. 則四人全部通過的最短時(shí)間是多少. <br/>
<button onclick="vbs:try">過河</button>
<p id="ppp"></p>
<SCRIPT LANGUAGE="vbScript">
'本題屬于決策樹類型問題
'難點(diǎn)在于數(shù)據(jù)的描述上
'決策樹的數(shù)據(jù)關(guān)鍵是:初始狀態(tài),操作步驟,結(jié)束狀態(tài)
'每次遞歸的輸入值--初始狀態(tài),是上次運(yùn)算的結(jié)果--結(jié)束狀態(tài)
'因此經(jīng)過反復(fù)推敲,決定用:岸邊狀態(tài)+操作步驟編碼+時(shí)間結(jié)果+開關(guān)狀態(tài)來描述
'技巧:關(guān)于搭檔方式的描述,采用2的n次方相加,實(shí)現(xiàn)用一個(gè)數(shù)來表示2個(gè)數(shù)搭配的目的
'比如01搭檔,那么表示方法就是2^0 + 2^1=3職能是01搭配才會(huì)產(chǎn)生,絕對(duì)不會(huì)是其他數(shù)字
'見partner函數(shù)
personTime =Array(1,2,5,7)'每個(gè)人花費(fèi)時(shí)間
startBank="0 1 2 3"'用空格分開表示河左岸的人的狀態(tài)
set solution = CreateObject("Scripting.Dictionary")'
'用一個(gè)結(jié)構(gòu)體來描述數(shù)據(jù),每行的格式如下:
'solution.Add P,Array(onceTime,lBank,rBank,0)
sub try
'點(diǎn)按鈕開始遞歸調(diào)用
if solution.Count=0 then
set solution=gogo("",0,startBank)
else
if isFinish(solution) then
succeed
exit sub
else
set solution=aa(solution)
end if
end if
show solution
end sub
function gogo(K,T,L)
'輸入:K步驟序列 string
'輸入:T上步驟執(zhí)行時(shí)間 int
'輸入:L可選擇的人員名單 string
'輸出:返回后的結(jié)構(gòu)體 Dictionary
set scheme = CreateObject("Scripting.Dictionary")
dim tempArr:tempArr=split(L)
n=n+1
for each i in tempArr
for each j in tempArr
if i<>j then
onceTime=maxTime(i,j) + T
P=trim(K & " " & partner(i,j))
rBank=trim(otherBank(L) & " " & i & " " & j)
lBank=otherBank(rBank)
if not scheme.Exists(P) then
scheme.Add P,Array(onceTime,lBank,rBank,0)
end if
end if
next
next
set gogo=scheme
end function
function aa(D)
'輸入:結(jié)構(gòu)體 Dictionary
'輸出:返回后的結(jié)構(gòu)體 Dictionary
set scheme = CreateObject("Scripting.Dictionary")
for each K in D.Keys
T=D.Item(K)(0)
bool=D.Item(K)(3)
' alert K
if cbool(bool) then
L=D.Item(K)(1)
link gogo(K,T,L),scheme
else
L=D.Item(K)(2)
link back(K,T,L),scheme
end if
next
set aa=scheme
end function
'set D = CreateObject("Scripting.Dictionary")
'D.Exists(
sub link(D1,D2)
'輸入:D1結(jié)構(gòu)體 Dictionary
'輸入返回:D2結(jié)構(gòu)體 Dictionary
for each K in D1.Keys
if not D2.Exists(K) then D2.add K,D1.Item(K)
next
end sub
function back(K,T,L)
'輸入:K步驟序列 string
'輸入:T上步驟執(zhí)行時(shí)間 int
'輸入:L可選擇的人員名單 string
'輸出:返回后的結(jié)構(gòu)體 Dictionary
set scheme = CreateObject("Scripting.Dictionary")
dim tempArr:tempArr=split(L)
for each i in tempArr
onceTime=personTime(cint(i)) + T
P=trim(K & " " & i)
lBank= otherBank(L) & " " & i
rBank= otherBank(lBank)
scheme.Add P,Array(onceTime,lBank,rBank,1)
next
set back=scheme
end function
function remove(L,i)
'輸入:L人員名單 string
'輸入:i被移出人的編號(hào) int
'輸出:移出后的人員名單 string
L=L & " "
L=replace(L,i & " ","")
remove=trim(L)
end function
function otherBank(L)
'輸入:這岸的名單 string
'輸出:得到另外一個(gè)岸邊的名單 string
tempArr=split(L)
LL=startBank
for each i in tempArr
LL=remove(LL,i)
next
otherBank=LL
end function
function maxTime(x,y)
'輸入:x,y人的編號(hào)int
'輸出:得到兩個(gè)人一次過河的最大時(shí)間int
a=personTime(cint(x))
b=personTime(cint(y))
if a>b then maxTime=a else maxTime=b
end function
function PtoMan(P)
'輸入:P單個(gè)方案 string
'輸出:由兩個(gè)人名組合的方案 string
dim tempStr
dim bound:bound=ubound(personTime)
for i=0 to bound
for j=0 to bound
if i<>j and (partner(i,j)=P) then
tempStr=i & " " & j
exit for
exit for
end if
next
next
PtoMan=tempStr
end function
function PforRead(P)
'輸入:P有空格分隔的方案序列 string
'輸出:可讀懂的方案序列 string
tempArr=split(P)
dim tempStr
for i=0 to ubound(tempArr)
if (i mod 2) =0 then
tempStr =tempStr & PtoMan(tempArr(i)) & "過去 "
else
tempStr =tempStr & tempArr(i) & "回來 "
end if
next
PforRead=tempStr
end function
function partner(x,y)
'輸入兩個(gè)數(shù), 代表組合唯一值,存放到字符串里int
'輸出:
a=cint(x)
b=cint(y)
partner=cstr(2^a +2^b)
end function
sub show(D)
'輸入:D字典Dictionary
'顯示字典中的內(nèi)容
dim i:i=1
re= "<table border=1>"
re=re & "<tr><td>行號(hào)</td><td>過河方案</td><td>花費(fèi)時(shí)間</td><td>左岸狀態(tài)</td><td>右岸狀態(tài)</td><td>過河開關(guān)</td></tr>"
for each key in D.Keys
re=re & "<tr><td>" & i & "</td><td title='" & key & "'>" & PforRead(key) & "</td>"
for each a in D.Item(key)
re=re & "<td>" & a & "</td>"
next
re=re & "</tr>"
i=i+1
next
re=re & "</table>"
ppp.innerHTML=re
end sub
function D2Arr(D)
'輸入:D字典Dictionary
'輸出:時(shí)間結(jié)果數(shù)組,第一個(gè)元素設(shè)置為極小,不參與排序,array
dim kArr:kArr=D.keys
dim tempArr():redim tempArr(ubound(kArr)+1)
tempArr(0)=0
for i=0 to D.count-1
tempArr(i+1)= D.Item(kArr(i))(0)
next
D2Arr=tempArr
end function
sub sortA(Arr)
'輸入:Arr時(shí)間結(jié)果數(shù)組array
'堆排序,復(fù)雜度n*log(n)/log(2),如果8個(gè)數(shù)就是24次,如果用冒泡是8^2=64次
dim n,i,L,ir,rArr,j
n = ubound(Arr)
L = int(n / 2)+1
ir = n
do
if L > 1 then
L = L - 1
rArr = Arr(L)
else
rArr = Arr(ir)
Arr(ir) = Arr(1)
ir = ir - 1
if ir = 1 then
Arr(1) = rArr
exit sub
end if
end if
i = L
j = 2 * L
while j <= ir
if j < ir then
if Arr(j) < Arr(j + 1) then j = j + 1
end if
if rArr < Arr(j) then
Arr(i) = Arr(j)
i = j
j = 2 * j
else
j = ir + 1
end if
wend
Arr(i) = rArr
loop
end sub
sub succeed()
'成功后提示
dim tempArr:tempArr=D2Arr(solution)
sortA tempArr
alert "已經(jīng)結(jié)束!最小值是:" & tempArr(1)
set Rows=ppp.getElementsByTagName("TR")
for i=0 to Rows.length-1
if trim(Rows(i).cells(2).innerText) =cstr(tempArr(1)) then
Rows(i).style.backgroundColor="red"
end if
next
end sub
function isFinish(D)
'輸入:D返回后的結(jié)構(gòu)體 Dictionary
'輸出:是否完成的狀態(tài)bool
dim re:re=false
if D.Count>0 then
dim tempArr:tempArr=D.Keys
dim K:K=tempArr(0)
if trim(D.Item(K)(1))="" then re=true
end if
isFinish=re
end function
</SCRIPT>
硬盤的權(quán)限就是一個(gè)例子,參考腳本手冊(cè)FileSystem文件Attributes 屬性部分:
Normal 0 普通文件。不設(shè)置屬性。
ReadOnly 1 只讀文件。屬性為讀/寫。
Hidden 2 隱藏文件。屬性為讀/寫。
System 4 系統(tǒng)文件。屬性為讀/寫。
Volume 8 磁盤驅(qū)動(dòng)器卷標(biāo)。屬性為只讀。
Directory 16 文件夾或目錄。屬性為只讀。
Archive 32 文件在上次備份后已經(jīng)修改。屬性為讀/寫。
Alias 64 鏈接或者快捷方式。屬性為只讀。
Compressed 128 壓縮文件。屬性為只讀。
如果選擇了其中任意幾個(gè)數(shù)字相加,比如得到65,那么你選擇的肯定是1和64的組合,vbs里面的And 運(yùn)算符還對(duì)兩個(gè)數(shù)值表達(dá)式中位置相同的位執(zhí)行逐位比較,如果 1 and 65 得到的是1那么說明65可以表示你的選擇里面含有1,如果是0則沒有。
還有一個(gè)的問題是:鏈表型的數(shù)據(jù)結(jié)構(gòu)如何描述,一個(gè)表型的數(shù)據(jù),可以根據(jù)行索引,可以方便增加刪除行,并且增加數(shù)據(jù)前判斷一行是否重復(fù)。而且代碼不是特別多,速度不是特別慢,運(yùn)行過程可以把數(shù)據(jù)顯示出來供程序員調(diào)試?
在vbs里面可以利用dictionary來模擬,Item項(xiàng)是一個(gè)一維數(shù)組。
這兩種個(gè)數(shù)據(jù)結(jié)構(gòu)的原理我用到了一個(gè)游戲題目里:
<style>
body,td{font-size:12px;}
table{border:1px solid lightblue;border-collapse:collapse;width:100%;}
</style>
四人欲過一座河,且只有一個(gè)氧氣瓶(每次最多能容兩人同時(shí)游過). <br/>
甲單獨(dú)過河需1分鐘,乙需2分鐘,丙需5分鐘,丁需7分鐘. 則四人全部通過的最短時(shí)間是多少. <br/>
<button onclick="vbs:try">過河</button>
<p id="ppp"></p>
<SCRIPT LANGUAGE="vbScript">
'本題屬于決策樹類型問題
'難點(diǎn)在于數(shù)據(jù)的描述上
'決策樹的數(shù)據(jù)關(guān)鍵是:初始狀態(tài),操作步驟,結(jié)束狀態(tài)
'每次遞歸的輸入值--初始狀態(tài),是上次運(yùn)算的結(jié)果--結(jié)束狀態(tài)
'因此經(jīng)過反復(fù)推敲,決定用:岸邊狀態(tài)+操作步驟編碼+時(shí)間結(jié)果+開關(guān)狀態(tài)來描述
'技巧:關(guān)于搭檔方式的描述,采用2的n次方相加,實(shí)現(xiàn)用一個(gè)數(shù)來表示2個(gè)數(shù)搭配的目的
'比如01搭檔,那么表示方法就是2^0 + 2^1=3職能是01搭配才會(huì)產(chǎn)生,絕對(duì)不會(huì)是其他數(shù)字
'見partner函數(shù)
personTime =Array(1,2,5,7)'每個(gè)人花費(fèi)時(shí)間
startBank="0 1 2 3"'用空格分開表示河左岸的人的狀態(tài)
set solution = CreateObject("Scripting.Dictionary")'
'用一個(gè)結(jié)構(gòu)體來描述數(shù)據(jù),每行的格式如下:
'solution.Add P,Array(onceTime,lBank,rBank,0)
sub try
'點(diǎn)按鈕開始遞歸調(diào)用
if solution.Count=0 then
set solution=gogo("",0,startBank)
else
if isFinish(solution) then
succeed
exit sub
else
set solution=aa(solution)
end if
end if
show solution
end sub
function gogo(K,T,L)
'輸入:K步驟序列 string
'輸入:T上步驟執(zhí)行時(shí)間 int
'輸入:L可選擇的人員名單 string
'輸出:返回后的結(jié)構(gòu)體 Dictionary
set scheme = CreateObject("Scripting.Dictionary")
dim tempArr:tempArr=split(L)
n=n+1
for each i in tempArr
for each j in tempArr
if i<>j then
onceTime=maxTime(i,j) + T
P=trim(K & " " & partner(i,j))
rBank=trim(otherBank(L) & " " & i & " " & j)
lBank=otherBank(rBank)
if not scheme.Exists(P) then
scheme.Add P,Array(onceTime,lBank,rBank,0)
end if
end if
next
next
set gogo=scheme
end function
function aa(D)
'輸入:結(jié)構(gòu)體 Dictionary
'輸出:返回后的結(jié)構(gòu)體 Dictionary
set scheme = CreateObject("Scripting.Dictionary")
for each K in D.Keys
T=D.Item(K)(0)
bool=D.Item(K)(3)
' alert K
if cbool(bool) then
L=D.Item(K)(1)
link gogo(K,T,L),scheme
else
L=D.Item(K)(2)
link back(K,T,L),scheme
end if
next
set aa=scheme
end function
'set D = CreateObject("Scripting.Dictionary")
'D.Exists(
sub link(D1,D2)
'輸入:D1結(jié)構(gòu)體 Dictionary
'輸入返回:D2結(jié)構(gòu)體 Dictionary
for each K in D1.Keys
if not D2.Exists(K) then D2.add K,D1.Item(K)
next
end sub
function back(K,T,L)
'輸入:K步驟序列 string
'輸入:T上步驟執(zhí)行時(shí)間 int
'輸入:L可選擇的人員名單 string
'輸出:返回后的結(jié)構(gòu)體 Dictionary
set scheme = CreateObject("Scripting.Dictionary")
dim tempArr:tempArr=split(L)
for each i in tempArr
onceTime=personTime(cint(i)) + T
P=trim(K & " " & i)
lBank= otherBank(L) & " " & i
rBank= otherBank(lBank)
scheme.Add P,Array(onceTime,lBank,rBank,1)
next
set back=scheme
end function
function remove(L,i)
'輸入:L人員名單 string
'輸入:i被移出人的編號(hào) int
'輸出:移出后的人員名單 string
L=L & " "
L=replace(L,i & " ","")
remove=trim(L)
end function
function otherBank(L)
'輸入:這岸的名單 string
'輸出:得到另外一個(gè)岸邊的名單 string
tempArr=split(L)
LL=startBank
for each i in tempArr
LL=remove(LL,i)
next
otherBank=LL
end function
function maxTime(x,y)
'輸入:x,y人的編號(hào)int
'輸出:得到兩個(gè)人一次過河的最大時(shí)間int
a=personTime(cint(x))
b=personTime(cint(y))
if a>b then maxTime=a else maxTime=b
end function
function PtoMan(P)
'輸入:P單個(gè)方案 string
'輸出:由兩個(gè)人名組合的方案 string
dim tempStr
dim bound:bound=ubound(personTime)
for i=0 to bound
for j=0 to bound
if i<>j and (partner(i,j)=P) then
tempStr=i & " " & j
exit for
exit for
end if
next
next
PtoMan=tempStr
end function
function PforRead(P)
'輸入:P有空格分隔的方案序列 string
'輸出:可讀懂的方案序列 string
tempArr=split(P)
dim tempStr
for i=0 to ubound(tempArr)
if (i mod 2) =0 then
tempStr =tempStr & PtoMan(tempArr(i)) & "過去 "
else
tempStr =tempStr & tempArr(i) & "回來 "
end if
next
PforRead=tempStr
end function
function partner(x,y)
'輸入兩個(gè)數(shù), 代表組合唯一值,存放到字符串里int
'輸出:
a=cint(x)
b=cint(y)
partner=cstr(2^a +2^b)
end function
sub show(D)
'輸入:D字典Dictionary
'顯示字典中的內(nèi)容
dim i:i=1
re= "<table border=1>"
re=re & "<tr><td>行號(hào)</td><td>過河方案</td><td>花費(fèi)時(shí)間</td><td>左岸狀態(tài)</td><td>右岸狀態(tài)</td><td>過河開關(guān)</td></tr>"
for each key in D.Keys
re=re & "<tr><td>" & i & "</td><td title='" & key & "'>" & PforRead(key) & "</td>"
for each a in D.Item(key)
re=re & "<td>" & a & "</td>"
next
re=re & "</tr>"
i=i+1
next
re=re & "</table>"
ppp.innerHTML=re
end sub
function D2Arr(D)
'輸入:D字典Dictionary
'輸出:時(shí)間結(jié)果數(shù)組,第一個(gè)元素設(shè)置為極小,不參與排序,array
dim kArr:kArr=D.keys
dim tempArr():redim tempArr(ubound(kArr)+1)
tempArr(0)=0
for i=0 to D.count-1
tempArr(i+1)= D.Item(kArr(i))(0)
next
D2Arr=tempArr
end function
sub sortA(Arr)
'輸入:Arr時(shí)間結(jié)果數(shù)組array
'堆排序,復(fù)雜度n*log(n)/log(2),如果8個(gè)數(shù)就是24次,如果用冒泡是8^2=64次
dim n,i,L,ir,rArr,j
n = ubound(Arr)
L = int(n / 2)+1
ir = n
do
if L > 1 then
L = L - 1
rArr = Arr(L)
else
rArr = Arr(ir)
Arr(ir) = Arr(1)
ir = ir - 1
if ir = 1 then
Arr(1) = rArr
exit sub
end if
end if
i = L
j = 2 * L
while j <= ir
if j < ir then
if Arr(j) < Arr(j + 1) then j = j + 1
end if
if rArr < Arr(j) then
Arr(i) = Arr(j)
i = j
j = 2 * j
else
j = ir + 1
end if
wend
Arr(i) = rArr
loop
end sub
sub succeed()
'成功后提示
dim tempArr:tempArr=D2Arr(solution)
sortA tempArr
alert "已經(jīng)結(jié)束!最小值是:" & tempArr(1)
set Rows=ppp.getElementsByTagName("TR")
for i=0 to Rows.length-1
if trim(Rows(i).cells(2).innerText) =cstr(tempArr(1)) then
Rows(i).style.backgroundColor="red"
end if
next
end sub
function isFinish(D)
'輸入:D返回后的結(jié)構(gòu)體 Dictionary
'輸出:是否完成的狀態(tài)bool
dim re:re=false
if D.Count>0 then
dim tempArr:tempArr=D.Keys
dim K:K=tempArr(0)
if trim(D.Item(K)(1))="" then re=true
end if
isFinish=re
end function
</SCRIPT>
相關(guān)文章
使用 Iisext.vbs 啟用Web服務(wù)擴(kuò)展文件的方法
這篇文章主要介紹了如何使用 iisext.vbs 在本地或遠(yuǎn)程計(jì)算機(jī)上啟用 Web 服務(wù)擴(kuò)展文件,需要的朋友可以參考下2014-07-07VBS實(shí)現(xiàn)將當(dāng)前時(shí)間轉(zhuǎn)換成UTC時(shí)間
這篇文章主要介紹了VBS實(shí)現(xiàn)將當(dāng)前時(shí)間轉(zhuǎn)換成UTC時(shí)間,十分的簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-05-05vbs中關(guān)于計(jì)算機(jī)名的相關(guān)討論
vbs中關(guān)于計(jì)算機(jī)名的相關(guān)討論...2007-03-03vbs實(shí)現(xiàn)只復(fù)制比目標(biāo)文件更新的文件
有時(shí)候我們需要時(shí)候備份一些文件,只有當(dāng)這個(gè)文件被修改了并且不是空的時(shí)候才復(fù)制2014-04-04用vbs腳本獲取網(wǎng)卡MAC,CPUID,硬盤序列號(hào)的實(shí)現(xiàn)代碼
這篇文章主要介紹了用vbs腳本獲取網(wǎng)卡MAC,CPUID,硬盤序列號(hào)的實(shí)現(xiàn)代碼,需要的朋友可以參考下2019-04-04