好玩的vbs特⾊代码
⽤什么来表⽰组合?⽐如从5个数⾥⾯选n个数,你怎么⽤⼀个数字来表述你的选择结果?注意是⼀个数字。
硬盘的权限就是⼀个例⼦,参考脚本⼿册FileSystem⽂件Attributes 属性部分:
Normal 0 普通⽂件。不设置属性。
ReadOnly 1 只读⽂件。属性为读/写。
Hidden 2 隐藏⽂件。属性为读/写。
System 4 系统⽂件。属性为读/写。
Volume 8 磁盘驱动器卷标。属性为只读。
Directory 16 ⽂件夹或⽬录。属性为只读。
Archive 32 ⽂件在上次备份后已经修改。属性为读/写。
Alias 64 链接或者快捷⽅式。属性为只读。
Compressed 128 压缩⽂件。属性为只读。
如果选择了其中任意⼏个数字相加,⽐如得到65,那么你选择的肯定是1和64的组合,vbs⾥⾯的And 运算符还对两个数值表达式中位置相同的位执⾏逐位⽐较,如果 1 and 65 得到的是1那么说明65可以表⽰你的选择⾥⾯含有1,如果是0则没有。
还有⼀个的问题是:链表型的数据结构如何描述,⼀个表型的数据,可以根据⾏索引,可以⽅便增加删除⾏,并且增加数据前判断⼀⾏是否重复。⽽且代码不是特别多,速度不是特别慢,运⾏过程可以把数据显⽰出来供程序员调试?
在vbs⾥⾯可以利⽤dictionary来模拟,Item项是⼀个⼀维数组。
这两种个数据结构的原理我⽤到了⼀个游戏题⽬⾥:
<style>
body,td{font-size:12px;}
table{border:1px solid lightblue;border-collapse:collapse;width:100%;}
</style>
四⼈欲过⼀座河,且只有⼀个氧⽓瓶(每次最多能容两⼈同时游过). <br/>
甲单独过河需1分钟,⼄需2分钟,丙需5分钟,丁需7分钟. 则四⼈全部通过的最短时间是多少. <br/>
<button onclick="vbs:try">过河</button>
<p id="ppp"></p>
<SCRIPT LANGUAGE="vbScript">
'本题属于决策树类型问题
'难点在于数据的描述上
'决策树的数据关键是:初始状态,操作步骤,结束状态
vbs表白代码教程'每次递归的输⼊值--初始状态,是上次运算的结果--结束状态
'因此经过反复推敲,决定⽤:岸边状态+操作步骤编码+时间结果+开关状态来描述
'技巧:关于搭档⽅式的描述,采⽤2的n次⽅相加,实现⽤⼀个数来表⽰2个数搭配的⽬的
'⽐如01搭档,那么表⽰⽅法就是2^0 + 2^1=3职能是01搭配才会产⽣,绝对不会是其他数字
'见partner函数
personTime =Array(1,2,5,7)'每个⼈花费时间
startBank="0 1 2 3"'⽤空格分开表⽰河左岸的⼈的状态
set solution = CreateObject("Scripting.Dictionary")'
'⽤⼀个结构体来描述数据,每⾏的格式如下:
'solution.Add P,Array(onceTime,lBank,rBank,0)
sub try
'点按钮开始递归调⽤
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上步骤执⾏时间 int
'输⼊:L可选择的⼈员名单 string
'输出:返回后的结构体 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)
'输⼊:结构体 Dictionary
'输出:返回后的结构体 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结构体 Dictionary
'输⼊返回:D2结构体 Dictionary
for each K in D1.Keys
if not D2.Exists(K) then D2.add K,D1.Item(K)
next
end sub
'输⼊:K步骤序列 string
'输⼊:T上步骤执⾏时间 int
'输⼊:L可选择的⼈员名单 string
'输出:返回后的结构体 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被移出⼈的编号 int
'输出:移出后的⼈员名单 string
L=L & " "
L=replace(L,i & " ","")
remove=trim(L)
end function
function otherBank(L)
'输⼊:这岸的名单 string
'输出:得到另外⼀个岸边的名单 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⼈的编号int
'输出:得到两个⼈⼀次过河的最⼤时间int
a=personTime(cint(x))
b=personTime(cint(y))
if a>b then maxTime=a else maxTime=b
end function
function PtoMan(P)
'输⼊:P单个⽅案 string
'输出:由两个⼈名组合的⽅案 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
'输⼊: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)
'输⼊两个数, 代表组合唯⼀值,存放到字符串⾥int
'输出:
a=cint(x)
b=cint(y)
partner=cstr(2^a +2^b)
end function
sub show(D)
'输⼊:D字典Dictionary
'显⽰字典中的内容
dim i:i=1
re= "<table border=1>"
re=re & "<tr><td>⾏号</td><td>过河⽅案</td><td>花费时间</td><td>左岸状态</td><td>右岸状态</td><td>过河开关</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
'输出:时间结果数组,第⼀个元素设置为极⼩,不参与排序,array
dim kArr:kArr=D.keys
dim tempArr():redim tempArr(ubound(kArr)+1)
tempArr(0)=0
for i=0 unt-1
tempArr(i+1)= D.Item(kArr(i))(0)
next
D2Arr=tempArr
end function
sub sortA(Arr)
'输⼊:Arr时间结果数组array
'堆排序,复杂度n*log(n)/log(2),如果8个数就是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 "已经结束!最⼩值是:" & tempArr(1)
set ElementsByTagName("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返回后的结构体 Dictionary
'输出:是否完成的状态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>
vbs的字符串运算也⾮常⽅便,下⾯是两种脚本转化⼈民币为汉字的对⽐<SCRIPT LANGUAGE=vbs>
N=34334100000.0502'假设N不是负数,末尾不带0
Snz=split(cstr(N),".")(0)'整数部分转字串
A=array( "零","壹","贰","叁","肆","伍","陆","柒","捌","玖")
B=array("元","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","万")
C=array("⾓","分","厘","毫")
WeiSz=len(cstr(int(Snz)))'整数位数
for i=1 to WeiSz
JieG=JieG & A(cint(mid(Snz,i,1)))
if cint(mid(Snz,i,1))<>0 or _
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论