2020版高考信息技术二轮浙江专用 专题六 最值、标志及子序列问题课件(47张幻灯片)+学案

文档属性

名称 2020版高考信息技术二轮浙江专用 专题六 最值、标志及子序列问题课件(47张幻灯片)+学案
格式 zip
文件大小 5.0MB
资源类型 教案
版本资源
科目 信息技术(信息科技)
更新时间 2019-11-30 14:31:25

文档简介


专题六 最值、标志及子序列问题
1.(2019·4月浙江省选考)给定m个区间和1个数组(有n个元素),现要求根据各区间限定的取值范围,将数组依次分隔成m+1个段。具体分割方法如下:
 第1段是从数组首个元素开始、元素值都属于第1区间的最长连续元素段。如果首个元素不属于第1区间,则第1段元素个数为0;
第1段分割后的剩余元素,用同样的方法来依次分割第2段、第3段、…、第m段;
第m段分割后的剩余元素分割到第m+1段(剩余段)。
若第p(1≤p≤m-1)段末尾连续元素的值也同时属于第p+1区间,则这块连续元素称为第p段“重叠块”,该段其余部分称为第p段“非重叠块”。由于不存在第m+1区间,这里特别规定:第m段的全部元素都分割到m段“非重叠块”,第m段“重叠块”的元素个数为0,一个数组分段示例如下图。图中数组第1个元素10不属于第1区间[0,5],因此第1段的元素个数为0。10和20属于第2区间,而33不属于第2区间,因此第2段只包含10和20两个元素。第3段末尾连续3个元素的值也同时属于第4区间,因此,第3段“非重叠块”包含33,58,46,第3段“重叠块”包含55,62,69。
(1)给定2个区间依次为[10,50]、[30,80],数组各元素为“12,44,34,45,66,50,45,70”,则第1段“重叠块”中的元素个数为________个。
(2)小李根据上述描述,设计了一个统计各段“非重叠块”、“重叠块”和剩余段中元素个数的算法。算法的VB程序如下,请在划线处填入合适的代码。
Const n = 18, m = 6
Dim a(1 To n) As Integer
Dim b(1 To 2 * m) As Integer
′b(1)、b(2)为第1区间的下限和上限, b(3)、b(4)为第2区间的下限和上限,…
Dim c(1 To 2 * m + 1) As Integer
′数组c用于保存统计结果:
′c(1)、c(2)分别存储第1段“非重叠块”和“重叠块”的元素个数,
′c(3)、c(4)分别存储第2段“非重叠块”和“重叠块”的元素个数,…
′c(2m-1)存储第m段“非重叠块”元素个数,c(2m)存储第m段“重叠块”元素个数(值为0)
′c(2m+1)存储剩余段元素个数
Private Sub Command1_Click()
Dim i As Integer, p As Integer, L As Integer, LL As Integer
′读取n个数据并保存在数组a中,代码略
′读取m个区间的下限和上限并保存在数组b中,代码略
For i = 1 To 2 * m + 1
 c(i) = 0
Next i
i = 1: p = 1
L = 0: LL = 0
Do While ______①____
 If IsIn(i, p) Then
If IsIn(i, p + 1) Then
  LL = LL + 1
Else
______②____
 LL = 0
End If
i = i + 1
 Else
c(2 * p - 1) = L
c(2 * p) = LL
L = 0: LL = 0
p = p + 1
 End If
Loop
If i <= n Then
  c(2 * p - 1) = n - i + 1
Else
 c(2 * p - 1) = L
 c(2 * p) = LL
End If
′输出统计结果,代码略
End Sub
′函数IsIn用来判断a(i)值是否属于第p区间
Function IsIn(i As Integer, p As Integer) As Boolean
 If p > m Then
IsIn = False
 Else
If ____③____ Then IsIn = True Else IsIn = False
 End If
End Function
解析 数据44,34,45既属于第1区间,也属于第2区间。自定义函数IsIn功能判断a(i)值是否属于第p区间,变量i代表数组a的下标,p代表第几个区间,要判断是否属于该区间,必须满足这区间的范围内,即满足条件a(i)>=b(2*p-1) And a(i)<=b(2*p)。在主程序中,Do循环过程中i和p都不断递增,这两个都不能超越最大值,得出循环条件为:i<=n And p<=m。变量LL存储重叠块元素个数,L存储非重叠块元素个数。因为重叠元素必须是第p块末尾连续的一段,如果第i个元素不属于p + 1段,则前面累计到LL中的个数要算在非重叠块元素个数L中,再算上第i个元素,共LL+1个要累计到非重叠块元素个数L中。所以这一空的答案为:L=L+LL+1。
答案 (1)3 (2)①i<=n And p<=m ②L=L+LL+1
③a(i)>=b(2*p-1) And a(i)<=b(2*p)
2.(2018·4月浙江省选考)为分析数组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
解析 变量flag是一个标志,他有三个值,代表处于三种状态。IsSymPeak函数的功能是判断是否是一个对称波峰,如果是一个对称波峰,到达对称波峰的终点时Steps的值肯定为0。如果前面下降段且 Steps 为0,并且当前位置是“V”拐点,则代表前面刚好是一个对称波峰。函数IsSymPeak 为True,否则为False。第一次比较的是a(2)和a(1),所以循环变量i 的初值为2。升 Steps 加1,降Steps 减1。
答案 (1)3 (2)①2 ②steps=1 ③flag=-1 And steps = 0 或其他等价表达式
3.(2016·4月浙江选考)某地1900~1999年的平均降水量数据保存在数据库中。现要求找出相邻两年年平均降水量变化(即本年度与上年度“年平均降水量”差值的绝对值)最大的年份区间。如果有多个符合要求的年份区间,只输入距今最近的。小吴为此编写了VB程序,程序运行时,单击按钮Command1后,在文本框Text1中输出运行结果。实现上述功能的VB代码如下,但加框处代码有错,请改正。
Dim w(1 To 100) As Single ′依次存储1900~1999年的年平均降水量数据
Const n = 100
Private Sub Form_Load()
′本过程从数据库中按1900~1999年依次读取年平均降水量数据,并存储在数组w中
′代码略
End Sub
Private Sub Command1_Click()
Dim i As Integer, imax As Integer
imax =    ′(1)
For i = 3 To n
 If Abs(w(i) - w(i - 1)) >= 
 Then imax = i  ′(2)
