实现上述功能的VB程序如下,但横线处代码有错,请改正。
Private Sub Command1_Click()
Dim a As String
Dim x As Integer, s As Integer, k As Integer
a = Text1.Text
x = 1: s = 0: k = 0
For i = 1 To Len(a)
'如果输入的不是0到9的数字或者空格,则给出错误提示后结束子程序
If (Asc(Mid(a, i, 1)) < 48 Or Asc(Mid(a, i,1)) > 57) or(Asc(Mid(a,i,1))= 32) then’Label1.Caption = "只能输入数字或空格"
Exit Sub
End If
If Mid(a, i, 1) = " " Then
s = s + Mid(a,x,i)’
x = i + 1
k = k + 1
End If
Next i
Label1.Caption = "这" + Str(k) + "个数的和为:" + Str(s)
End Sub
实现上述功能的VB程序如下.但加框处代码有错,请改正。
Dim P As String,k As String,x As Integer
Function f(a As Integer)As Boolean
f=false
If Mid(p,a,Len(k))=k Then f=True
End Function
Private Sub Command1_Click()
Dim x As Integer,result As Strin9,flag As Boolean
result=""
p=Text1.Text
k=Text2.Text
For x=1 To Len(P)-Len(k)+1
If Not f(x) Then
result=result+Mid(p,x,1)
Else
‘(1)
End If
Next x
Text3.Text=result+ ‘(2)
End Sub
⑴根据每试场安排的人数,判断输入的试场号是否在试场总数范围内,若是则转到⑵,否则重输试场号;
⑵根据考生次序和试场人数,计算每一考生所在试场号存入数组sc;
⑶计算考生在本试场中的次序,再根据试场安排的排数,计算考生座位所在的组数和排数,分别存人数组z和数组P。座位分布为“S”形,奇数组和偶数组座位排列顺序不同。
根据以上算法编写VB程序,在文本框Text1中输入组数,在文本框Text2中输入排数,在文本框Text3中输入试场号,单击“查询”按钮Command1,在List1中显示该试场座位表(名字前的数字是考生在名单中的次序),运行界面如图2所示。
Dim xm(1 To 1 000)As String
Dim n As Integer
Private Sub Form_Load()
‘本过程从数据库中读取考生姓名存储在xm数组,考生人数存储在n变量中,代码略
End Sub
Function qxs(a As Single)As Integer
qxs=Abs(Int(a*(-1))
End Function
Private Sub Command1_Click()
Dim X As Integer,i As Integer,k As Integer,num As Integer
Dim sc(1 To 1 000)As Integer ‘存储考生所在试场号
Dim z(1 To 1 000)As Integer ‘存储考生座位所在的组数
Dim p(1 To 1 000)As Integer ‘存储考生座位所在的排数
sc_z=Val(Text1.Text) ‘存储试场安排的组数
sc_p=Val(Text2.Text) ‘存储试场安排的排数
‘list1中输入“讲台”字样,代码略
num= sc_z*sc_p
x=Val(Text3.Text)
If x>0 And ① Then
For i=1To n
sc(i)=qxs(i/num)
k=i Mod num
z(i)=qxs(k/sc_p)
If k<>0 Then
If z(i)Mod 2=1 Then
p(i)=k-(z(i)-1)* sc_P
Else
p(i)= ② -(k-(z(i)-1)* sc_p)
End If
Else
z(i)= sc_z
If z(i)Mod 2=0 Then p(i)=1 Else ③
End If
Next i
‘本过程实现在List1中显示x试场座位表,代码略
Else
MsgBox(“输入的试场号,已超出试场总数,请重输”)
Text1.Text=" "
Exit Sub
End If
End Sub
① ② ③
Private Sub Command1_Click()
Dim n As Long,k As Integer
Dim f1 As Long,f2 As Long,f As Long
If n>=20 Or n<=0 Then
Label2.Caption=”输入的数据有误”
Else
If n<=2 Then ‘第1,2个元素的值都为1
f=1
Else
f1=1
f2=1
For k=3 To n
f=f1+f2
f1=f2
f2=f
Next k
End If
Label2.Caption = ”斐波那契数列第” + Str(n) + ”项的值为” +
End If
End Sub
⑴货物逐个尝试放入,搜索场地矩阵(从左到右,从上到下),若某块区域能放下该货物,则标记这些相应位置为货物编号,然后返回左上角检测下一货物。
⑵搜索时,若右侧剩余列小于货物边长,则跳转到下一行,若下方剩余行小于货物边长,则直接返回检测下一货物,直到所有货物检测完毕。
小武同学根据上述算法设计了VB程序。程序运行,在列表框list1降序输出货物规格,点击“存放”按钮command1,在列表框list2输出摆放完成的场地矩阵。
算法的VB程序如下,回答下列问题。
Dim hw(1 To 9) As Integer '存储正方形货物的边长
Dim cd(1 To 100) As Integer '场地是边长为10的正方形
Private Sub Command2_Click()
Dim i As Integer, j As Integer, wz As Integer, s As String
For i = 1 To 9
j = 1
Do While (10 - (j - 1) \ 10) >= hw(i) '下方空间足够
If ① = False Then '从当前位置开始能否放下
j = j + 1
Else
'把相关位置标记为i,并处理下一货物,代码略
End If
If 10 - (j - 1) Mod 10 < hw(i) Then ‘右侧空间不足
②
EndIf
Loop
Next i
‘在列表框list2输出整个场地放好货物之后的矩阵图,代码略
End Sub
Function pd(start As Integer, bc As Integer) As Boolean
Dim i As Integer, wz As Integer
pd = True: wz = start
Do While wz <= start + 11* (bc - 1) And wz <= 100
If ③ Then
pd = False
Exit Function
ElseIf (wz - 1) Mod 10 - (start - 1) Mod 10 = bc - 1 Then
wz = wz + 11 - bc ‘位置转到下一行,与起点同列
Else
wz = wz + 1
End If
Loop
End Function
Private Sub Form_Load()
‘生成货物边长,降序显示在列表框list1,矩阵元素初始化为0,代码略
End Sub
① ② ③
Private Function bw(x As Integer, y As String) As String
'函数bw功能:若二进制位数不足,通过在前面添"0"使得位数为4的倍数
Dim r As Integer, i As Integer
r = x Mod 4
If r <> 0 Then
For i = 1 To 4 - r
y = "0" + y
Next i
x = Len(y)
End If
bw=
End Function
Private Sub Command1_Click()
Dim m As String, n As Integer, i As Integer, a As Integer
Dim s As Integer, s1 As String, j As Integer
m = Text1.Text
n = Len(m)
Text2.Text = ""
m = ’调整 m 的位数为 4 的倍数
For i = 1 To n - 3 Step 4
s = 0
For j = i To i + 3
a = Val(Mid(m, j, 1))
s =
Next j
If s >= 10 Then
s1 = Chr(Asc("A") + s - 10)
Else
s1 = CStr(s) '函数 CStr 类似于 Str,但无前导空格
End If
Text2.Text = Text2.Text + s1
Next i
End Sub
Private Sub Command1_Click()
Dim x As Integer, y As Long, st As String
For x=100 To 1000
y=x^2
st=Str(x) & Str(y)
If Then ‘①
List1. AddItem"x: "& Str(x) & "x2: "&Str(y) &"x&y: "& Str(st)
End If
Next x
End Sub
Private Function judge(s As String) As Boolean
Dim a(1 To 100) As String
For i=1 To Len(s)
a(i) =Mid(s, i, 1)
Next i
For i =1 To Len(s)-1
For j=i+ 1 To Len(s)
If Then Exit Function. ‘②
Next j
Next i
Judge=True
End Function
def (): #定义函数,显示分数
textfont=() #字体为Arial,大小30
#生成平滑的红色字符串
t=()('score:'+str(score),True, (255,0,0))
screen.blit(t,[50,50]) #在窗口显示
程序功能如下:加载窗体,程序将相关数据存储到数组a、数组b,并显示在列表框List1中,然后单击“统计”按钮Command1,在列表框List2中显示统计结果。数组b各元素含义如图a所示。程序运行界面如图b所示。
请回答下列问题:
Dim n As Integer, m As Integer
Dim a(1 To 1000) As String
Dim b(1 To 3000) As Single
Private Sub Form_Load()
'将参赛人数存入变量n,比赛轮数存入变量m中
'将选手序号存储到数组a中、打靶成绩存储到数组b中,并显示在列表框List1中,代码略
End Sub
Private Sub Command1_Click()
Dim i As Integer, j As Integer, t As Integer
Dim max As Single, s1 As String, s2 As Single
Dim sum(1 To n) As Single
'对数组 sum 中各元素赋初值 0,代码略
For i = 1 To m
t =
For j = 1 To n
max = fm(b(t + (j - 1) * 3 + 1), b(t + (j - 1) * 3 + 2))
max =
sum(j) = sum(j) + max
Next j
Next i
For i = 2 To n '按总分对参赛人员进行排序
j = i - 1
s1 = a(i)
s2 = sum(i)
Do While
a(j + 1) = a(j)
sum(j + 1) = sum(j)
j = j - 1
Loop
a(j + 1) = s1
sum(j + 1) = s2
Next i
For i = 1 To n
List2.AddItem "第" + Str(i) + "名" + a(i) + " " + Str(sum(i))
Next i
End Sub
Function fm(x As Single, y As Single) As Single
'返回 x、y 中的较大值,代码略
End Function
Function res(x As Integer,y As Integer,z As Integer)As Integer
Dim temp As Integer
If x>y Then temp=y Else temp=x
If temp>z Then temp=z
res=temp
End Function
Private Sub Command1_Click()
Dim a As Integer,b As Integer,c As Integer
a=5:b=3:c=7
Text1.Text=Str(res(a,b,c))
End Sub
程序运行时,单击命令按钮Command1后,在文本框Text1中显示的内容是( )
(1≤t(i)≤N)内完成,可以提前完成,但不能晚于该时段完成,否则要从奖金M元中扣去一部分奖金w(i),w(i)为自然数,不同的游戏扣去的奖金是不一样的。每个游戏必须从整时段开始。请间小炫如何安排自己做游戏的顺序,才能赢取最多的奖金?将结果输出到文本框Text1中。注意;比赛绝对不会让参赛者赔钱。例如:当N=5,M=100时,
游戏编号 |
1 |
2 |
3 |
4 |
5 |
完成期限t(i) |
1 |
4 |
2 |
3 |
2 |
扣除奖金数w(i) |
5 |
4 |
10 |
8 |
7 |
最优方案为:
完成时段 |
5 |
4 |
2 |
3 |
1 |
其中第一个游戏无法在期限内完成,扣除5元,最后赢取100-5=95元。
章法思想:让扣款高的游戏尽量准时完成,扣除的奖金越少,则最后赢取的奖金越多。
⑴按扣款数值从大到小排序,顺序为3,4,5,1,2。
⑵对于游戏,在时间段1到t(i)内完成的效果都是一样的,所以尽量在时间段t(i)内完成,若该时段
已经被占用,则依次考察时间段t(i)-1,t(i)-2…,1。
①考虑游戏3,放置在时间段2完成(注:t(3)=2);
②考虑游戏4,放置在时间段3完成(注:t(4)=3);
③考虑游戏5,时间段2已经被游戏3占用,放置在时间段1完成(注:t(5)-1=1);
④考游游戏1,时间段1已经被游戏5占用,不能按时完成,放到时间段5;
⑤考虑游戏2,放置在时间段4完成(注:t(2)=4)。
实现上述功能的VB程序如下。请在画线处填入合适的代码。
Dim N As Integer,M As Integer
Dim t(1 To 100)As Integer ‘变量t(i)表示第i个游戏的完成期限
Dim w(1 To 100)As Integer ‘变量w(i)表示未完成第i个游戏要扣除的奖金
Dim f(1 To 100)As Boolean ‘变量f(i)表示第i个时段是否已经被占用
Private Sub Form_Load( )
‘生成时段数量N和初始奖金数M
‘生成t数组和w数组
End Sub
Sub swap(x As Integer,y As Integer) ‘自定义过程,可以用Call语句来调用该过程
Dim z As Integer
z=x:x=y:y=z
End Sub
Sub sort( ) ‘自定义过程,可以用Call语句来调用该过程
Dim x As Integer, I As Integer, j As Integer
For i=1 To N-1
For j=i+1 To N
If w(i)<w(j)Then
Call swap(w(i),w(j)) ‘调用自定义过程
①
End If
Next j
Next i
End Sub
Private Sub Command1_Click( )
Dim i As Integer,k As Integer,p As Integer
Call sort ‘调用自定义过程
tot=0
For i=1 To n
f(i)=True
Next i
For i=1 To N ‘对每个游戏从该游戏的规定期限开始往左找时间段,找到则完成该游戏
p=-1
k=t(i)
Do While k>0 And p=-1
If f(k)=True Then
p=k
Else
②
End If
Loop
If p=-1Then tot=tot+w(i)
Next i
③
Text1.Text=Str(ans)
End Sub
以上程序段运行时,为了实现上述功能,画线处应填入的代码分别为:①;②;③。
def hello():
print("hello")
res = hello()
print(res)
Const n = 20
Dim score(1 To n) As Single
Function adj(s As String, n As Integer)
‘此函数功能:在字符串 s 前添加若干个空格,使其长度变为 n。代码略
End Function
Function search_left(key As Integer)
‘此函数功能:返回大于等于 key 的数组元素的起始位置。代码略。
End Function
Function search_right(key As Integer)
Dim i As Integer, j As Integer, m As Integer
i = 1: j = n
Do While i <= j
If key >= score(m) Then i = m + 1 Else j = m - 1
Loop
End Function
Private Sub Form_Load()
‘从数据库中读取成绩存数组 score,记录数存 n,并对此数组 score 升序排序,代码略
End Sub
Private Sub Command1_Click()
Dim num1 As Integer, num2 As Integer, first As Integer, last As Integer
List2.Clear
num1 = Val(Text1.Text): num2 = Val(Text2.Text)
first = search_left(num1): last = search_right(num2)
If total <= 0 Then
List2.AddItem "无筛选到的记录!"
Else
List2.AddItem "筛选到" + Str(total) + "条记录!"
List2.AddItem "依次是:"
For i = first To last
List2.AddItem adj(Str(i), 3) + adj(Str(score(i)), 6)
Next i
End If
End Sub
●若双方已经分出胜负,则显示胜方及连成五子的第一颗棋子的位置(行号及列号)。
●若双方未分出胜负,则显示当前状态下将下棋的一方。
Constn= 10
Dim s(1 To 400) As String
Private Sub Command1_ Click)
‘读取棋盘数据存储在数组s中,●表示黑子,o表示白子,o表示空位,代码略
End Sub
Private Sub Command2_ Click()
Dim i As Integer, j As Integer, fag As Boolean
flag= False:i= 1
Do While i <= n And flag = False
For j= 1 Ton
If Then flag = True: Exit For
Next j
i=i+ 1
Loop
i=i- 1
If flag Then
If (i-1)*n+j) = "o" Then
Label1.Caption = "白方胜" + Str(i) + Str(j)
Else
Label1.Caption = "黑方胜" + St(i) + Str(j)
End If
Else
If counts() Then Label1.Caption="黑方下" Else Label1.Caption ="白方下"
End If
End Sub
Function judge(x As Integer, y As Integer) As Boolean
Dim dx(1 To 4) As Integer, dy(1 To 4) As Integer
Dim flag As Boolean,j As Integer, i As Integer, ux As Integer, uy As Integer
dx(1)= 1: dx(2)= 1: dx(3)= 1:dx(4)= 0
dy(1)= 1: dy(2)= 0: dy(3)=-1: dy(4)= I
flag = False:i= 1
If s((x-1)*n+y) <> "o" Then
Do While i<= 4 And flag = False
flag = True
For j= 1 To 4
ux= dx(i)*j+x
uy=dy(i)*j+y
If Not (ux>= 1 And ux <= nAnd uy>= I And uy <= n) Then flag = False: Exit For
If Then flag = False: Exit For
Next j
i=i+ 1
Loop
End If
judge = flag
End Function
Function counts() As Boolean
Dim iAs Integer, j As Integer, white As Integer, black As Integer
counts = False:white = 0: black= 0
For i=1 To n
For j= 1 Ton
If(i-1)* n+j)= "o" Then white = white+ 1
If((i-1)*n+j)= "●" Then black = black + 1
Next j
Next i
If Then counts = True
End Function
编写VB程序,实现上述功能。运行程序时,先读取每个选择题的题号、得分率和考点,显示在列表框List 1中。在文本框Text 1中输入得分率最低的前m项值,单击“统计”按钮,按照得分率从小到大升序排序,并在列表框List 2中输出得分率最低前m项的题号、得分率及考点。程序运行界面如图所示。
请回答下列问题:
Dim n As Integer
Dim th(0 To 100)As Integer,df(0 To 100)As Single,kd(1 To 100)As String
Private Sub Form_Load( )
‘读取题号、得分率和考点分别存入数组th、df和kd数组,在列表框List 1中显示,代码略
‘选择题的个数存入变量n,代码略
End Sub
Function dq(x As String,k As Integer)As String
‘固定数据的位数
dq= X
Do While
dq=dq+""
Loop
End Function
Private Sub Select _Click( )
Dim m As Integer,i As Integer,j As Integer,p As Integer,t As Integer,mm As Integer
List 2.Clear
m=Val(Text1.Text)
i=1
Do While i<=n-1
p=i
For j=i+1 To n
If Then p= j
Next j
If p<i Then
t=th(i):th(i)= th(p):th(p)= t
End If
If Then Exit Do
i=i+1
Loop
For i=1 To m
List 2.AddItem dq(Str(th(i)),6)+ dq(Str(df(th(i))),8)+ dq(kd(th(i)),12)
Next i
End Sub
间隔2张取第6张纸牌,……直到取完为止(如果取的位置超过n,重新从1位置取)。如果有4张纸牌,那么取的纸牌编号依次为1,3,4,2。同样,可以知道每张纸牌的被取走的顺序如下表。
序号 |
1 |
2 |
3 |
4 |
1 轮次 |
1 | 2 1 | 3 1 | 4 1 |
2 轮次 | 2 2 |
2 | 4 2 | |
3 轮次 |
3 | 2 3 | ||
4 轮次 |
4 |
纸牌被取走顺序也可以理解为纸牌存留的轮次。每次取走一张纸牌后,下一轮第一张纸牌编号为该纸牌的后一张。上述例子中3第二个被取,留存轮次2,下一轮的第一张纸牌为4,剩下的纸牌留存轮次增加。
现在,只要给小九纸牌的数量n,他能通过逆推法快速地计算出取的纸牌编号顺序,方法如下(以n=4为例):
逆推得到的纸牌顺序 | 1 | 4 | 2 | 3 |
最终得到的纸牌编号 | 1 | 2 | 3 | 4 |
即在第i轮,上一轮纸牌轮次加1,并在后面增加一张轮次为1的纸牌。然后将轮次为1放在最前的位置,最后整体循环向右移动n-i次。直到n轮后,可知每张纸牌被取走的顺序,根据此顺序,得到每次取走纸牌的编号。
轮次 | 数组 | 1 2 3 4 |
1 | a(1)=1 | 1 |
2 | ①前一轮所有值加1 ②第二位增加数值1 ③将轮次为1的数放在最前 ④整体右移动2位 | 2 2 1 1 2 1 2 |
3 | ①前一轮所有值加1 ②第三位增加数值1 ③将轮次为1的数放在最前 ④整体右移动1位 | 2 3 2 3 1 1 2 3 3 1 2 |
4 | ①前一轮所有值加1 ②第四位增加数值1 ③将轮次为1的数放在最前 ④整体右移动0位 | 4 2 3 4 2 3 1 4 2 1 4 2 |
根据以上算法小九编写了如下VB程序,请回答下列问题。
Dim n As Integer
Dim a(1 To 100) As Integer
Private Sub Command1_Click()
Dim i As Integer, j As Integer,k As Integer
Dim ans As String, x As Integer
n = Val (Text1. Text)
a(1) = 1
For i=2 To n
For j=1 To i-1
Next j
j=i
Do While j>1
a(j)=a(j-1)
j=j-1
Loop
a(1) = 1
For j=1 Ton - i
k = a(1)
a(x) = k
Next j
Next i
ans =“”
For i=1 Ton
ans = ans + Str(a(i))
Next i
Label1. Caption =“序列为:”+ ans
End Sub
Function yd(i As Integer) As Integer
Dim j As Integer, tmp As Integer
For j=i To 2 Step -1
tmp=j+1
If tmp > i Then
a (tmp) = a(j)
Next j
yd=j+1
End Function
⑴找出文章(以“.”结束)中所有用英文表示的数字(均为小写,数字范围1≤n≤20),单词与数字对应如下:
单词 |
one |
two |
three |
four |
five |
six |
seven |
eight |
nine |
ten |
…… |
twenty |
数字 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
…… |
20 |
⑵将这些数字平方后除以100取余,得到两位数如00,04,21,96。
⑶把这些两位数按升序排成一行,组成一个最小的新数,如果新数开头为0,就去除。
⑷步骤(3)找出的最小数即为密码。
小明按照上述方法,设计了一个解密的VB程序,功能如下:单击“解密”按钮Command1,程序依次将文本框Text,1中以空格分隔的每个英文单词取出,若单词属于数字单词,则按解密步骤进行处理,最后在文本框Text2中输出解密结果。
程序运行效果如图所示,请回答下列问题:
Dim a(1 To 20) As String
Private Sub Form_Load()
a(1) = "one": a(2) = "two"
'……将所有数字单词按顺序存入数组a中,代码略
End Sub
Private Sub Command1_Click()
Dim s As String, tmp As String
Dim c as Integer,i As Integer, j As Integer, k As Integer, t As String, ch As As String,code As Long
Dim b(1 To 100) As String 'b数组存放数字单词处理后得到的两位数
s = Text1.Text
c = 0: i = 1: flag = True:t = ""
Do While i <= Len(s)
ch = Mid(s, i, 1)
If ch >= "a" And ch <= "z" Then
t = t + ch
flag = False
ElseIf flag = False Then
For j = 1 To 20
If t = a(j) Then
c = c + 1
b(c) =
End If
Next j
t = ""
flag = True
End If
i = i + 1
Loop
'将b数组中的两位数按数值大小进行升序排序,代码略
For i = 1 To c
t = Val(b(i))
Next i
Text2.Text = Str(code)
End Sub
Function decode(num As Integer) As String
Dim mo As Integer
mo = num * num Mod 100
If mo = 0 Then
decode = "00"
ElseIf Then
decode = "0" + Trim(Str(mo))
Else
decode = Trim(Str(mo)) 'Trim为去除字符串两端空格的函数
End If
End Function
Const n = 10
Dim a(1 To 10) As Integer, b(1 To 10) As Integer
Dim k1 As Integer, k2 As Integer 'k1,k2为相同数据的前、后次序
Private Sub Command1_Click ()
Dim i As Integer, tmp As Integer, t As Integer
Randomize
List1.Clear
For i = 1 To 9 '随机生成9个不重复数
b(i) = Int(Rnd * 90) + 10
Do While ①
b(i) = Int(Rnd *90) + 10
Loop
Next i
'以下代码为随机选取数组中的1个数作为第10个数字再随机的插入到原数组的1-9位置
K1 = Int(Rnd *9 + 1)
tmp = b(k1)
k2 = Int(Rnd* 9 + 1)
For i=10 To k2+1 Step -1
b(i)=b(i-1)
Next i
b(k2) = tup
For i =1 To n
a(i) = i
List1. AddItem Str(a(i)) +””+ Str(b(i))
Next i
If k1 >= k2 Then
②
t =k1: k1=k2: k2=t
End If
Text1. Text = Str(k1) + Str (k2)
End Sub
Private Sub Command2 _Click ()
Dim i As Integer, j As Integer, k As Integer, t As Integer
List2. Clear
For i=1 To n-1
k=i
For j=i +1 To n
If b(j) < b(k) Then k= j
Next j
If k<>i Then
t=a(k): a(k)=a(i): a(i)=t
t=b(l): b(k)=b(i): b(i)=t
End If
Next i
For i= 1 To n
List2.AddItem Str (a(i)) +"" + Str (b(i))
Next i
i=1
Do While i<=n-1 And b(i)< b(i+1)
i=i+1
Loop
Text2.Text = Str(a(i)) + Str(a(i + 1))
If ③ Then Label1. Caption="稳定" Else Label1. Caption ="非稳定"
End Sub
Function check(x As Integer, y As Integer) As Boolean
Dim j As Integer
check = False
For j= 1 To y-1
If b(j)=x Then
check = True
Exit For
End If
Next j
End Function
① ② ③
1)授权码由10位字符组成,前8位为日期的密文,后2位为验证码;
2)取日期的第1位字符,若该字符第一次出现,则直接取其对应加密字符,否则取下一个不重复的加密字符。按此操作,依次取出该日期余下各位对应的加密字符;
3)求出所有日期字符数值的和,将和除16取余加1得到一位验证码字符;若和不小于16,则将和除16取整加1得到另一位验证码字符,否则另一位验证码字符为“X”。取出验证码重复时,处理规则与(2)相同。
加密(验证码)字符对应表如下。
值(十进制) |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
加密(验证码)字符 |
K |
n |
G |
j |
L |
t |
W |
b |
O |
a |
P |
H |
Z |
q |
Y |
c |
小明设计了一个生成8位日期(YYY YMM-DD格式)授权码的VB程序。程序功能如下:在文本框Text1中输入一个8位有效日期,单击“生成授权码”按钮Command1,在标签Label2中显示出该日期的授权码。运行效果如图所示。
实现上述功能的VB程序段如下:
Dim f(0 To 15) As Integer
Const Code=“KnGjLtWbOaPHZqYc”
Private Sub Command1_ Click()
Dim rq As String, sq As String
Dim c As Integer, i As Integer, d As Integer
For i=0 To 15
f(i)=0
Next i
rq= Text1. text
sq =””:d=0
If Len(rq) <> 8 Then
Label2. Caption=“请输入8位日期!”
Else
For i=1 To 8
c= Val(Mid(rq,i, 1))
d=d+c
sq =+sq
Next i
If d >=16 Then
yz= GetChar(d Mod 16+1) +GetChar(d \ 16+1)
Else
yz= GetChar(d Mod 16+1)+“X”
End If
Label2. Caption=sq+yz
End If
End Sub
'获取不重复的加密字符
Function GetChar(x As Integer) As String
Dim flag As Boolean
flag= False
Do While flag= False
f(x)=f(x)+1
If f(x)=1 Then
f(x)=f(x)+ 1
flag= True
Else
x=(x+1) Mod 10
End If
Loop
End Function