1、VB调试题解答07317第四部分:上机程序调试题(改错或填空)(一)说明等级考试上机测试的程序调试题常常是在考生目录中给出一个标准模块程序Modify.BAS,要求根据题意修改该模块中的函数或过程,为检测所作修改是否正确,可以按照以下操作步骤进行调试:1要求学生建立一工程,将这一模块添加到工程中。如果你是通过双击标准模块程序Modify.BAS进入Visual Basic程序设计系统的,则首先需要添加一个窗体模块。2将该标准模块程序Modify.BAS代码中用-n-(n为1,2,3,4,5)部分删除后改为合适的内容或将用*错误n*标示的下一语句中的错误改正,并在窗体模块中编写代码(常常写在窗体
2、的Click()事件中)调用标准模块中的sub过程或自定义函数(如果在标准模块程序中有多个过程或函数,要注意调用的先后顺序,否则得不到正确结果),调试运行程序,使其能输出正确结果。3按试题要求保存工程。(二)程序调试题题1 Modify.bas模块中的Transfer过程用于将一个十六进制整数转换为十进制整数;number函数过程用于将一个十六进制符号转换为数值。Public Sub Transfer() Dim Hex As String 十六进制数 Dim Dec As Double 十进制数 Dim temp As String Dim i As Integer Dim n As Int
3、eger Hex = InputBox(输入一个十六进制整数) * 错误1 *n = Val(Hex)n=len(Hex) i = 0 Do * 错误2 * temp = Mid(Hex, i, 1) temp=Mid(Hex,n-i,1) * 错误3 * Dec = Dec + number * 16 i Dec=Dec+number(temp)*16i i = i + 1 Loop While i a(i) Then * 1 * Swap (a(j), a(i) .Swap a(j),a(i) End If Next j i = i + 1 * 2 *Loop While i = nLoo
4、p while in Form1.Print 排序结果 For i = 1 To n Form1.Print a(i); Next iEnd SubPublic Sub GenerateData() Dim i As Integer Dim j As Integer Dim b As Boolean For i = 1 To n b = False Do While Not b a(i) = Int(20 * Rnd + 1) b = True * 3 * For j = 1 To i for j=1 to i-1 If a(i) = a(j) Then b = False Exit For
5、End If Next j Loop Form1.Print a(i) Next iEnd Sub* 4 *Public Sub Swap(ByVal a As Integer, ByVal b As Integer)Public Sub Swap(a as integer,b as integer) Dim temp As Integer temp = a a = b b = tempEnd Sub题3 Modify.bas模块中的wrap过程用于判断一个字符串是否“回文”。所谓“回文”是指字符串顺读与倒读都是一样的,如“潮起潮落,落潮起潮”。Public Sub Wrap()Dim len
6、gth As Integer Dim str1 As String Dim strleft As String Dim strright As String Dim k As Integer str1 = InputBox(请输入任意的字符串) 输入任意字符串 *错误1*length = Val(str1)length=len(str1) k = 1 Do *错误2* strleft = Left(str1, k) 从左边起逐个取出一个字符 strleft= mid(str1,k,1) *错误3* strright = Right(str1, k) 从右边起逐个取出一个字符 strright=
7、 mid(str1,length-k+1,1) *错误4* If strleft = strright Then If strleft strright Then Exit Do End If k = k + 1 Loop While k length / 2 Then Form1.Print str1 & 是回文 Else Form1.Print str1 & 不是回文 End IfEnd Sub题4 Modify.bas模块中的MaxLine过程用于查找一个5行4列的二维数组中行平均值最大的行,并将该行所有数据调整到第一行的位置。Modify.bas模块中的DataProduce过程用于产
8、生原始数据;Average过程用于计算各行的平均值;PrintArraay过程用于打印二维数组和行平均值。Dim a(1 To 5, 1 To 4) As IntegerDim ave(1 To 5) As IntegerPublic Sub MaxLine() Dim i As Integer Dim j As Integer Dim temp As Integer Dim Line_no As Integer 最大平均值的行号 找出最大平均值所在行 Line_no = 1 For i = 2 To 5 * 错误1 *If ave(Line_no) = ave(i) ThenIf ave(L
9、ine_no)ave(i) then * 错误2 * Line_no = ave(i) Line_no=i End If Next i 交换第一行与最大平均值所在行 For j = 1 To 4 temp = a(1, j) * 错误3 *a(Line_no, j) = a(1, j)a(1,j)=a(Line_no,j) a(Line_no, j) = temp Next j 交换对应行的平均值 temp = ave(1) ave(1) = ave(Line_no) ave(Line_no) = temp 打印交换后的数据 Form1.Print 交换后的数据和平均值 PrintArrayE
10、nd SubPublic Sub DataProduce() Dim i As Integer Dim j As Integer 产生5*4数组 For i = 1 To 5 For j = 1 To 4 a(i, j) = Int(100 * Rnd) Next j Next iEnd SubPublic Sub Average() Dim i As Integer Dim j As Integer Dim sum As Integer 计算各行平均值 For i = 1 To 5 sum = 0 For j = 1 To 4 * 错误4 * sum = a(i, j) sum=sum+a(
11、i,j) Next j ave(i) = sum / 4 Next i 将数组和平均值打印出来 Form1.Print 原始数据和平均值 PrintArrayEnd SubPublic Sub PrintArray() Dim i As Integer Dim j As Integer For i = 1 To 5 For j = 1 To 4 Form1.Print a(i, j); Spc(3); Next j Form1.Print 平均值=; ave(i) Next iEnd Sub题5 Modify.bas模块中的TJ过程是将一批数据中小于零的数及它们的积打印出来,但不完整,请在横线
12、上填入必要的内容,使其完整。Modify.bas模块中的SCSJ过程是产生数据,数据的取值范围为-1010之间的随机数。Private Const n = 10Private a(1 To n) As IntegerTJ过程是将一批数据中小于零的数及它们的积打印出来数据由SCSJ过程产生,数据的取值范围为-10 10 之间的随机整数数Public Sub TJ() Dim i As Integer Dim t As Single - 1 - t=1 For i = 1 To 10 If - 2 - a(i)0 Then t = t * a(i) End If Next i Form1.Prin
13、t T=; tEnd SubPublic Sub SCSJ() Randomize Form1.Print 原始数据 Dim i As Integer Dim j As Integer For i = 1 To n 随机产生0或1,为0时取负,为1时取正 j = Int(Rnd * 2) If - 3 - j=0Then J = -1 a(i) = j * Int(Rnd * (n + 1) Form1.Print a(i); Next i Form1.PrintEnd Sub题6 Modify.bas模块中的calculate过程是产生100个0,99范围内的随机整数,统计个位上的数字分别为
14、1,2,3,4,5,6,7,8,9,0的数的个数并打印出来.Public sub calculate()Dim a(1 to 100) as integerDim x(1 to 10) as integerDim I as integer,p as integer产生100个0,99范围内的随机整数每行10个打印出来for I=1 to 100*1*a(i)=rnd*100a(i)=int(Rnd*100)if a(i)10 then form1.print space(2);a(i)else form1.print space(1);a(i);endifif I mod 10=0 then
15、form1.printnext I统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并将统计结果保存在数组x(1),x(2),x(10)中,将统计结果打印出来for I=1 to 100 *2* p=int(a(i)/10) 求个位上的数字 p=a(i) mod 10 if p=0 then p=10*3*x(p)=x(p)-1x(p)=x(p)+1next Iform1.print “统计结果”for I=1 to 10 p=Iif I=10 then p=0*4*form1.print “个位数为”+str(p)+”共“+str(x(p)+”个”Form1.print
16、“个位数为”+str(p)+”共”+str(x(i)next Iend sub题7 Modify.bas模块中的PrintArray过程是用于打印一个5行5列的数字方阵,并使两对角线上元素均为1,其余均为2。要求打印的数字方阵两列数字之间空3格,两行之间空一行。Public Sub PrintArray() 下面程序用于打印5行5列的数字方阵 使两对角线上元素均为1,其余均为2 要求打印的数字方阵两列数字之间空3格,两行之间空一行 只要修改标出出错位置的下面那一条语句 Dim a(5, 5) As Integer Dim i As Integer, j As Integer For i = 1
17、 To 5 For j = 1 To 5 * 错误1 * If i j Or i 6 - j Then If ij and i6-j then a(i, j) = 2 Else a(i, j) = 1 End If * 错误2 * Form1.Print a(i, j) + Space(3); Form1.print a(I,j);space(3); Next j * 错误3 * Form1.Print form1.print :form1.print Next iEnd Sub题8 Modify.bas模块中的Guess过程是猜数游戏,由计算机产生一个1,100的任意整数,输入猜数后计算机给
18、出提示,如果5次后还没有猜中就结束游戏并公布正确答案,请改正其中的错误。说明:只要修改标出出错位置的下面那条语句。Public Sub Guess() Dim R As Interger Dim X As Integer Dim time As Integer Randomize -1- R=Rnd*100 产生一个1100的任意整数R=int(rnd*100)+1 Times=1 Do X=Val(InputBox(输入猜数X) Select Case X Case R Form1.Print 猜中了 Exit Do -2- Case XR Case IsRForm1.Print 太大了,继
19、续猜! Case ElseForm1.Print 太小了,继续猜!End SelectTimes=times+1-3-Loop While times5Loop until times5If times5 Then Form1.Print 猜数失败,游戏结束! -4- Form1.Print 正确答案为 & Str(x) Form1.print “正确答案为”& str(r) End IfEnd Sub题9 Modify.bas模块中的Findat过程是用于在一个字符串变量中查找”at”,并用消息框给出查找结果的报告:没有找到或找到的个数。Public Sub Findat() 在字符串str
20、1中查找at Dim str1 As String Dim length As Integer 字符串长度 Dim sum As Integer 查到的个数 Dim i As Integer str1 = InputBox(请输入一个字符串) length = -1- Len(str1) i = 1 sum = 0 Do While i c(j) Then Temp=c(i) C(i)=c(j) C(j)=temp End If Next jNext I排序后的字符组成新字符串y=For I=1 to l -4- y=y & c(i)Next IForm1.Print 原始字符串 ; xFor
21、m1.Print 重新组合的字符串 ; y End Sub题11 sum过程用于计算f=1-1/(2*3)+1/(3*4)-1/(4*5)+1/(19*20),请在横线上填入必要的内容。Option ExplicitPublic Sub sum() Dim f As Single Dim i As Integer Dim sign As Integer -1- sign=-1 f = 1 -2- for I=2 to 19 f = f + sign / (i * (i + 1) -3- sign=-sign Next i Form1.Print f=; fEnd Sub题12 有一个数列,它的
22、前三个数是0,1,2,从第四个数起,每个数都是它前面的两个数之和(斐邦纳契数列),过程Fabonia用于求出该数列的第17个数是多少?求出该数列的第几个数起每个数都超过1E+8?请在横线上填入必要的内容。Option ExplicitPublic Sub Fabonia() Dim last_one As Long Dim last_two As Long Dim this_one As Long Dim i As Integer last_one = 1 数列的第二个数 last_two = 2 数列的第三个数 i = 4 从数列的第四个数求起 Do this_one = last_one
23、+ last_two -1- last_one=last_two -2- last_two=this_one If i = 17 Then Form1.Print No:17=; this_one End If -3- i=i+1 Loop While this_one 1E+8End Sub题13 以下程序完成下列功能:随机产生9个1-100的整数数组,并按从小到大的顺序进行排序,从键盘输入一个正数,找到该数在原来9个数中的插入点,使得该数插入数组后,数组的10个数依然是从小到大的顺序。请在横线上填入必要的内容。Option ExplicitPublic Sub Insert() Dim x(10) As Integer Dim i As Integer, j As Integer Dim temp As Integer Dim ins As Integer, pos As Integer 随机产生9个1-100的整数并排序 Randomize For i = 1 To 9 -1- x(i)=int(
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1