Next i
Text1.Text = “年平均降水量变化最大的年份区间是+ Str(imax + 1898) +“-” + Str(imax + 1899)
End Sub
其中,加框(1)处应改正为________,
加框(2)处应改正为________________。
解析 该程序为顺序查找算法的变形应用,查找相邻两数的差最大的两数,所以查找应该从第2个数开始(w(2)-w(1)),所以初值imax=2;从i=3开始,Abs(w(i) - w(i - 1))依次与Abs(w(imax) - w(imax - 1))进行比较(If Abs(w(i) - w(i - 1)) >= Abs(w(imax) - w(imax - 1)) Then imax = i),变量imax用于存储最大值信息,保持每次比较后相邻数Abs (w(imax) - w(imax - 1))差最大。
答案 (1)2 (2)Abs(w(imax) - w(imax - 1))
利用信息技术解决生活中的问题,就会碰到一组具体的数值,我们把这组具体的数值称为一个序列,访问其中部分数据,称为子序列。一个数组可以称为一个系列,数组的局部也称为数组的子序列。求和、求最值和求一个连续的区间,往往是子序列中经常碰到的问题。在一个区间中,可以用标志变量表示他的状态,标志变量也经常用在判断是否存在重复数据的情况。
考点1 最值问题
1.一般定义序列中第1个数就是最值,从第2个数开始,与他前面的数进行比较,如果最值发生变化,最值的位置或值也将更新,直到序列的最后一个数为止。
2.在语句中If a(i)>imax Then imax=a(i)中,当另外一个数组元素与最值或a(i)相等时,最值并没有发生变化,因此找到的第1个最值。若把>改为>=,则找到的最后一个最值。
3.当有多个相同的最值时,可以用字符连接起来。
【例1】 小王编写 VB 程序,功能如下:在文本框 Text1 中输入一段英语短文,点击“统计”按钮 Command1,在标签 Label2 中输出该短文中出现次数最多的小写字母、次数和频率(若有多个,则全部输出)。
Private Sub Command1_Click()
 Dim i As Integer, n As Integer, f As Integer
Dim max As Integer ′变量 max 表示出现最多的字母
Dim sum As Integer ′sum 表示字母总数
Dim zm(1 To 26) As Integer ′数组 zm 存放 26 个字母出现的次数
Dim s As String, c As String
Dim cx As String ′变量 cx 存放次数最多的字符
s = Text1.Text
For i = 1 To Len(s)
c = Mid(s, i, 1)
If c >= ”a” And c <= ”z” Then
  ____①____
  zm(n) = zm(n) + 1
 sum = ____②____
End If
 Next i
 max = 0
 For j = 1 To 26
If zm(j) > max Then max = j : cx = Chr(Asc(”a”) + j - 1)
If ____③____Then cx = cx + ” ” + Chr(Asc(”a”) + j - 1)
 Next j
 f = Int(max / sum * 100)
 Label2.Caption = ”字母:” & cx & ”次数:” & max & ”频率:” & Str(f) & ”%”
End Sub
解析 本题的程序用来统计26个小写字母的出现次数,数组zm里存储着每个字母出现的次数,其中zm(1)存储着a字母出现的次数、zm(2)存储着b字母出现的次数……以此类推。求出每个字母对应的在字母表中位置n,然后zm(n)加1,Sum变量统计所有的小写字母个数。第2个for循环找出zm数组中的最大值,存储到max变量,并用cx记录了第一个最大出现次数的字母,当出现相同最值时,存储到字符串中。
答案 ①n=Asc(c)- Asc(”a”) + 1 ②sum+1
③max = zm(j)
【变式训练1】 小王用VB编写一个自动统计离散数据的“极大值”(如图a所示)个数的程序。功能如下:在列表框List1中随机产生n个介于[1,99]的正整数,单击“统计极大值”命令按钮Command1,程序自动统计出极大值,并将其输出到列表框List2,且将其中的最大值输出在标签Label1中。程序界面如图b所示,实现上述功能的VB程序如下。(假设:数据的左右两个端点不计入极大值,且相等的两个值也不计入极大值)。请回答以下问题:
(1)当 n=6,原始数据为“8 39 24 5 71 25”,此时极大值有:________。
(2)请在划线处填入合适的代码。
Const n = 10
Dim a(1 To n) As Integer    ′存储原始数据
Dim Max(1 To n) As Integer   ′存储极大值数据
Private Sub Form_Load()   ′原始数据初始化
Randomize
For i = 1 To n
a(i) = ____①______ ′产生[1,99]间随机整数
List1.AddItem Str(a(i))
Next i
End Sub
Private Sub Command1_Click()
Dim i As Integer, j As Integer
Dim count  As Integer, Maxa As Integer
count = 0
List2.Clear
For i = 2 To n - 1  ′统计极大值,左右两边端点值除外
If____②____ Then
count = count + 1
   ____③____
End If
Next i
Maxa = 0
For i = 1 To count
List2.AddItem Str(Max(i))
If Maxa < Max(i) Then Maxa = Max(i)
Next i
Label1.Caption = ”极大值中的最大值为:” + Str(Maxa)
End Sub
解析 极大值指一个范围或区间内的最大值,往往指一个连续上升的区间,他的特征是比他后面的数大,比他前面的数小。如果找到极大值,把他存储在数组max中。
答案 (1)39、71  (2)①Int(Rnd * 99) + 1 或 int(Rnd*99+1) Rnd可写成Rnd() ②a(i) > a(i + 1) And a(i) > a(i - 1) ③Max(count) = a(i)
考点2 标志问题
标志变量通常flag来表示,他表示条件是否成立,或某个(某些)变量是否出现或出现的次数,可以定义为逻辑型,可以定义为整型,或者可以定义为数组等,根据需要各取所需。
【例2】 小刘为班级的抽奖活动编写了一个 VB 程序。单击“确定”按钮 Command1 时,在列表框 List1中显示按用户抽取人数在学号起讫范围内[n1,n2](最大学号不超过 100)随机抽取到不重复的学号。输入的抽取人数不会超过学号范围内的人数。程序运行界面如下图所示。
实现上述功能的VB程序如下,请在划线处填入合适代码。
Dim xh(1 To 100) As Integer, num As Integer
Private Sub Command1_Click()
Dim n1, n2, n, x As Integer
Randomize
n1 = Val(Text1.Text)
n2 = Val(Text2.Text)
n = Val(Text3.Text)
num = 1
Do While num <= n
____①____
If num = 1 Then
xh(num) = x
num = num + 1
Else
If unique(x) = True Then
    ____②____
    num = num + 1
