Nextj
Ifk<>iThent=a(k):
a(k)=a(i):
a(i)=t
If IModn=0 Then List2.AddItems:
s=” ”
Nexti
EndSub
解析 n个数需排n-1趟,每一趟的结束位置是该行的最后一个数。
同样的,若按列排序,每列的最后一个位置在最后一行。
答案 ①n-1 ②(i-1)[BS)]*n ③(n-1)*n+(i-1)Modn+1 stepn
3.小岩设计了一个顺时针旋转矩阵的程序,其功能为:
运行程序时,在文本框Text1中输入矩阵规模n,点击“产生矩阵”按钮Command1,在列表框List1中显示一个n*n的矩阵,该矩阵数据由从1开始的连续自然数组成。
点击“旋转矩阵”按钮Command2,该矩阵顺时针旋转90度并显示在列表框List2中,此后每点一次“旋转矩阵”按钮Command2,列表框List2中显示的矩阵顺时针旋转90度。
请完成程序填空。
DimnAsInteger
DimstAsString
Dima(1To100)AsInteger
Dimb(1To100)AsInteger
PrivateSubCommand1_Click()
′产生矩阵,代码略
EndSub
PrivateSubCommand2_Click() ′旋转矩阵
Fori=1Ton ′行
st=” ”
Forj=1Ton ′列
b((i-1)*n+j)=____①____
st=st+adj(Str(b((i-1)*n+j)),3)
Nextj
List2.AddItemst
Nexti
EndSub
Functionadj(aAsString,nAsInteger)AsString
′在字符串a前加入适当的空格,使a的长度为n位,代码略
EndFunction
解析 从题图上可知,发生了行号和列号的互换。
答案 ①j+(i-1)*n
4.在美国国家信息交换码中,ASCII值从32到127是可以打印并显示的字符,把这96个字符随机调整次序,生成密码本。
根据输入的密钥和明文,单击“加密”按钮Command1,输出密文。
基本算法如下。
1)用数组mab分别记录1~96个字符的ASCII值,用数组zm记录对应字符在密码本中位置,如mab(9)=65,表示密码本中第9个字符是“A”,则对应的zm(65)=9;
2)把密钥中每个字符的ASCII值的各个数字进行累加(如Hi分别为(7+2)+(1+0+5)),将累加的和除以9取余数后加7,作为将密码本转换成二维表的列数;
3)每个明文在转换后二维表中位置作为密文,该位置是用十六进制表示的行号和列号。
程序运行的界面如下图所示:
实现上述功能的VB程序如下,请回答以下问题:
(1)若输入密钥为“AB”,则根据算法及密码本,字母“A”加密后的密文是____________。
(2)请在划线处填入合适的代码。
DimMab(96)AsInteger′存储密码本中每个字符的ASCII值
Dimzm(127)AsInteger′存储ASCII值32至127的字符在密码本数组mab中的下标
PrivateSubForm_Load()
′产生密码本及96个字符在密码本中位置,代码略。
EndSub
Functionp(sAsString)AsInteger
DimiAsInteger,t1AsLong
DimsumAsInteger,s1AsString
t1=0
i=1
DoWhilei<=Len(s)
s1=Mid(s,i,1)
t1=Asc(s1)
____①____
i=i+1
Loop
p=sumMod9+7
EndFunction
PrivateSubCommand1_Click()
DimiAsInteger,tAsInteger,hangAsInteger
DimsAsString,s1AsString,LieAsInteger
List1.Clear
s1=Text1.Text
t=p(s1)
Label5.Caption=”将密码本换成一张”+Str(t)+”列的二维表”
i=1
DoWhilei<=96
s=s+Chr(Mab(i))+” ”
IfiModt=0Ori=96Then
List1.AddItems
s=” ”
EndIf
i=i+1
Loop
wz=”123456789ABCDEF”
s=Text2.Text
Fori=1ToLen(s)
s1=Mid(s,i,1)
___②____
hang=(t1-1)\t+1
lie=(t1-1)Modt+1
s2=____③____
Nexti
Text3.Text=s2
EndSub
解析 字母AB的值分别65、66,各个数字相加为23,23Mod9+7=12,即转换成12列的矩阵,因此字母A在第2行第3列。
p函数的功能是,根据输入的密钥s,转换成p列的二维表,把密钥中每个字符的ASCII值的各个数字进行累加,将累加的和除以9取余数后加7,保证列数在[7,15]之间;②要求的是根据明文在密码本中位置,转换成相应的行号和列号,t1就是该字母在密码表中的位置。
每个明文在转换后二维表中十六进制的行号和列号作为密文。
答案
(1)23
(2)①sum=sum+t1\10Mod10 ②t1=zm(Asc(s1)) ③s2+Mid(wz,hang,1)+Mid(wz,lie,1)
5.试场编排方法:
每试场人数30,尾数试场可能不足30,按6行5列的布局编排试场,每个试场的座位号如图a所示。
编写一个VB程序实现上述功能:
在文本框Text1中输入学生数n,在文本框Text2中输入试场号m,单击“确定”按钮Command1,在列表框中List1中输出第m试场的编排表,程序运行界面如图b所示。
第1列
第2列
第3列
第4列
第5列
第1行
1
12
13
24
25
第2行
2
11
14
23
26
第3行
3
10
15
22
27
第4行
4
9
16
21
28
第5行
5
8
17
20
29
第6行
6
7
18
19
30
图a
图b
(1)999个学生的考号依次是001,002,…,998,999。
根据上述试场编排方法,可知第3试场第2行第3列的学生考号是________。
(2)小王根据上述算法,设计了一个加密程序,其VB代码如下,请在划线处填入合适的代码。
Constk=30
Functionadj(sAsString)AsString
′功能:
在字符串s前添加若干个空格,代码略。
EndFunction
Functionconvert(nAsInteger)AsString
′功能:
把n转字符串,不足3位则在前面补0,代码略。
EndFunction
PrivateSubCommand1_Click()
Dimkh(1To999)AsString
DimnAsInteger,mAsInteger,kcsAsInteger
DimiAsInteger,jAsInteger,lineAsString
DimstartAsInteger,offset1AsInteger,offset2AsInteger
n=Val(Text1.Text)
m=Val(Text2.Text)
Fori=1Ton
kh(i)=convert(i)
Nexti
IfnModk=0Thenkcs=n\'kElse____①______
Ifm>kcsOrm<1Then
Label3.Caption=”无该试场!
”
Else
____②____
Fori=1To6
line=” ”
offset1=i
line=line+adj(kh(start+offset1))
Forj=2To5
IfjMod2=1Then
offset1=offset1+12
line=line+adj(kh(start+offset1))
Else
____③____
line=line+adj(kh(start+offset2))
EndIf
Nextj
List1.AddItemline
Nexti
EndIf
EndSub
解析 从语句m>kcs来看,kcs表示最大的试场号,试场号往往从1开始编起,当学生人数不是k的倍数时,是k整数倍加1。
Stat表示本试场前面已经有的学生编号,因