1、1.约瑟夫问题。编号为1,2,3,n的n个人按顺时针方向围坐一圈,每人手持一个密码(正整数)。开始任意选一个正整数m作为报数的上限值,从第一个人开始顺时针自1开始顺序报数,报到m时停止,同时报m的人出列,并将他的密码作为新的上限值m,从他顺时针下一个人开始重新自1开始报数,如此下去直到所有人全部出列为止。要求:1)由用户输入队列人数n和正整数m,以及游戏的密码上限x。2)队列中每人所持的密码随机产生,大小必须在1,x区间。3)在程序界面中按出列顺序显示每个人的编号和出列时他所持的密码。运行效果如图所示。实现上述功能的VB程序如下。请在划线处填入适当的语句和代码,把程序补充完整。Private
2、Sub Command1_Click()Dim a()As Integer,b()As Integer,m As Integer,n As IntegerDim i As Integer,k As Integer,c As Integer,x As IntegernVa1(Text1.Text):mVa1(Text2.Text):xVa1(Text3.Text)ReDim a(1 To n)As Integer重新定义数组a,存储下标对应编号人的队列状态ReDim b(1 To n)As Integer重新定义数组b,存储下标对应编号人的密码Randomize随机数生成器初始化For i1 T
3、o n a(i)1在列 _产生每个人的随机密码 Next ic0k0List1.ClearDo While cnFor i1 To nkka(i)累计报数If km And_Thenk0a(i)0出列List1.AddItem“出列人的编号为&i&”,该人的密码为“&b(i)”_cc1End IfNext iLoopEnd Sub2.猜数字是一种古老的密码破译类益智小游戏。通常由两个人玩,也可以由一个人和电脑玩,其标准规则为:(1)一方出数字,出数字的人要想好一个无重复数字的4位数(如0165,5234等),不能让猜的人知道;(2)另一方猜数字,每猜一个数字,出数者根据结果给出“几A几B”的提
4、示,其中A前面的数字表示位置正确的数字个数,而B前面的数字表示数字正确但位置不对的数字个数。(如要猜5234,猜的人给出5346,则提示1A2B);(3)重复第二步的猜测过程,直到猜中(即提示4A0B)为止。小林编写了一个和电脑猜数字的VB程序,其功能如下:窗体加载时,调用自定义函数产生待猜的4位数字,并初始化猜测次数。用户在文本框Text1中输入猜的数字,单击“我猜”按钮Command1,程序进行判断,并将结果显示在列表框List1中。猜中后,在标签框Label2中根据猜测次数给出评语。程序运行效果如图1所示。(1)实现上述功能的VB程序如下,请在划线处填入合适代码。Dim result A
5、s String,total As IntegerDim flag(0 to 9)As Boolean标记下标对应的数字是否存在,初值默认为FalsePrivate Sub Form_Load()result_total0End SubPrivate Sub Command1_Click()Dim A As Integer,B As IntegerDim C As Integer变量C存储数字正确(含位置正确)的数字个数Dim guess As String,i As Integer,t1 As String,t2 As StringguessText1.TextA0 C0For i1 To
6、4t1Mid(result,i,1)t2Mid(guess,i,1)If t1t2 Then AA1If_Then CC1Next itotaltotal1B_List1.AddItem Str(total)&.&guess&Str(A)&A&Str(B)&BIf A4 ThenIf total8 ThenLabel2.Caption太厉害了!您只用了&total&次。ElseLabel2.Caption继续锻炼!您共花了&total&次。End IfEnd IfEnd SubRndCode函数用于随机产生待猜测的n位不重复数字字符Function RndCode(n As Integer)A
7、s StringDim x As Integer,i As IntegerRandomizenum0 RndCodeDo While numnxInt(Rnd*10)随机产生一个0,9的数字If flag(x)False Thenflag(x)Truenumnum1RndCodeRndCode&xEnd IfLoopEnd Function(2)如果某次游戏过程如图2所示,则第7次要猜测成功,应输入_。()图2A.6321 B.6312 C.2531 D.25133.用VB编写一个字符串分行程序,功能如下:单击“分行”按钮Command1,将文本框Text1中的英文文本在列表框List1中分行
8、显示(分行时单词不得跨行,每行字符尽可能多但不超过40个),并在标签Label1中输出总行数,运行效果如图所示。分行算法如下:(1)将文本框中的字符串保存到变量s中;(2)当s中字符个数超过40时,循环执行下列1)、2)、3)步,否则跳转到(3):1)如果第41个字符不是英文字母,则分行位置p40;否则,向左逐个查找,直至找到第一个非英文字母,将其位置作为分行位置p;2)截取s的前p个字符,作为新增行显示在列表框List1中,同时总行数加1;3)将s中未分行部分重新赋值给变量s。(3)将s作为新增行显示在列表框List1中,同时总行数加1。Private Sub Command1Click()
9、Dim s As String,c As String Dim r As Integer,total As Integer,p As Integer total0 s_ Do While Len(s)40 r41 cMid(s,r,1)If Not(ca And cz)Or(cA And cZ)Then p40 Else 从第41个字符开始向左找到第1个非英文字母时,并将其位置赋给p Do While(c“a”And c“z”)Or(cA And c“Z”)r_ cMid(s,r,1)Loop pr End If List1.AddItem Mid(s,1,p)totaltotal1 s_ L
10、oop List1.AddItem s totaltotal1 Label1.Caption共Str(total)行End Sub4.杨辉三角,又称贾宪三角形,是我国古代数学的成就之一,如图所示为杨辉三角前5行的数据排列。从图可知,杨辉三角当前行的数值可由前一行推导计算得到。现要求杨辉三角第n行的数据,编写的VB程序功能如图:在文本框Text1中输入n值(n30),单击按钮Command1后,在标签框Label1中输出第n行的数据。实现上述功能的VB程序如下,但加框处代码有错,请改正。Private Sub Command1_Click()Dim pre(0 to 30)As Long,cur
11、(0 to 30)As Long数值型数组的数组元素初值默认为0Dim s As String,i As Integer,j As IntegernVal(Text1.Text)cur(1)=1(1)For i1 To nsFor j1 To icur(j)pre(j-1)+pre(j+1)(2)ss&cur(j)&Next jFor j1 To ipre(j)cur(j)Next jNext iLabel1.CaptionsEnd Sub5.某省学生信息技术学习平台使用情况数据存储在数据库中,利用VB编写一个程序,实现的功能:输入一个积分的范围,显示该范围内的学生编号和对应的积分。程序运行界
12、面如图所示:程序代码如下,为实现以上功能,请在划线处填写合适的代码:Dim bh(10000)As String存储学生编号Dim jf(10000)As Integer存储学生获得的积分值Dim n As Integer存储学生总人数Function Search(x As Integer)As Integer Search0 i1:jn:flagTrue Do While ij And flagTrue mInt(ij)/2)If xjf(m)Then flagFalse _ ElseIf_Then im1 Else jm1 End If LoopEnd FunctionPrivate S
13、ub Form_Load()从数据库中读取学生编号和积分,分别存储到bh数组和jf数组中,并按积分值从小到大排序,显示在列表框List1中End SubPrivate Sub Command1_Click()Dim Top As Integer,Bottom As Integer,Topxb As Integer,Bottomxb As IntegerList2.ClearTopVal(Text1.Text)BottomVal(Text2.Text)If TopBottom Then tTop:TopBottom:BottomtIf Topjf(n)Or Bottomjf(1)Then Exi
14、t SubDo While Search(Top)0TopTop1LoopDo While Search(Bottom)0BottomBottom1LoopTopxbSearch(Top)Do While jf(Topxb)jf(Topxb1)And Topxb1TopxbTopxb1LoopBottomxbSearch(Bottom)Do While jf(Bottomxb)jf(Bottomxb1)And BottomxbnBottomxbBottomxb1LoopFor i_List2.AddItem bh(i)&jf(i)Next iEnd Sub6.数字黑洞数6174。一个任意的四位
15、正整数(四位数字完全相同除外),将数字重新组合成一个最大的数和最小的数相减,重复这个过程,最多七步,必得6174。如取四位数5462,按以上方法作运算如下:654224564086864004688172872112787443744334473996996336996264664224664176764114676174从文本框Text1中输入一个任意的数字不完全相同的四位正整数,在文本框Text2中输出掉进黑洞的步数。实现上述功能的VB代码如下,但加框处代码有错,请改正:Private Sub Command1_Click()Dim a(1 To 4)As Integer,c As Int
16、eger,t As Integer Dim x As Integer,y As Integer,i As Integer,j As Integer xVal(Text1.Text)c0 Do While x6174 For i1 To 4 把四位正整数x的每一位数字取出并存放到数组a中 a(i)x Mod 10 x=x/10(1)Next i For i1 To 3 For ji1 To 4 If a(i)a(j)Then(2)ta(i)a(i)a(j)a(j)t End If Next j Next i xa(1)*1000a(2)*100a(3)*10a(4)ya(1)a(2)*10a(3
17、)*100a(4)*1000 xxy cc1 Loop Text2.TextStr(c)End Sub7.曲哲同学设计了一个英文字符串的加密算法,其加密的方法如下:1)从被加密字符串中获取单个字符,然后得到其ASCII码的8位二进制编码。2)将字符的二进制编码反向,得到其逆序二进制码。3)将逆序二进制码的每4位转换为相应的十六进制编码,即得到单个字符加密后的字符串。4)以此类推,直到所有字符加密完成,得到加密字符串。具体程序界面如下图,在text1中输入字符串,点击“加密”按钮command1后,在text2中显示加密后的字符串。(1)已知字符a的ASCII码为97,则字符串idear加密后的
18、字符串为_。Private Sub Command1_Click()Dim s As String,ch As StringDim result As String,chA As String,chB As StringDim i As Integer,j As IntegerDim n As Integer,m As Integers Text1.Textn Len(s)result:c 0123456789ABCDEFFor i 1 To nch _ch niXu(ch)m 0For j 1 To 4 获取二进制码前4位的值_Next jchA Mid(c,m 1,1)m 0For j 5
19、 To Len(ch)m m*2 Val(Mid(ch,j,1)Next jchB Mid(c,m 1,1)result result chA chBNext iText2.Text resultEnd Sub得到单个字符ch的8位二进制编码Function D2B(ByVal ch As String)As StringDim s As StringDim data As Integer,i As Integerdata Asc(ch):s Do While data 0s Str(data Mod 2)sdata data2LoopIf Len(s)2#”。程序运行界面如图d所示。图d实现
20、上述功能的VB代码如下。(1)请在划线处填入合适代码Dim a(1 To 8)As StringPrivate Sub Command1_Click()Dim temp As Integer,i As Integer,j As IntegerDim flag(1 To 8)As BooleanFor i 1 To 8_Next iRandomizeFor i 1 To 8temp Int(Rnd()*8 1)生成18之间的随机整数Do While flag(temp)temp Int(Rnd()*8 1)生成18之间的随机整数Loopa(i)tempflag(temp)TrueNext iLi
21、st1.ClearList1.AddItem 初始状态:PrintCircleEnd SubPrivate Sub Command2_Click()Dim i As Integer,j As Integer,temp As String,n As Integer,moveStep As StringmoveStep List2.Clear n 0 For i 1 To 7 使用冒泡排序对圆圈中的数字进行移动 For j 1 To_ If a(j)a(j 1)Then temp a(j):a(j)a(j 1):a(j 1)temp moveStep Str(j)#moveStep move
22、Step&Str(j 1)&Str(j)moveStep moveStep&0#&Str(j 1)List2.AddItem moveStep n n 1 End If Next j Next i List1.AddItem 移动数字后:PrintCircle Label1.Caption 总移动步数:&_End Sub在列表框List1中输出当前的数阵状态Function PrintCircle()List1.AddItem List1.AddItem&a(1)&a(2)&a(3)&List1.AddItem|/|List1.AddItem&a(8)&a(4)&List1.Add
23、Item|/|List1.AddItem&a(7)&a(6)&a(5)&List1.AddItem End Function(2)分析代码和游戏规则,事件处理过程“Command2_Click”中的冒泡排序_(填:能/不能)改为使用选择排序9.当计算机程序中无法用普通数据类型表示位数较多的乘数和计算结果时,就需要采用高精度乘法。如,当两个各有20位数字的整数相乘时,就无法用长整型(Long)数据类型来表示。高精度乘法运算就是运用数组,用程序模拟列竖式计算的过程。两个正整数进行高精度乘法计算的一般算法如下:1)将第一个整数各位上的数字按照从低位到高位的顺序依次存入数组a(1),a(2),a(La
24、)中,将另一个整数各位上的数字按照从低位到高位的顺序依次存入数组b(1),b(2),b(Lb)中。其中,La表示第一个整数的位数,Lb表示第二个整数的位数;2)按照从低位到高位的顺序,将两个整数各位数值进行逐位乘法计算(第一轮先让b(1)依次乘以a(1),a(2),a(La),第二轮再让b(2)依次乘以a(1),a(2),a(La),依次进行),每位的乘法结果也按照低位到高位的顺序依次存入数组ans(1),ans(2),ans(3)中;3)对数组ans中的计算结果进行从低位到高位的进位处理;4)统计数组ans中实际计算结果的有效数值位数,并将位数值存入变量length;5)按照高位到低位的顺序
25、输出数组ans中的计算结果。小强按照上述方法设计了一个两数进行高精度乘法计算的VB程序,功能如下:在文本框Text1和Text2中依次输入两个整数,单击“计算”按钮Command1,程序进行高精度乘法计算,并在标签Label4中输出计算结果。下面信息显示了进行高精度乘法计算的主要过程(假设输入的两个整数分别为“123”和“45”):程序运行效果如图3所示。(1)请在划线处填入合适代码。Dim a(1 To 30)As Integer,b(1 To 30)As Integer,ans(1 To 60)As IntegerDim La As Integer,Lb As Integer,length
26、 As IntegerPrivate Sub Command1_Click()Dim i As Integer,j As Integer,t As Integer,temp As String将两个乘数(正整数)各数位上的数字按照上述算法依次存入数组a和b,每个正整数位数分别保存到变量La和Lb;将保存结果的数组ans(i)值初始化为零(该部分程序代码略)For i1 To Lb按低位到高位的顺序进行列竖式的逐位乘法For j1 To Laans(ij1)_b(i)*a(j)Next jNext iFor i1 To LaLb对计算结果进行进位处理ans(i1)ans(i1)ans(i)10a
27、ns(i)_Next ilengthLaLbDo While ans(length)0lengthlength1LoopFor i_To 1 Step1Label4.CaptionLabel4.Caption&Str(ans(;)Next iEnd Sub(2)根据本题算法,若输入的两个整数分别为5125和18,则在输出乘法计算结果时,变量length的值为_。10.小明在学校中请一些同学做问卷调查,为了实验的客观性,他对两个班级的90名同学进行编号,随机产生不同号码,对于其中相同的号码,只保留一个,为方便调查,在号码产生过程中,号码始终是从小号到大号排列,直到找到10个同学号码为止。1)用b
28、数组表示该号码是否产生,b(x)若为0,表示x未产生;2)先产生a(0)和a(1)两个号码,从第3个开始,产生数x,先判断b(x)的值,如果为0,再去插入到合适位置;3)如果x比前面第一个数大,则直接放入a(i)数组元素中,否则判断中间第Int(i/2)位置m的数,如果比位置m中的数字大,则在后面区间中查找,否则在前面区间中查找;4)从该数x应该存放的位置开始的数据向后移动,并把该数x存放起来。他为此编写VB程序,单击“产生”按钮Command1,在列表框List1中输出每次产生的号码。程序运行界面如下图所示。实现上述功能的VB程序如下,请在划线处填入合适的代码。Dim a(10)As Int
29、eger,b(100)As IntegerPrivate Sub Command1_Click()Dim iAs Integer,x As Integer,s As StringRandomizea(1)Int(Rnd()*90 1)a(2)Int(Rnd()*(90 a(1)a(1)1)b(a(1)1:b(a(2)1List1.AddItem 产生前 2个号码是:Str(a(1)Str(a(2)_Do While i 10 x Int(Rnd()*90 1)If b(x)0 ThenIf _ Thena(i)xElsewz seach(i,x)For k i 1 To wz Step 1a(k 1)a(k)Next k_End Ifb(x)1s 产生前 Str(i)个号码是:For j 1 To is s Str(a(j)Next jList1.AddItem si i 1End IfLoopEnd SubFunction seach(p As Integer,x As Integer)As IntegerDim m As Integer,j As Integerm Int(p/2)If_ Thenj m 1Do While a(j)x And j 1j j 1Loopj j 1End Ifseach jEnd Function