End If
____③____
Loop
For i = 1 To n
List1.AddItem Str(xh(i))
Next i
End Sub
Function unique(t As Integer) As Boolean
Dim j As Integer
For j = 1 To num
If xh(j) = t Then unique = False: Exit For
Next j
If ____④____Then unique = True
End Function
解析 结合产生随机整数,自定义函数unique用于判断当前参数是否已在数组xh中出现过,当函数值为True时表示未出现过,需要加入数组。在自定义函数中,FOR循环执行了num次,循环变量j变为num+1,故要填j > num 或 j = num+1 。
答案 ①x = Int(Rnd * (n2-n1 + 1)) + n1 ②xh(num) = x ③End IF ④j > num 或 j = num+1
【变式训练2】 编写“数字提取”程序,实现如下功能:在文本框 Text1 中输入包含数字和其他非数字字符混合的原始数据,点击“数字提取”按钮 Command1,将数据中的数字以“,”间隔输出到文本框 Text2 中。程序运行界面如图所示,VB 代码如下。请回答以下问题:
(1)要使程序运行后,窗体 Form1 标题立即自动显示为“数字提取”,可在________(单选,填字母:A.Form_Load /B.Form_Click/C.Command1_Click)事件过程中添加语句 Form1.Caption=“数字提取”。
(2)实现上述功能的 VB 程序如下,请在划线处填入合适的代码。
PrivateSub Command1_Click()
Dims As String, ch As String, flag As Boolean
Dimt mp As String, ans As String
s =Text1.Text
s =s +" . "
tmp=" ": ans =" "
flag = False
For i = 1 To Len(s)
 ch = Mid(s, i, 1)
 If ch >= ”0” And ch <= ”9” Then
___①____
flag = True
 ElseIf flag = True Then
ans = ans + tmp +" , "
____②____
flag = False
 End If
Next i
Text2.Text = ans
End Sub
(3)若删除程序中的语句“s = s + ”.””,输入不变,则提取后的数字信息为__________。
解析 当读取的字符是数字时,依次把这些数字进行正向连接到变量tmp中,接下来不是数字的第一个字符时,flag为True,把tmp连接到ans中,同时tmp清空。删除程序中的语句“s = s + ”.””时,最后读取的是数字,没有执行连接语句。
答案 (1)A (2)①tmp=tmp+ch ②tmp=“ ”
(3)86,1,
1.某地 2017.1~2017.2 月的日期及日最高气温据保存在数据库中。要求根据日最高气温,找出两个月中连续降温的次数、最长降温天数及其日期。小刘为此编写了 VB 程序,程序运行后,单击按钮 Command1 后,在Label1和Label2上输出运行结果。实现上述功能的VB代码如下,但加框处有错,请改正。
Dim a(1 To 59) As String′依次存2017.1~2017.2 月的日期数据
Dim b(1 To 59) As Integer′依次存2017.1~2017.2月的日最高气温数据
Private Sub Form Load()
′从数据库中按2017.1~2017.2的日期次序, 取日期和日最高气温据,分别存储在数组a和b中,代码略
End Sub
Private Sub Command1_Click()
Dim d As Integer, n As Integer, dmax As Integer, m As Integer
n = 0: d = 1: dmax = 1
For i = 2 To 59
If   Then   ′(1)
d = d + 1
Else
d = 1
End If
If d = 2 Then n = n + 1
If d > dmax Then
dmax = d
m = i
End If
Next i
Label1.Caption = ”连续降温次数” & Str(n)
Label2.Caption = ”连续最长降温日期为” &   & ”-” & Str(a(m))′(2)
End Sub
解析 观察for循环体内的代码,可知d用来记录每次连续降温的天数,n用来记录连续降温天数不小于2的序列的数量(当d为2时,n自增1)。dmax用来记录最长序列长度,m记录该序列最后一天的数组下标,则该序列第一天的数组下标是m-dmax+1。
答案 (1)b(i-1)>b(i) (2)Str(a(m-dmax+1))
2.小杜编写了一个会议签到统计的VB程序。假设人员名单中没有重名。运行界面如图所示,列表框1显示会议应到人员名单,列表框2显示会议实际出席人员名单,单击“统计”按钮Command1后,列表框3显示缺席人员名单。实现上述功能的VB程序如下,
请将划线处的代码补充完整。
Dim b(1 To n) As String ′存储会议实际到的人员名单
Dim flag(1 To n) As Boolean, m As Integer
Private Sub Form_Load()
′将n个应到人员姓名依次存储在数组a中,将m个实际参加会议人员姓名依次存储在数组b中
′在列表框1显示应到人员姓名,在列表框2显示实到人员姓名,该过程代码略
End Sub
Private Sub Command1_Click()
Dim i As Integer, j As Integer
For i = 1 To n
flag(i) = False
Next i
i = 1
Do While i <= m
For j = 1 To n
If ____①____ Then
    flag(j) = True
    Exit For ′退出for循环
End If
Next j
i = i + 1
Loop
For i = 1 To n
If ____②____Then List3.AddItem a(i)
Next i
End Sub
解析 本程序为输出未出席人员名单,用flag(i)=True表示存储在数组i位置的人员是出席过的,那么最终数组flag中,值为false的表示该位置的人员为缺席人员。程序用Do While循环列举每个出席过的人员b(i),将b(i)与所有人员名单数组a进行比较(j表示名单存储在数组中的位置),如果相等了,则表示j位置的人员出席过,令flag(j)=True。①根据以上分析,程序第1处应改成b(i)=a(j)。②为了输出所有缺席人员,因此要找数组flag值为false的位置。所以答案是flag(i)=false 或者 Not flag(i)。
答案 ①b(i) = a(j) ②flag(i) = False或 Not flag(i)
3.如果一个正整数从高位到低位上的数字依次递减,则称其为降序数(如9752、9772是降序数,而7524不是降序数)。现编写VB程序实现如下功能:在文本框Text1种输入一个正整数,单击“判断”按钮Commmand1,在标签Label2中显示出该数是不是降序数。程序运行界面如图所示。
(1)代码“Command1_Click()”中的Click是________(选填字母:A.对象名/ B.属性名/ C.事件名/ D.方法名)。
(2)请完善下列程序代码:
Private Sub Command1_Click()
 Dim i As Integer, s As String, flag As Boolean
 ____①____
 flag = True: i = 2
 Do While i <= Len(s) And flag
