数组a中的n个元素可构成n-1个依次排列的变化段。
•波峰:
从上升段转到下降段形成一个波峰。
波峰的起点是峰顶前所有连续上升段中的第1个,终点是峰顶后所有连续下降段中的最后1个。
•对称波峰:
上升段与下降段个数相同的波峰称为对称波峰。
下图为一组数据的变化段及波峰示意图。
现要求统计数组a各元素依次变化过程中“对称波峰”的个数。
小李依据上述描述设计如下VB程序。
请回答下列问题:
(1)数组元素“1,4,3,3,2,6,8,7,9,3,4,7,9,6,3,1”依次变化过程中“对称波峰”的个数为________。
(2)请在划线处填入合适的代码。
Constn=20
Dima(1Ton)AsInteger
PrivateSubForm_Load()
′读取数据,并存储到数组a中,代码略
EndSub
PrivateSubCommand1_Click()
DimflagAsInteger ′存储变化段的状态:
1表示升,-1表示降,0表示平
DimcountAsInteger′存储对称波峰段的个数
DimstepsAsInteger
DimiAsInteger
flag=0:
steps=0:
count=0
Fori=____①____Ton
Ifa(i)>a(i-1)Then
IfIsSymPeak(flag,steps)Thencount=count+1
Ifflag=0Orflag=-1Then
____②____
Else
steps=steps+1
EndIf
flag=1
ElseIfa(i)=a(i-1)Then
IfIsSymPeak(flag,steps)Thencount=count+1
steps=0
flag=0
Else
steps=steps-1
flag=-1
EndIf
Nexti
IfIsSymPeak(flag,steps)Thencount=count+1
Text1.Text=Str(count)
EndSub
FunctionIsSymPeak(flagAsInteger,stepsAsInteger)AsBoolean
If____③______Then
IsSymPeak=True
Else
IsSymPeak=False
EndIf
EndFunction
答案
(1)3
(2)①2 ②steps=1 ③flag=-1Andsteps=0或其他等价表达式
3.(2016·4月浙江选考)某地1900~1999年的平均降水量数据保存在数据库中。
现要求找出相邻两年年平均降水量变化(即本年度与上年度“年平均降水量”差值的绝对值)最大的年份区间。
如果有多个符合要求的年份区间,只输入距今最近的。
小吴为此编写了VB程序,程序运行时,单击按钮Command1后,在文本框Text1中输出运行结果。
实现上述功能的VB代码如下,但加框处代码有错,请改正。
Dimw(1To100)AsSingle′依次存储1900~1999年的年平均降水量数据
Constn=100
PrivateSubForm_Load()
′本过程从数据库中按1900~1999年依次读取年平均降水量数据,并存储在数组w中
′代码略
EndSub
PrivateSubCommand1_Click()
DimiAsInteger,imaxAsInteger
imax=
′
(1)
Fori=3Ton
IfAbs(w(i)-w(i-1))>=
Thenimax=i ′
(2)
Nexti
Text1.Text=“年平均降水量变化最大的年份区间是+Str(imax+1898)+“-”+Str(imax+1899)
EndSub
其中,加框
(1)处应改正为________,
加框
(2)处应改正为________________。
答案
(1)2
(2)Abs(w(imax)-w(imax-1))
最值问题
【例1】小王编写VB程序,功能如下:
在文本框Text1中输入一段英语短文,点击“统计”按钮Command1,在标签Label2中输出该短文中出现次数最多的小写字母、次数和频率(若有多个,则全部输出)。
PrivateSubCommand1_Click()
DimiAsInteger,nAsInteger,fAsInteger
DimmaxAsInteger′变量max表示出现最多的字母
DimsumAsInteger′sum表示字母总数
Dimzm(1To26)AsInteger′数组zm存放26个字母出现的次数
DimsAsString,cAsString
DimcxAsString′变量cx存放次数最多的字符
s=Text1.Text
Fori=1ToLen(s)
c=Mid(s,i,1)
Ifc>=”a”Andc<=”z”Then
____①____
zm(n)=zm(n)+1
sum=____②____
EndIf
Nexti
max=0
Forj=1To26
Ifzm(j)>maxThenmax=j:
cx=Chr(Asc(”a”)+j-1)
If____③____Then cx=cx+””+Chr(Asc(”a”)+j-1)
Nextj
f=Int(max/sum*100)
Label2.Caption=”字母:
”&cx&”次数:
”&max&”频率:
”&Str(f)&”%”
EndSub
答案 ①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,原始数据为“8392457125”,此时极大值有:
________。
(2)请在划线处填入合适的代码。
Constn=10
Dima(1Ton)AsInteger ′存储原始数据
DimMax(1Ton)AsInteger ′存储极大值数据
PrivateSubForm_Load() ′原始数据初始化
Randomize
Fori=1Ton
a(i)=____①______′产生[1,99]间随机整数
List1.AddItemStr(a(i))
Nexti
EndSub
PrivateSubCommand1_Click()
DimiAsInteger,jAsInteger
Dimcount AsInteger,MaxaAsInteger
count=0
List2.Clear
Fori=2Ton-1 ′统计极大值,左右两边端点值除外
If____②____Then
count=count+1
____③____
EndIf
Nexti
Maxa=0
Fori=1Tocount
List2.AddItemStr(Max(i))
IfMaxaNexti
Label1.Caption=”极大值中的最大值为:
”+Str(Maxa)
EndSub
答案
(1)39、71
(2)①Int(Rnd*99)+1 或int(Rnd*99+1) Rnd可写成Rnd() ②a(i)>a(i+1)Anda(i)>a(i-1) ③Max(count)=a(i)
考点2 标志问题
【例2】小刘为班级的抽奖活动编写了一个VB程序。
单击“确定”按钮Command1时,在列表框List1中显示按用户抽取人数在学号起讫范围内[n1,n2](最大学号不超过100)随机抽取到不重复的学号。
输入的抽取人数不会超过学号范围内的人数。
程序运行界面如下图所示。
实现上述功能的VB程序如下,请在划线处填入合适代码。
Dimxh(1To100)AsInteger,numAsInteger
PrivateSubCommand1_Click()
Dimn1,n2,n,xAsInteger
Randomize
n1=Val(Text1.Text)
n2=Val(Text2.Text)
n=Val(Text3.Text)
num=1
DoWhilenum<=n
____①____
Ifnum=1Then
xh(num)=x
num=num+1
Else
Ifunique(x)=TrueThen
____②____
num=num+1
EndIf
____③____
Loop
Fori=1Ton
List1.AddItemStr(xh(i))
Nexti
EndSub
Functionunique(tAsInteger)AsBoolean
DimjAsInteger
Forj=1Tonum
Ifxh(j)=tThenunique=False:
ExitFor
Nextj
If____④____Thenunique=True
EndFunction
答案 ①x=Int(Rnd*(n2-n1+1))+n1 ②xh(num)=x ③EndIF ④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程序如下,请在划线处填入合适的代码。
PrivateSubCommand1_Click()
DimsAsString,chAsString,flagAsBoolean
DimtmpAsString,ansAsString
s=Text1.Text
s=s+"."
tmp="":
ans=""
flag=False
Fori=1ToLen(s)
ch=Mid(s,i,1)
Ifch>=”0”Andch<=”9”Then
___①____
flag=True
ElseIfflag=TrueThen
ans=ans+tmp+","
____②____
flag=False
EndIf
Nexti
Text2.Text=ans
EndSub
(3)若删除程序中的语句“s=s+”.””,输入不变,则提取后的数字信息为__________。
答案
(1)A
(2)①tmp=tmp+ch ②tmp=“ ”(3)86,1,
1.某地2017.1~2017.2月的日期及日最高气温据保存在数据库中。
要求根据日最高气温,找出两个月中连续降温的次数、最长降温天数及其日期。
小刘为此编写了VB程序,程序运行后,单击按钮Command1后,在Label1和Label2上输出运行结果。
实现上述功能的VB代码如下,但加框处有错,请改正。
Dima(1To59)AsString′依次存2017.1~2017.2月的日期数据
Dimb(1To59)AsInteger′依次存2017.1~2017.2月的日最高气温数据
PrivateSubFormLoad()
′从数据库中按2017.1~2017.2的日期次序,取日期和日最高气温据,分别存储在数组a和b中,代码略
EndSub
PrivateSubCommand1_Click()
DimdAsInteger,nAsInteger,dmaxAsInteger,mAsInteger
n=0:
d=1:
dmax=1
Fori=2To59
If
Then ′
(1)
d=d+1
Else
d=1
EndIf
Ifd=2Thenn=n+1
Ifd>dmaxThen
dmax=d
m=i
EndIf
Nexti
Label1.Caption=”连续降温次数”&Str(n)
Label2.Caption=”连续最长降温日期为”&
&”-”&Str(a(m))′
(2)
EndSub
答案
(1)b(i-1)>b(i)
(2)Str(a(m-dmax+1))
2.小杜编写了一个会议签到统计的VB程序。
假设人员名单中没有重名。
运行界面如图所示,列表框1显示会议应到人员名单,列表框2显示会议实际出席人员名单,单击“统计”按钮Command1后,列表框3显示缺席人员名单。
实现上述功能的VB程序如下,
请将划线处的代码补充完整。
Dimb(1Ton)AsString′存储会议实际到的人员名单
Dimflag(1Ton)AsBoolean,mAsInteger
PrivateSubForm_Load()
′将n个应到人员姓名依次存储在数组a中,将m个实际参加会议人员姓名依次存储在数组b中
′在列表框1显示应到人员姓名,在列表框2显示实到人员姓名,该过程代码略
EndSub
PrivateSubCommand1_Click()
DimiAsInteger,jAsInteger
Fori=1Ton
flag(i)=False
Nexti
i=1
DoWhilei<=m
Forj=1Ton
If____①____Then
flag(j)=True
ExitFor′退出for循环
EndIf
Nextj
i=i+1
Loop
Fori=1Ton
If____②____ThenList3.AddItema(i)
Nexti
EndSub
答案 ①b(i)=a(j) ②flag(i)=False或Notflag(i)
3.如果一个正整数从高位到低位上的数字依次递减,则称其为降序数(如9752、9772是降序数,而7524不是降序数)。
现编写VB程序实现如下功能:
在文本框Text1种输入一个正整数,单击“判断”按钮Commmand1,在标签Label2中显示出该数是不是降序数。
程序运行界面如图所示。
(1)代码“Command1_Click()”中的Click是________(选填字母:
A.对象名/B.属性名/C.事件名/D.方法名)。
(2)请完善下列程序代码:
PrivateSubCommand1_Click()
DimiAsInteger,sAsString,flagAsBoolean
____①____
flag=True:
i=2
DoWhilei<=Len(s)Andflag
If____②______Then____③____
i=i+1
Loop
IfflagThen
Label2.Caption=s+”是降序数!
”
Else
Label2.Caption=s+”不是降序数!
”
EndIf
EndSub
答案
(1)C
(2)①s=Text1.Text ②Mid(s,i,1)4.VB程序,功能如下:
单击“生成数组”按钮Command1,则随机生成13个取值范围是1~13的正整数,分别存储到数组a中,对数组a的元素进行升序排列,并在标签label1中显示;再单击“连续数”按钮Command2,则在排序后的数组a中查找连续个数最多(忽略重复数值)的一组数值即:
连续数),若有两组连续数个数一样多,则取数值小的一组,将连续数显示在标签label2中。
运行界面如图所示。
若实现上述功能的程序如下,请在划线处填写合适代码。
Dima(1To13)AsInteger,nAsInteger
PrivateSubCommand1_Click()
DimiAsInteger,sAsString,jAsInteger
Randomize
n=13
Fori=1Ton
a(i)=Int(Rnd*13)+1
Nexti
Fori=1Ton-1
Forj=i+1Ton
Ifa(j) t=a(j):
______①____:
a(i)=t
EndIf
Nextj
Nexti
s=” ”
Fori=1Ton
s=s+Str(a(i))
If____②____Thens=s+”,”
Nexti
Label1.Caption=s
EndSub
PrivateSub