教师备用题库
1.(2013浙江3月高考,5,3分)如果一个整数是另一个整数的平方,则称该数是“完全平方数”。如:1=1×1,4=2×2,9=3×3,所以1、4、9是完全平方数。下列VB程序可以求出1到n(1≤n≤1 000)之间的所有完全平方数之和:
Private Sub Command1_Click()
Dim s As Long ??用于存储1到n之间所有完全平方数之和
Dim i As Integer,n As Integer
n=Val(Text1.Text)
s=0
For i=1 To n
If ok(i) Then s=s+i ??当ok函数返回值为True时,执行s=s+i
Next i
Label1.Caption=Str(s)
End Sub
’ok函数用于判断变量t的值是否为完全平方数
Function ok(t As Integer)As Boolean
Dim k As Integer
If k*k=t Then ok=True Else ok=False
End Function
方框中的正确语句是( )
A.k=Int(Sqr(t)) B.t=Int(Sqr(k))
C.k=t^2 D.t=k^2
答案 A 本题考查自定义函数的运算。在判断t是否为完全平方数之前,先取出k的值,使k=Int(Sqr(t)),若正好有k*k=t,则得出结论:t是完全平方数,ok=True。
2.趣味数学题。小明使用VB编写程序解一道有趣的数学题:将1到9这九个数字分成三个三位数,不能有重复,三个数字之间比例满足1∶2∶3,求所有三位数组合。
程序界面如图所示,当单击“求解”按钮Command1时,在列表框List1中显示所有满足条件的组合。
程序代码如下,请在划线处填上合适的代码。
Dim a(0 To 9) As Integer
Private Sub Command1_Click()
Dim i,n,m As Integer
For i = 123 To 333
For n = 1 To 9
a(n) = 0
Next n
s = 0
call fenjie (i)’使用call调用自定义过程,下同
call fenjie (2 *i)
call fenjie (3 *i)
For m = 1 To 9
s = ① ?
Next m
If s = 9 Then List1.AddItem i & “ ” & 2 * i & “ ” & 3 * i
Next i
End Sub
Sub fenjie(x As Integer) ’自定义过程,将3位数分解并修改对应下标元素的值
a(x Mod 10) = 1
② ?
a(x 100) = 1
End Sub
答案 ①s+a(m) ②a(x10 mod 10)=1或等价答案
解析 本题的关键是:如何判断一个三位数每位数字都不重复?由于每位数字的范围是1~9,故程序设置了一个数组a,下标也是1~9,用于对应每一位数字。
由题意可知,自定义过程fenjie(x)的作用是:将一个三位数字x逐位分解,并将相应的数组a置1,如x=123,则让a(1)=1,a(2)=1,a(3)=1。
程序中用了三个过程调用:fenjie(i)、fenjie(2*i)、fenjie(3*i),在保证三个数比例是1∶2∶3的前提下,调用过程fenjie给数组a赋值。若所有数字都出现过,那么数组a所有元素的和就是9。故①处填s+a(m),实现数组a所有元素的累加;②处填a(x 10 mod 10)=1,取三位数中的十位数字,给对应的数组元素赋值。
第5节 过程与自定义函数
模拟演练
1.素数:只能被1和它本身整除的自然数。要求编写VB程序找出任意两个整数之间中所有的素数及个数,程序运行界面如下图所示。
请根据算法将下列程序补充完整。
Function prime(a As Integer)As Boolean
Dim j As Integer
prime=True
j=2
Do While prime And j<=a2
If a Mod j=0 Then
prime=False
Exit Do
End If
① ?
Loop
End Function
Private Sub Command1_Click( )
Dim i As Integer,a As Integer,b As Integer
Dim count As Integer
a=Val(Text1.Text)
b=Val(Text2.Text)
For i=a To b
If ② =True Then?
List1.AddItem Str(i)
count=count + 1
End If
Next i
Label1.Caption=“素数共有” + Str(count) + “个!”
End Sub
答案 ①j=j+1 ②prime(i)
解析 ①自定义函数prime的功能是判断变量a是否是素数,判断的方法是用循环语句逐个测试2到a2中的整数中,是否存在能把a整除的数,如果有,那么a就不是素数,用变量j来记录测试的整数,因此每测试完一个j,需要将j加1。
②该处是判断数i是否是素数,通过调用函数prime。
2.小明编写统计字符串中出现最多的字母和数字的程序。程序运行如下:在文本框Text1中输入一个仅包含字母和数字的字符串。单击按钮Command1后,在标签Label1上显示出现最多的数字字符,在标签Label2上显示出现最多的字母字符(字母不区分大小写,例如字母G和g统计在一起)。程序运行界面如图所示。
(1)实现上述功能的VB程序如下,请在划线处填入合适的代码。
Private Sub Command1_Click()
Dim a(1 To 10) As Integer ’存储0~9每个数字出现的次数
Dim b(1 To 26) As Integer ’存储a~z每个字母出现的次数
Dim zf As String, x As String,p As Integer
Dim maxa As Integer, maxb As Integer
① ?
For i = 1 To Len(zf)
x = Mid(zf, i, 1)
If pd(x) = 1 Then
p = Asc(x) - Asc(“0”) + 1
a(p) = a(p) + 1
② ?
p = Asc(x) - Asc(“A”) + 1
b(p) = b(p) + 1
Else
p = Asc(x) - Asc(“a”) + 1
b(p) = b(p) + 1
End If
Next i
k = a(1):maxa = 1
For i = 2 To 10
If a(i) > k Then k = a(i):maxa = i
Next i
k = b(1) :maxb = 1
For i = 2 To 26
If ③ Then k = b(i) :maxb = i?
Next i
Label1.Caption =“出现最多的数字是” + Chr(maxa+ Asc(“0”)-1)
Label2.Caption = “出现最多的字母是” + Chr(maxb + Asc(“A”)-1)
End Sub
Function pd(ch As String) As Integer ’函数用于判断每个字符类型
If ch >= “0” And ch <= “9” Then pd = 2
If ch >= “A” And ch <= “Z” Then pd = 2
If ch >= “a” And ch <= “z” Then pd = 3
End Function
答案 ①zf = Text1.Text
②Else If pd(x) = 2 Then
③b(i)>k
解析 本题综合考查算法及其程序的实现。a(1)存储字符“0”的个数,a(2)存储“1”的个数,……,b(1)存储字符“a”和“A”的个数,b(2)存储字符“b”和“B”的个数,……,查找数组a中的最大值,并将最大值下标存储在maxa中。查找数组b中的最大值,并将最大值下标存储在maxb中。①联系下文代码Len(zf)得知需要对变量zf进行赋值,结合题容易得出第一空为zf = Text1.Text。 ②分析For循环体内部是一个块If语句结构,块If语句结构形式:
If 条件 Then
……
Else If条件 Then
……
Else
……
End If
结合语句p = Asc(x) - Asc(“A”) + 1和函数pd 可知Else If部分判断字符是不是大写字母,所以第二空答案为Else If pd(x) = 2 Then 。③该处For循
环语句用于实现求解数组b中的最大元素,得出条件为b(i) > k。
第5节 过程与自定义函数
真题再现
选考题组
1.(2018 浙江 4 月选考,17,6 分)为分析数组 a 中各元素依次变化的情况,进行如下定义:
●变化段:数组中相邻两个元素构成一个变化段。变化段有上升段(a(i)>a(i-1)) 、下降段(a(i)
●波峰: 从上升段转到下降段形成一个波峰。 波峰的起点是峰顶前所有连续上升段中的第1 个,终点是峰顶后所有连续下降段中的最后 1 个。
●对称波峰:上升段与下降段个数相同的波峰称为对称波峰。
下图为一组数据的变化段及波峰示意图。
现要求统计数组 a 各元素依次变化过程中“对称波峰”的个数。小李依据上述描述设计如下VB 程序。请回答下列问题:
(1)数组元素“1,4,3,3,2,6,8,7,9,3,4,7,9,6,3,1”依次变化过程中“对称波峰”的个数为 。?
(2)请在划线处填入合适的代码。
Const n = 20
Dim a(1 To n) As Integer
Private Sub Form_Load()
’读取数据,并存储到数组 a 中,代码略
End Sub
Private Sub Command1_Click()
Dim flag As Integer’存储变化段的状态:1 表示升,-1 表示降,0 表示平
Dim count As Integer’存储对称波峰段的个数
Dim steps As Integer
Dim i As Integer
flag = 0: steps = 0: count = 0
For i = ① To n?
If a(i) > a(i - 1) Then
If IsSymPeak(flag, steps) Then count = count + 1
If flag = 0 Or flag = -1 Then
② ?
Else
steps = steps + 1
End If
flag = 1
ElseIf a(i) = a(i - 1) Then
If IsSymPeak(flag, steps) Then count = count + 1
steps = 0
flag = 0
Else
steps = steps - 1
flag = -1
End If
Next i
If IsSymPeak(flag, steps) Then count = count + 1
Text1.Text = Str(count)
End Sub
Function IsSymPeak(flag As Integer, steps As Integer) As Boolean
If ③ Then?
IsSymPeak = True
Else
IsSymPeak = False
End If
End Function
答案 (1)3 (2)①2 ②steps=1 ③flag=-1 and steps=0
解析 (1)升与降个数一样的是对称波峰,因此数组元素中“1,4,3”“6,8,7”
“3,4,7,9,6,3,1”三段是对称波峰。
(2)①比较的第一对数是a(2)与a(1),因此i的初值为2。②此时的情况是a(i)>a(i-1),并且flag=0(表示平),或flag=-1(表示降),说明前面数据段是降或平,而当前开始出现了升序段,而且是第一个,因此变量steps赋为1。变量steps表示升的个数和降的个数,升一个加1,降一个减1.③自定义函数IsSymPeak通过flag与steps的值来判断是否是对称波峰,变量steps表示升的个数和降的个数,升一个加1,降一个减1。如果flag=-1(表示降),并且steps=0(升的个数与降的个数刚好一样),说明这是一个对称波峰。
2.(2017浙江4月学考+选考,17,6分)小王编写了一个依据成绩计算名次的VB程序,成绩为0到100之间的整数。算法的基本思想:先统计每个分数的个数,然后按照分数从高到低依次计算每个有效分数(该分数的个数不为0)对应的名次,分数相同时名次并列。最高分为第1名,该分数的名次与个数之和为下一个有效分数的名次,以此类推。程序用数组A存放每个分数对应的个数,数组B存放每个分数对应的名次。例如,下表中最高分100有2个,并列第1名,则分数96的名次为分数100的名次加上分数100的个数,即第3名。
分数
100
99
98
97
96
95
94
…
0
个数(A数组)
2
0
0
0
1
0
3
…
0
名次(B数组)
1
3
4
…
程序运行时,学生数据显示在列表框List1中,单击“计算”按钮Command1,计算结果显示在列表框List2中,程序运行界面如图所示。
实现上述功能的VB程序如下,请回答下列问题:
(1)如表所示,若分数93的个数为2,则该分数对应的名次为 。?
(2)请在划线处填入合适的代码。
Dim sName(1 To 50) As String ’存放学生姓名
Dim sScore(1 To 50) As Integer ’存放学生分数
Dim recCount As Integer ’存放学生人数
Private Sub Form_Load()
’本过程从数据库中读取学生数据,存储在相应的变量中,并在List1中显示
’代码略
End Sub
’整数转换成长度固定的字符串
Function ads(x As Integer, n As Integer) As String
Dim sx As String, nx As Integer, i As Integer
sx = Str(x): nx = Len(sx)
For i = 1 To n - nx
sx = “” + sx
Next i
①
End Function
Private Sub Command1_Click()
Dim A(0 To 100) As Integer ’存放每个分数的个数
Dim B(0 To 100) As Integer ’存放每个分数的名次
Dim mc As Integer, score As Integer, i As Integer
For i = 0 To 100
A(i) = 0
Next i
For i = 1 To recCount ’计算每个分数的个数
②
Next i
mc = 1
For i = 100 To 0 Step -1 ’计算每个分数的名次
If A(i) <> 0 Then
B(i) = mc
③
End If
Next i
List2.Clear
List2.AddItem“姓名 分数 名次”
List2.AddItem“----------------”
For i = 1 To recCount
score = sScore(i)
mc = B(sScore(i))
List2.AddItem sName(i) + ads(score, 5) + “第” + ads(mc, 3) + “名”
Next i
End Sub
答案 (1)7
(2)①ads=sx ②A(sScore(i))=A(sScore(i))+1
③mc=A(i)+B(i)或mc=mc+A(i)
解析 (1)根据排名方法:最高分为第1名,该分数的名次与个数之和为下一个有效分数(第2名)的名次,以此类推。93分之前的有效分数是94分,排第4名,并且有3个94分,因此4+3=7即为93分的名次。
(2)由于分数和名次的数据位数不一样,为了保证输出的时候能排列整齐,因此自定义一个函数ads来处理。在自定义函数结束前,必须要给函数名赋值,确保有函数的返回值。变量sx是处理完毕的字符串,因此将sx赋值给函数名,所以①处为ads=sx。
变量recCount存储学生的总人数,数组sScore存储每位学生的分数,因此sScore(1)、sScore(2)、…、sScore(recCount)分别是第1位、第2位、…、第recCount位学生的分数。数组A存放每个分数的人数,如A(90)存的是90分的人数。用For语句将所有学生的分数统计一遍,计算方法是A(sScore(i))=A(sScore(i))+1,如统计到第i位学生,若分数是90,则sScore(i)=90,相当于A(90)=A(90)+1,即90分的人数加1个。
数组B存放每个分数的名次。从③处前一行代码:B(i)=mc可得出mc中存有当前有效分数的名次值,因此③处应该计算下一个有效分数的名次值。当前分数的名次B(i)与个数A(i)之和即为下一个有效分数的名次,因此下一个有效分数的名次为mc=A(i)+B(i)。而mc在赋值之前,mc中存的是当前分数的名次B(i),因此③处也可以填mc=A(i)+mc。
3.(2015浙江10月学考,17,5分)某数据加密方法描述如下:
(1)以字节为单位进行加密处理;
(2)将1个字节的8位二进制数分割成前4位与后4位两个二进制数;
(3)分别将上述两个4位二进制数转换为十进制数;
(4)将每个十进制数转换为1个加密字符,对应的“密码表”如下:
值(十进制)
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
加密字符
I
l
i
k
e
C
H
N
p
o
s
t
c
a
r
d
小明按照上述方法,设计了一个字符串(仅包含ASCII字符)加密的VB程序,功能如下:单击“加密”按钮Command1,程序依次将文本框Text1中每个字符的ASCII码值作为1个字节转换为两个加密字符,连接这些加密字符,最后在文本框Text2中输出加密结果。下表显示了字符串中一个字符的加密过程:
m
109
0
1
1
0
1
1
0
1
6
13
H
a
←转换前字符m
←字符m的ASCII码十进制值
←对应的二进制数
←分割、转换后的十进制数
←对应的加密字符
程序运行效果如图所示。
实现上述功能的VB程序如下:
(1)请在划线处填入合适代码。
Private Sub Command1_Click( )
Dim n As Integer,s As String,i As Integer,ss As String
Dim a As Integer ’存储加密前字符的ASCII码
Dim b1 As Integer,b2 As Integer ’分别存储分割、转换后的两个十进制数
s=Text1.Text
① ?
For i=1 To n
a=Asc(Mid(s,i,1))
b1=a/16
b2=a Mod 16
ss=ss+Code2Char(b1)+Code2Char(b2)
Next i
Text2.Text=ss
End Sub
’十进制值转换为加密字符的函数
Function Code2Char(c As Integer)As String
Dim s As String
s=“IlikeCHNpostcard”
Code2Char= ② ?
End Function
(2)若将“密码表”中值为“0”对应的加密字符“I”改成“i”,加密后的密文可能无法解密,原因是 。?
答案 (1)①n=Len(s)或n=Len(Text1.Text)
②Mid(s,c+1,1)
(2)加密字符i对应两个值0,2
解析 本题考查字符函数的使用及自定义函数的理解应用。(1)①由题中for语句循环变量i的终值为n,可以推断变量n代表加密前字符串的长度,故n=Len(s),或者n=Len(Text1.Text)。②自定义函数Code2Char返回一个加密后的字符,根据题干中表格,我们可以看出十进制数0开始对应相应字符,因此十进制数对应的字符位于字符串s的第c+1位,即Code2Char=Mid(s,c+1,1)。(2)若将密码表中值为“0”对应的加密字符“I”改成“i”,会导致密码表中出现两处“i”,这样无法一一对应,密文可能无法解密。
课件19张PPT。
第5节 过程与自定义函数一 事件处理过程二 自定义函数教材研读突破 自定义函数的调用重难突破一、事件处理过程
一个事件的发生,可以引起某个对象上某个方法(事件处理过程)的执
行,即由某个事件驱动了相应的事件处理过程的执行。这就是面向对象程序设计中的事件驱动概念。
事件处理过程:Sub 事件处理过程名(参数表) 语句块
End Sub
其中,事件处理过程名的表达规范:对象名_事件的标准名。如Command1_Click、Form_Load、Timer1_Timer()等。 自定义函数:Function 函数名(参数表) As 类型名
语句块
End Function 二、自定义函数
函数是类似于过程的另一个程序模块,不同之处是函数执行完成后,函数的计算结果被送到函数的调用点上,供程序的后继部分继续进行处理。?1.某Visual Basic工程的代码窗口如图所示:以下说法正确的是?( C )
A.窗口中有三个事件处理过程
B.窗口中有三个自定义函数过程
C.窗口中有两个事件处理过程和一个
自定义函数过程
D.窗口中有一个事件处理过程和两个
自定义函数过程
解析 事件处理过程:Sub 事件处理过程名(参数表)
语句块
End Sub
自定义函数: Function 函数名(参数表) As 类型名
语句块
End Function
Command1_Click和Form_Load是事件处理过程,even是自定义函数的函数名。2.有如下Visual Basic自定义函数:
Function f(x As Integer) As Single
f=Abs(x)
End Function
该函数返回值的数据类型是?( D )
A.整数型 B.日期型 C.逻辑型 D.单精度实数型解析 本题考查自定义函数的语法。
自定义函数格式为:
Function 函数名(参数表) As 类型名
语句块
End Function
本题自定义函数函数名为f,其返回值的类型为Single。3.有如下程序:
Private Sub Command1_Click()
Dim x As Integer
x=Val(Text1.Text)
Text2.Text=even(x)
End Sub
Function even(num As Integer) As String
If num Mod 2=0 Then even=“偶数” Else even=“奇数”End Function
程序中的自定义函数的函数名是?( B )
A.x B.even C.num D.Function解析 本题考查自定义函数的语法。
自定义函数:Function 函数名(参数表) As 类型名
语句块
End Function
根据自定义函数格式判断,该函数的函数名为even。自定义函数的调用
1.自定义函数的作用
把程序中实现某一个功能的代码封装在一个逻辑单元中,让程序可以重复地调用该逻辑单元,带来的好处有:减少代码量;程序更容易调试。2.自定义函数的语法结构
Function 函数名(参数表) As 类型名
语句块
End Function
(1)Function后面的单词即是函数名,函数名的命名规则与变量名的命名规则相同,长度不超过40个字符。
(2)参数表是函数调用的纽带。在定义函数时,参数表里定义的变量是形参(不知道具体的数值,但必须知道数据类型),当程序的其他模块调用函数时,参数值一般就得到确认了,因此函数调用时,调用语句中参数表里填写的是实参(也就是实际的参数,有值的参数),要求实参的个数和类型必须与形参的个数和类型相匹配。通过函数调用,把这些知道值的参数代入,求出值,也就是函数的返回值,并返回调用点。
(3)As后面的“类型名”,是函数返回值的数据类型。自定义函数必须有返回值,而且有且只有一个返回值。
(4)自定义函数的过程代码中,一般会有一个表达式,用来计算函数的返回值,并且通过赋值语句,将表达式的值赋给自定义函数的函数名,形如:函数名=表达式。如果整个函数过程中没有该语句,则该函数过程返回一个默认值:数值类型的函数过程返回0;字符串类型的函数过程则返回一个空字符串。
(5)自定义函数执行过程中,可随时退出函数过程,使用语句:Exit Func-tion从函数过程中退出。例 下列VB程序用于求2个正整数(均小于10000)的最大公约数:
Private Sub Command1_Click()
Dim x As Integer,y As Integer,z As Integer
x=Val(Text1.Text) ??????第1个正整数
y=Val(Text2.Text) ??????第2个正整数
??????调用函数gcd
Text3.Text=Str(z)
End SubFunction gcd(a As Integer,b As Integer) As Integer
Do While a <> b
If a>b Then a=a-b Else b=b-a
Loop
gcd=b
End Function
方框中的正确语句是?( C )
A.z=gcd B.z=gcd(a,b)C.z=gcd(x,y) D.z=gcd x,y解析 本题考查自定义函数的调用。在调用已经定义好的函数时,必须要有与定义函数数量相同,类型相同的参数。本题中定义函数gcd时引用了两个形式参数a、b,在调用函数gcd时,两个实际参数x、y与a、b相对应。