If____②______ Then ____③____
i = i + 1
 Loop
 If flag Then
Label2.Caption = s + ”是降序数!”
 Else
Label2.Caption = s + ”不是降序数!”
 End If
 End Sub
解析 程序往往有输入、中间处理和输出三部分组成,在程序中,变量s需输入,i表示在字符中位置,降序数的条件是该数大于或等于他前面的数。Flag表示是降序数的标志。如果不是降序数,将不再循环。
答案 (1)C (2)①s=Text1.Text ②Mid(s,i,1)4.VB程序,功能如下:单击“生成数组”按钮Command1,则随机生成13个取值范围是1~13的正整数,分别存储到数组 a 中,对数组 a 的元素进行升序排列,并在标签 label1 中显示;再单击“连续数”按钮 Command2,则在排序后的数组a中查找连续个数最多(忽略重复数值)的一组数值即:连续数),若有两组连续数个数一样多,则取数值小的一组,将连续数显示在标签label2中。运行界面如图所示。若实现上述功能的程序如下,请在划线处填写合适代码。
Dim a(1 To 13) As Integer, n As Integer
Private Sub Command1_Click()
Dim i As Integer, s As String, j As Integer
Randomize
n = 13
For i = 1 To n
a(i) = Int(Rnd * 13) + 1
Next i
For i = 1 To n - 1
For j = i + 1 To n
If a(j) < a(i) Then
     t = a(j): ______①____: a(i) = t
End If
Next j
Next i
s = ” ”
For i = 1 To n
s = s + Str(a(i))
If ____②____Then s = s + ”,”
Next i
Label1.Caption = s
End Sub
Private Sub Command2_Click()
Dim i As Integer, j As Integer, t As Integer, k As Integer
Dim max As Integer ′存储连续数个数最大值
Dim begin As Integer  ′存储连续数开始的数值
k = 1
max = 1
For i = 2 To 13
If a(i)=a(i-1)+1 Or a(i)=a(i-1) Then
If ____③____ Then k = k + 1
If k > max Then
    max = k
    begin =____④____
End If
Else
k = 1
End If
Next i
s = ” ”
For j = begin To begin + max - 1
s = s + Str(j)
Next j
Label2.Caption = s
End Sub
解析 采用选择排序算法对产生的数进行排序,应填入交换语句。题目的要求是找出连续的元素序列(重复元素只取1个),程序用k记录连续数序列的长度,当第i个元素不属于当前连续数序列时,令k=1,重新记录新的连续数序列。变量begin存储的是最长连续数序列第一个元素的数值,故begin = a(i) - max + 1。
答案 ①a(j) = a(i) ②i < n 或i <> n 或i < 13 或i <> 13 ③a(i)=a(i-1) + 1 ④a(i)-k + 1 或 a(i)-max + 1
5.在某打牌游戏中,一开始每个玩家各有17张牌,牌型从小到大分别为“3~10、J、Q、K、A、2”,每种牌最多4张,现在按指定规则的顺序打牌,打完为止。规则如下:
先打顺子牌(顺子指连续的5个及以上牌型,如45678,顺子最大到A),若有多个顺子,先长后短,长度相同按先小后大的顺序打出。然后按4张、3张、2张、1张的顺序出牌,同一个牌型从小到大。
小刘依据上述算法设计了VB程序,其中牌型“10”用数字“0”代替表示,如图所示,请回答下列问题。
(1)若初始牌型为344445566790JQKA2,第2次出的牌为________。
(2)请在划线处填入合适代码。
Private Sub Command1_Click()
Dim i As Integer, j As Integer
Dim a(1 To 13) As Integer, max As Integer, t As Integer, last As Integer
Dim sa As String, stem As String, flag As Boolean
Const s = ”34567890JQKA2”  ′用0代替牌10
′发牌和洗牌代码略,在标签 Label1显示初始牌型,洗牌后数组a各元素分别存储牌型3~2的数量
t = 17  ′刚开始牌有17张
Do While t > 0  ′打牌
flag = True
Do While flag  ′寻找牌中有没有顺子牌
max = 0: k = 1: flag = False
For i = 1 To 11
     If ____①____Then
       k = k + 1
       If k > Max Then
         Max = k
       Last = i + 1 ′记录连续牌的最后一张
      End If
     Else
       k = 1
     End If
Next i
If Max >= 5 Then  ′有顺子牌,把最长的这把顺子打出来
flag = True: sa = ” ”
For j = ____②____To last
    stem = Mid(s, j, 1)
    sa = sa + stem + ” ”
    a(j) = a(j) - 1
Next j
List1.AddItem sa ′顺子在列表框显示
t = t - max
End If
Loop
For i = 1 To 13  ′出4个一样的牌
If a(i) = 4 Then
   stem = Mid(s, i, 1)
   List1.AddItem stem + stem + stem + stem
    a(i) = 0
    ____③____
End If
Next i
′3 张、2 张、单张出牌,具体代码略
Loop
End Sub
解析 (1)初始牌型为 344445566790JQKA2 ,则出牌顺序为 90JQKA 34567,444,5,6,2 。
(2)程序用 k 记录当前顺子牌的长度,用 max 记录最长顺子牌的长度,用 last 记录最长顺子牌中最后一张牌在字符串s中的位置。
答案 (1)34567 (2)①a(i)>0 And a(i+1)>0 ②last-max+1 ③t=t-4
6.对英文字母进行加密的规则:用26个互不重复的ASCII字符作为密钥,字母“A”用密钥中第1个字符代替,字母“B”用密钥中第2个字符代替,其他字母用类似方法进行加密。现编写一个验证密钥合法性的程序。在文本框Text1中输入密钥,单击“验证”按钮Command1,在文本框Text2中输出相应的信息。
(1)实现验证功能事件的过程名称是________。
(2)为实现上述功能,请在划线处填入合适的代码。
Private Sub Command1_Click()
Dim i As Integer, ch As String, s As String
Dim my(0 To 127) As Boolean ′0~127 表示 128 个 ASCII 字符的 ASCII 值 s = Text1.Text
For i = 0 To 127
my(i) = False
Next i
If ____①____ Then
Text2.Text = ”密钥长度不足26个字符!”
Else
For i = 1 To 26
ch = Mid(s, i, 1)
t =____②____
If my(t) = False Then
     my(t) = True
