主题:(急)09年3月二级VB的最后一题
大懒猫 [专家分:220] 发布于 2009-06-11 09:40:00
题目如下:
本程序实现文本加密。先给定序列:a1, a2,…,an, `它们的取值范围是1~ n,且互不相同。加密算法是:把原文本中第k个字符放到加密后文木的第ak个位置处。若原文本长度大于n,则只对前n个字符加密,后面的字符不变:若原文本长度小于n,则在后面补字符“*”使文本长度为n后再加密。
例如:若给定序列a1,a2,…,a7分别为2,5,3,7,6,1,4
当文本为“PROGRAM”时,加密后的文本为“APOMRRG”
当文本为“PROGRAMMING”时,加密后的文本为“APOMRRGMING”
当文本为“THANK”时,加密后的文本为,“*TA*HKN”
下面的过程code实现这一算法。其中参数数组a()中存放给定序列(个数与数组a的元素个数相等)a1, a2, a3,…的值,要加密的文本放在参数变量mystr中。过程执行完毕,加密后的文本仍放在变量mystr中。请填空。
Option Base 1
Private Sub code(a() As Integer, mystr As String)
Dim ch As String, cl As String
n = UBound(a) - Len(mystr)
If n > 0 Then
mystr = mystr + String$(n, "*")
End If
ch = mystr
For k = [14] To UBound(a)
cl = Mid(mystr, k, 1)
n = [15]
Mid$(ch, n) = c1
Next k
mystr = ch
End Sub正确答案为:[14]:1 [15]:a(k)
但是我有好多不懂的地方:
1、 循环结构中的 Mid$(ch,n)=c1这条语句怎么能这样写?赋值语句的左边怎么能是一个函数呢?n定下来后,这个函数的值就能求出来了,也就是是一个常量了,c1如何赋值给一个常量?
2、如何调用这个子过程呀?我自己写了一个command1_click事件来调用它,好象不行。代码如下:
Private Sub Command1_Click()
Dim x(7) As Integer
Dim s As String
x(1) = 2
x(2) = 5
x(3) = 3
x(4) = 7
x(5) = 6
x(6) = 1
x(7) = 4
s = "PROGRAM"
Call code(x(), s)
Print "s=", s
End Sub
还请大家指正!谢谢![em18]
最后更新于:2009-06-11 14:22:00
回复列表 (共9个回复)
沙发
一江秋水 [专家分:9680] 发布于 2009-06-11 10:50:00
Mid$(ch,n)=c1 这种语句我也是第一次见到,试了一下,确实能行,又长知识了!它的运行结果是把字符串ch中的第n个字符替换为c1,实际上相当于替换语句
板凳
一江秋水 [专家分:9680] 发布于 2009-06-11 11:13:00
另外,你的代码有问题:
For k=【14】 'To Ubound(a)
循环初值能这样表述吗:【14】?
To 的前面为何会有个注释符?
再就是,你调用代码时,如果 k=14,而 Ubound(a)=7,初值>终值,根本不会进入循环
3 楼
大懒猫 [专家分:220] 发布于 2009-06-11 14:18:00
[quote]另外,你的代码有问题:
For k=【14】 'To Ubound(a)
循环初值能这样表述吗:【14】?
To 的前面为何会有个注释符?
再就是,你调用代码时,如果 k=14,而 Ubound(a)=7,初值>终值,根本不会进入循环[/quote]
前辈呀前辈,终于有马失前蹄的时候了吧?嘻嘻~~~这个[14]和[15]是表示这是填空题的第14个空和第15个空呀,呵呵!注释符也是这个意思,表示得让做题的人去掉哦[em57]
4 楼
大懒猫 [专家分:220] 发布于 2009-06-11 14:24:00
这个代码中的循环结构我还是不太明白,请指正!(我已经调用成功了!没有成功的原因是有一处的c1写成了cl)
5 楼
大懒猫 [专家分:220] 发布于 2009-06-11 14:46:00
为什么不能这样给数组赋初值?
Private Sub Command1_Click()
Dim s As String
dim x
x = Array(2, 5, 3, 7, 6, 1, 4)
s = "PROGRAM"
Call code(x, s)
Print "s=", s
End Sub
6 楼
一江秋水 [专家分:9680] 发布于 2009-06-11 17:54:00
好多年没做作业了,还真的不知道【14】表示第14个空!
Array 返回的一般是字符串数组。
你在 Mid$(ch, n) = c1 这一句后面加上一句 Debug.Print n, c1, ch ,就能清楚地看到循环所引起的变化
7 楼
大懒猫 [专家分:220] 发布于 2009-06-12 14:51:00
[quote]好多年没做作业了,还真的不知道【14】表示第14个空!
Array 返回的一般是字符串数组。
你在 Mid$(ch, n) = c1 这一句后面加上一句 Debug.Print n, c1, ch ,就能清楚地看到循环所引起的变化[/quote]
试了一下,没有什么效果出来。[em17]
8 楼
mpx220wyb [专家分:0] 发布于 2009-06-23 19:09:00
前一个 “cc = Mid(mystr, k, 1)” 中 Mid是函数,返回 字符串中指定数量的字符;后一个 “Mid$(ch, n) = cc”是语句,在一 字串变量中以另一个字符串中的字符替换其中指定数量的字符。
9 楼
mpx220wyb [专家分:0] 发布于 2009-06-23 19:19:00
由于“ x = Array(2, 5, 3, 7, 6, 1, 4)” 中,Array 返回的是一个包含数组的 Variant,故 自定义函数code的第一个参数也要定义为 Variant即可!
我来回复