Else
     Text2.Text = ”密钥中有重复字符!”
     Exit Sub
End If
____③____
Text2.Text = ”密钥正确!”
End If
End Sub
解析 用my(i)来表示ascii编码值是i的字符是否有出现过。②根据程序的结构,第1分支是判断字符长度是否足,所以程序的第1空答案是 len(s)<26。从程序中可以看出ch=mid(s, i把字符串s的第i个字符取出来,那么接下来应该取得这个字符的ascii编码,然后判断它是否出现过。因此程序的第2空答案是Asc(ch) 。
答案 (1)Command1_Click (2)①Len(s)<26 ②t=Asc(ch) ③Next i
7.尼克斯彻定理:任何一个大于等于1的整数的立方等于一串连续奇数之和,如:13=1,23=3+5,33=7+9+11。编写一个VB程序验证尼克斯彻定理,程序运行时,在文本框Text1中输入一个大于等于1的整数,单击“验证”按钮Command1,在文本框Text2中显示验证结果,运行界面如图所示。
实现上述功能的VB代码如下,请完善代码:
Private Sub Command1_Click()
Dim n As Integer, i As Integer, t As Integer, sum As Long, s As String
n = Val(Text1.Text)
For i = 1 To n ^ 3 Step 2 ′变量i表示连续奇数的首个整数
sum = 0: t = i: flag = False
Do While sum < n ^ 3 And flag = False
sum = ____①____
t = t + 2
If ____②____ Then flag = True
Loop
If flag = True Then Exit For
Next i
s = Str(n) + ”^” + Str(3) + ”=”
Do While sum > 0
____③____
If sum = 0 Then
s = s + Str(i)
Else
s = s + Str(i) + ”+”
End If
i = i + 2
Loop
Text2.Text = s
End Sub
解析 flag是n的立方与一串连续奇数之和是否相等的标志。若和sum与n^3相等,就不再相加,同时结束程序的运行。此时的i就是连续奇数的开始。
答案 ①sum+t ② sum=n^3  ③sum=sum-i
8.某种纸牌游戏,三人一起玩一副牌,每人 17 张。5 张及以上的连续单牌(不分花色)称为顺子,顺子最大到K,如“A,2,3,4,5,6”是长度为 6 的顺子。编写程序,判断游戏刚开始时某玩家有没有顺子,最长的顺子是几张。
(1)实现上述功能的VB代码如下,但加框处代码有误,请改正。
(2)请将划线处的代码补充完整。
Dim a(n) As Integer
Private Sub Command1_Click()
Dim max As Integer, count As Integer
Dim i As Integer, j As Integer
count = 0: max = 0
i = 1
Do While i <= n - 1
 ′①
j = i + 1
Do While j <= n
If  Then ′②
    j = j + 1
    count = count + 1
ElseIf a(j) = a(j - 1) Then
    j = j + 1
Else
    Exit Do
End If
Loop
i =____③____
If count > max Then max = count
Loop
If max < 5 Then s = ”无顺子” Else s = ”最长顺子长度:” + Str(max)
End Sub
Private Sub Form_Load()
 ′获取 17 张牌的数值(J、Q、K、A分别对应11、12、13、1),升序存储在数组 a 中
End Sub
解析 count表示顺子牌的数量,当读取一张牌时,数量已经有一张了,因此初值为1。牌是升序存储在数组a中,因此他应该是比他前面的牌大1。内循环j是从当前i的位置开始往下找,如果一旦不相等或者比他前面的大1以上,表示无法构成顺子,下一个开始查找顺子的位置是j。
答案 ①count=1 ② a(j)=a(j-1)+1  ③j
9.小夏用VB编写了一个统计单词重复情况的程序,实现的功能如下:在文本框Text1中输入字符串,并以“#”字符结束,单击“确定”按钮Command1,在列表框List1中输出每个单词及其重复的次数,并在Label2中显示重复次数最多的单词,在Label3中显示该单词重复的次数。在该程序中,区分大小写,例如,单词“Baby”和“baby”是不相同的。运行界面如图所示。
实现上述功能的 VB 程序如下,请回答以下问题:
(1)变量f2的作用是______________________________。
(2)请在划线处填入合适的代码。
Private Sub Command1_Click()
Dim s As String, m As String, word As String, i As Integer,
Dim j As Integer, f1 As Boolean, f2 As Boolean
Dim a(1 To 100) As String, b(1 To 100) As Integer ′a数组存储单词,b数组存储该单词出现的次数
s = Text1.Text
k = 0:word = ” ”
For i = 1 To 100 ′数组初始化
b(i) = 0:a(i) = ” ”
Next i
f1 = False
For i = 1 To Len(s)
 m = Mid(s, i, 1)
 If____①____Then
word = word + m
If Not f1 Then k = k + 1: f1 = True
 Else
  f1 = False: f2 = False 
  For j = 1 To k - 1
If a(j) = word Then
  b(j) = b(j) + 1:f2 = True:
  k = k – 1: Exit For
End If
 Next j
 If f2 = False And a(k) = ” ” Then
 ____②____
b(k) = b(k) + 1
  End If
 ____③____
 End If
Next i
′对数组进行排序,并输出结果要,代码略
End Sub
解析 判断所截取的字符,是否是字母,此处需要满足是字母这个条件,不论是大写还是小写。如果是一个完整的单词存入数组a中,同时将变量word值清空,为生成下一个单词做好准备。
答案 (1)标记该单词在数组a中是否已经存在,值为TRUE,表示该单词已经存在
(2)①(m >= ”a” And m <= ”z”) Or (m >= ”A” And m <= ”Z”)  ②a(k) = word ③word = ” ”
10.某县有15所初中,其中代码01、02和03为城区学校,其他为乡镇初中,为鼓励乡镇初中报考县重点高中,该高中为乡镇初中分配了定向名额,当该校上线人数未达到定向人数时,在未到分数线10分以内的学生中,从高分到低分录取增加学生,直到总人数达到定向人数。该高中总的招生人数(含定向生)不得超出800人。小明依据上述描述设计了如下VB程序。算法基本思路:
1)先找到第801名学生的成绩,向前查找高1分的学生,把该分数记为分数线;
2)统计该分数线以上,各校录取人数;
3)从该分数线向下查找10分以内的学生,如果某校上线人数未达到定向人数,则作为定向增加的录取人数;
4)若录取人数加定向增加人数超过800人,将分数再提高1分,重复以上操作。
程序运行时的界面如下图所示。
请回答下列问题:
(1)该程序运行后,第1个被定向录取的学生所在学校代码是__________。
(2)请在划线处填入合适的代码。
Const n = 5992
Dim xdm(n) As String, xm(n) As String ′xdm存储学生所在学校代码,从01~15.
Dim dx(15) As Integer, zkz(n) As String, cj(n) As Integer ′dx存储每所学校定向指标
Private Sub Command2_Click()
Dim i As Integer, j As Integer ′按成绩从高到低序号
Dim s As Integer ′总的招生人数
Dim fsx As Integer ′招生分数线
Dim xrs(15) As Integer ′大于等于分数线人数
Dim zjdx(15) As Integer ′未到定向指标而录取人数
s = 801: i = 801
Do While s > 800
Do While cj(i) = cj(i - 1)
i = i - 1
Loop
For j = 1 To 15
xrs(j) = 0: zjdx(j) = 0
Next j
For j = 1 To i - 1
   ______①____
xrs(t) = xrs(t) + 1
Next j
s = ____②____
fsx = cj(i - 1)
Do While cj(j) >= fsx - 10
t = Val(xdm(j))
If ____③____Then
     s = s + 1
     zjdx(t) = zjdx(t) + 1
End If
j = j + 1
Loop
i = i - 1
Loop
List2.AddItem ”学校 定向指标上线人数定向合计”
For j = 1 To 15
List2.AddItem Str(j) + ” ” + Str(dx(j)) + ” ” + Str(xrs(j)) + ” ” + Str(zjdx(j)) + ” ” + Str(zjdx(j) + xrs(j))
Next j
List2.AddItem ”录取分数线为” + Str(fsx) + ”,本次录取人数为:” + Str(s)
End Sub
Private Sub Form_Load()
′按成绩降序排列从数据库中读取学生相关信息,并显示在列表款List1中,代码略
End Sub
答案 (1)05 (2)①t=Val(xdm(j)) ②i-1
③xrs(t)+zjdx(t)11.在一个文本当中,每行包含一个字符串。现使用如下规则对其压缩:压缩时,查找每个字符串的公共前缀,然后使用公共前缀的长度和字符串的剩余部分(以空格隔开)表示该字符串,每个占用一个字节空间。图a所示为该压缩规则示意图。小明为此编写了VB程序,功能如下:运行List1中显示原字符串内容,单击“压缩”按钮Command1,在列表框List2中显示压缩后字符串,并表示压缩后容量。程序运行界面如图b所示。
图a
图b
实现上述功能的VB代码如下,但加框处代码有错,请改正。
Dim word(3000) As String,pre(3000) As String
Const n=2000
Private Sub Form_Load()
 ′该过程的作用从数据库读取n个单词,按字典顺序存储在数组word中,并在Label1 输出单词
 ′代码略
End Sub
Private Sub Command1_Click()
 Dim conp As Integer′存储压缩后的容量
 Dim k As Integer,m As Integer ′k存储公共前缀的长度
 Dim f As Boolean
 conp=0
 For i=1 To n
k=0
If i=1 Then f=False Else f=True
 ′①
Do While k<m And f=True
   Then′②
  k=k+1
Else
  f=False
End If
Loop
pre(i)=CStr(k)+” ”+Mid(word(i)),k+1,Len(word(i))
′Cstr()函数能够将数字类型的值转换为字符类型的值,并去掉前导空格。
List2,AddItem pre(i)
 ′③
 Next i
 Label2.Caption =”压缩后容量为”+Str(conp)+”字节”
End Sub
答案 ①m=Len(word(i)) ②Mid(word(i), i, k+1) = Mid(word(i - 1), i, k+1) ③conp = conp + Len(pre(i))
课件47张PPT。专题六 最值、标志及子序列问题1.(2019·4月浙江省选考)给定m个区间和1个数组(有n个元素),现要求根据各区间限定的取值范围,将数组依次分隔成m+1个段。具体分割方法如下:
 第1段是从数组首个元素开始、元素值都属于第1区间的最长连续元素段。如果首个元素不属于第1区间,则第1段元素个数为0;
第1段分割后的剩余元素,用同样的方法来依次分割第2段、第3段、…、第m段;
第m段分割后的剩余元素分割到第m+1段(剩余段)。若第p(1≤p≤m-1)段末尾连续元素的值也同时属于第p+1区间,则这块连续元素称为第p段“重叠块”,该段其余部分称为第p段“非重叠块”。由于不存在第m+1区间,这里特别规定:第m段的全部元素都分割到m段“非重叠块”,第m段“重叠块”的元素个数为0,一个数组分段示例如下图。图中数组第1个元素10不属于第1区间[0,5],因此第1段的元素个数为0。10和20属于第2区间,而33不属于第2区间,因此第2段只包含10和20两个元素。第3段末尾连续3个元素的值也同时属于第4区间,因此,第3段“非重叠块”包含33,58,46,第3段“重叠块”包含55,62,69。(1)给定2个区间依次为[10,50]、[30,80],数组各元素为“12,44,34,45,66,50,45,70”,则第1段“重叠块”中的元素个数为________个。
(2)小李根据上述描述,设计了一个统计各段“非重叠块”、“重叠块”和剩余段中元素个数的算法。算法的VB程序如下,请在划线处填入合适的代码。Const n = 18, m = 6
Dim a(1 To n) As Integer
Dim b(1 To 2 * m) As Integer
′b(1)、b(2)为第1区间的下限和上限, b(3)、b(4)为第2区间的下限和上限,…Dim c(1 To 2 * m + 1) As Integer
′数组c用于保存统计结果:
′c(1)、c(2)分别存储第1段“非重叠块”和“重叠块”的元素个数,
′c(3)、c(4)分别存储第2段“非重叠块”和“重叠块”的元素个数,…
′c(2m-1)存储第m段“非重叠块”元素个数,c(2m)存储第m段“重叠块”元素个数(值为0)′c(2m+1)存储剩余段元素个数
Private Sub Command1_Click()
Dim i As Integer, p As Integer, L As Integer, LL As Integer
′读取n个数据并保存在数组a中,代码略
′读取m个区间的下限和上限并保存在数组b中,代码略
For i = 1 To 2 * m + 1
 c(i) = 0
Next i
i = 1: p = 1
L = 0: LL = 0
Do While ______①____If IsIn(i, p) Then
If IsIn(i, p + 1) Then
  LL = LL + 1
Else
______②____
 LL = 0
End If
i = i + 1
 Else c(2 * p - 1) = L
c(2 * p) = LL
L = 0: LL = 0
p = p + 1 End If
Loop
If i <= n Then
  c(2 * p - 1) = n - i + 1
Else c(2 * p - 1) = L
 c(2 * p) = LL
End If
′输出统计结果,代码略
End Sub′函数IsIn用来判断a(i)值是否属于第p区间 If p > m Then
IsIn = False
 Else
If ____③____ Then IsIn = True Else IsIn = False
 End If
End FunctionFunction IsIn(i As Integer, p As Integer) As Boolean解析 数据44,34,45既属于第1区间,也属于第2区间。自定义函数IsIn功能判断a(i)值是否属于第p区间,变量i代表数组a的下标,p代表第几个区间,要判断是否属于该区间,必须满足这区间的范围内,即满足条件a(i)>=b(2*p-1) And a(i)<=b(2*p)。在主程序中,Do循环过程中i和p都不断递增,这两个都不能超越最大值,得出循环条件为:i<=n And p<=m。变量LL存储重叠块元素个数,L存储非重叠块元素个数。因为重叠元素必须是第p块末尾连续的一段,如果第i个元素不属于p + 1段,则前面累计到LL中的个数要算在非重叠块元素个数L中,再算上第i个元素,共LL+1个要累计到非重叠块元素个数L中。所以这一空的答案为:L=L+LL+1。
答案 (1)3 (2)①i<=n And p<=m ②L=L+LL+1
③a(i)>=b(2*p-1) And a(i)<=b(2*p)2.(2018·4月浙江省选考)为分析数组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 IfNext 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解析 变量flag是一个标志,他有三个值,代表处于三种状态。IsSymPeak函数的功能是判断是否是一个对称波峰,如果是一个对称波峰,到达对称波峰的终点时Steps的值肯定为0。如果前面下降段且 Steps 为0,并且当前位置是“V”拐点,则代表前面刚好是一个对称波峰。函数IsSymPeak 为True,否则为False。第一次比较的是a(2)和a(1),所以循环变量i 的初值为2。升 Steps 加1,降Steps 减1。
答案 (1)3 (2)①2 ②steps=1 ③flag=-1 And steps = 0 或其他等价表达式3.(2016·4月浙江选考)某地1900~1999年的平均降水量数据保存在数据库中。现要求找出相邻两年年平均降水量变化(即本年度与上年度“年平均降水量”差值的绝对值)最大的年份区间。如果有多个符合要求的年份区间,只输入距今最近的。小吴为此编写了VB程序,程序运行时,单击按钮Command1后,在文本框Text1中输出运行结果。实现上述功能的VB代码如下,但加框处代码有错,请改正。Dim w(1 To 100) As Single ′依次存储1900~1999年的年平均降水量数据
Const n = 100
Private Sub Form_Load()′本过程从数据库中按1900~1999年依次读取年平均降水量数据,并存储在数组w中
′代码略
End Sub
Private Sub Command1_Click()
Dim i As Integer, imax As Integer Then imax = i  ′(2)
Next i
Text1.Text = “年平均降水量变化最大的年份区间是” + Str(imax + 1898) + “-” + Str(imax + 1899)
End Sub
其中,加框(1)处应改正为________,
加框(2)处应改正为________________。解析 该程序为顺序查找算法的变形应用,查找相邻两数的差最大的两数,所以查找应该从第2个数开始(w(2)-w(1)),所以初值imax=2;从i=3开始,Abs(w(i) - w(i - 1))依次与Abs(w(imax) - w(imax - 1))进行比较(If Abs(w(i) - w(i - 1)) >= Abs(w(imax) - w(imax - 1)) Then imax = i),变量imax用于存储最大值信息,保持每次比较后相邻数Abs (w(imax) - w(imax - 1))差最大。
答案 (1)2 (2)Abs(w(imax) - w(imax - 1)) 利用信息技术解决生活中的问题,就会碰到一组具体的数值,我们把这组具体的数值称为一个序列,访问其中部分数据,称为子序列。一个数组可以称为一个系列,数组的局部也称为数组的子序列。求和、求最值和求一个连续的区间,往往是子序列中经常碰到的问题。在一个区间中,可以用标志变量表示他的状态,标志变量也经常用在判断是否存在重复数据的情况。考点1 最值问题
1.一般定义序列中第1个数就是最值,从第2个数开始,与他前面的数进行比较,如果最值发生变化,最值的位置或值也将更新,直到序列的最后一个数为止。
2.在语句中If a(i)>imax Then imax=a(i)中,当另外一个数组元素与最值或a(i)相等时,最值并没有发生变化,因此找到的第1个最值。若把>改为>=,则找到的最后一个最值。
3.当有多个相同的最值时,可以用字符连接起来。【例1】 小王编写 VB 程序,功能如下:在文本框 Text1 中输入一段英语短文,点击“统计”按钮 Command1,在标签 Label2 中输出该短文中出现次数最多的小写字母、次数和频率(若有多个,则全部输出)。Private Sub Command1_Click()
 Dim i As Integer, n As Integer, f As Integer
Dim max As Integer ′变量 max 表示出现最多的字母
Dim sum As Integer ′sum 表示字母总数
Dim zm(1 To 26) As Integer ′数组 zm 存放 26 个字母出现的次数
Dim s As String, c As String
Dim cx As String ′变量 cx 存放次数最多的字符s = Text1.Text
For i = 1 To Len(s)
c = Mid(s, i, 1)
If c >= "a" And c <= "z" Then
  ____①____
  zm(n) = zm(n) + 1
  sum = ____②____
End If
 Next i
 max = 0
 For j = 1 To 26If zm(j) > max Then max = j : cx = Chr(Asc("a") + j - 1)
If ____③____Then cx = cx + " " + Chr(Asc("a") + j - 1)
 Next j
 f = Int(max / sum * 100)
 Label2.Caption = "字母:"& cx & "次数:" & max & "频率:" & Str(f) & "%"
End Sub解析 本题的程序用来统计26个小写字母的出现次数,数组zm里存储着每个字母出现的次数,其中zm(1)存储着a字母出现的次数、zm(2)存储着b字母出现的次数……以此类推。求出每个字母对应的在字母表中位置n,然后zm(n)加1,Sum变量统计所有的小写字母个数。第2个for循环找出zm数组中的最大值,存储到max变量,并用cx记录了第一个最大出现次数的字母,当出现相同最值时,存储到字符串中。
答案 ①n=Asc(c)- Asc(" a ") + 1 ②sum+1
③max = zm(j)【变式训练1】 小王用VB编写一个自动统计离散数据的“极大值”(如图a所示)个数的程序。功能如下:在列表框List1中随机产生n个介于[1,99]的正整数,单击“统计极大值”命令按钮Command1,程序自动统计出极大值,并将其输出到列表框List2,且将其中的最大值输出在标签Label1中。程序界面如图b所示,实现上述功能的VB程序如下。(假设:数据的左右两个端点不计入极大值,且相等的两个值也不计入极大值)。请回答以下问题:(1)当 n=6,原始数据为“8 39 24 5 71 25”,此时极大值有:________。
(2)请在划线处填入合适的代码。
Const n = 10
Dim a(1 To n) As Integer    ′存储原始数据
Dim Max(1 To n) As Integer   ′存储极大值数据Private Sub Form_Load()   ′原始数据初始化
Randomize
For i = 1 To n
a(i) = ____①______ ′产生[1,99]间随机整数
List1.AddItem Str(a(i))
Next i
End Sub
Private Sub Command1_Click()
Dim i As Integer, j As Integer
Dim count  As Integer, Maxa As Integer
count = 0List2.Clear
For i = 2 To n - 1  ′统计极大值,左右两边端点值除外
If____②____ Then
count = count + 1
   ____③____
End If
Next i
Maxa = 0For i = 1 To count
List2.AddItem Str(Max(i))
If Maxa < Max(i) Then Maxa = Max(i)
Next i
Label1.Caption = "极大值中的最大值为: " + Str(Maxa)
End Sub解析 极大值指一个范围或区间内的最大值,往往指一个连续上升的区间,他的特征是比他后面的数大,比他前面的数小。如果找到极大值,把他存储在数组max中。
答案 (1)39、71  (2)①Int(Rnd * 99) + 1 或 int(Rnd*99+1) Rnd可写成Rnd() ②a(i) > a(i + 1) And a(i) > a(i - 1) ③Max(count) = a(i) 考点2 标志问题
标志变量通常flag来表示,他表示条件是否成立,或某个(某些)变量是否出现或出现的次数,可以定义为逻辑型,可以定义为整型,或者可以定义为数组等,根据需要各取所需。
【例2】 小刘为班级的抽奖活动编写了一个 VB 程序。单击“确定”按钮 Command1 时,在列表框 List1中显示按用户抽取人数在学号起讫范围内[n1,n2](最大学号不超过 100)随机抽取到不重复的学号。输入的抽取人数不会超过学号范围内的人数。程序运行界面如下图所示。实现上述功能的VB程序如下,请在划线处填入合适代码。
Dim xh(1 To 100) As Integer, num As Integer
Private Sub Command1_Click()
Dim n1, n2, n, x As Integer
Randomizen1 = Val(Text1.Text)
n2 = Val(Text2.Text)
n = Val(Text3.Text)
num = 1
Do While num <= n
____①____
If num = 1 Then
xh(num) = x
num = num + 1
ElseIf unique(x) = True Then
    ____②____
    num = num + 1
End If
____③____
Loop
For i = 1 To n
List1.AddItem Str(xh(i))
Next iEnd Sub
Function unique(t As Integer) As Boolean
Dim j As Integer
For j = 1 To num If xh(j) = t Then unique = False: Exit For
Next j
If ____④____Then unique = True
End Function解析 结合产生随机整数,自定义函数unique用于判断当前参数是否已在数组xh中出现过,当函数值为True时表示未出现过,需要加入数组。在自定义函数中,FOR循环执行了num次,循环变量j变为num+1,故要填j > num 或 j = num+1 。
答案 ①x = Int(Rnd * (n2-n1 + 1)) + n1 ②xh(num) = x ③End IF ④j > num 或 j = num+1【变式训练2】 编写“数字提取”程序,实现如下功能:在文本框 Text1 中输入包含数字和其他非数字字符混合的原始数据,点击“数字提取”按钮 Command1,将数据中的数字以“,”间隔输出到文本框 Text2 中。程序运行界面如图所示,VB 代码如下。请回答以下问题:(1)要使程序运行后,窗体 Form1 标题立即自动显示为“数字提取”,可在________(单选,填字母:A.Form_Load /B.Form_Click/C.Command1_Click)事件过程中添加语句 Form1.Caption= “数字提取”。
(2)实现上述功能的 VB 程序如下,请在划线处填入合适的代码。
PrivateSub Command1_Click()
Dims As String, ch As String, flag As Boolean
Dimt mp As String, ans As String
s =Text1.Texts =s + " . "
tmp= " ": ans = " "
flag = False
For i = 1 To Len(s)
 ch = Mid(s, i, 1)
 If ch >= "0" And ch <= "9 " Then
___①____
flag = True
 ElseIf flag = True Then ans = ans + tmp + ","
____②____
flag = False
 End If
Next i
Text2.Text = ans
End Sub
(3)若删除程序中的语句“s = s + "."”,输入不变,则提取后的数字信息为__________。解析 当读取的字符是数字时,依次把这些数字进行正向连接到变量tmp中,接下来不是数字的第一个字符时,flag为True,把tmp连接到ans中,同时tmp清空。删除程序中的语句“s = s + " ."”时,最后读取的是数字,没有执行连接语句。
答案 (1)A (2)①tmp=tmp+ch ②tmp=“ ”
(3)86,1,
同课章节目录