数组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
7.【2018.11】【加试题】某种数据加密方法描述如下(加密前后的数值都是0-255):
•以m个数据为一段,将n个待加密数据依次分割成若干个数据段,剩余数据(个数小于m)为独立数据段。
•数据加密规则:
数据个数等于m的数据段,先进行值变换,再进行位置变换,得到加密数据段。
数据个数小于m的数据段,只进行值变换,直接得到加密数据段。
•依次合并加密数据段,即为最后的加密数据。
值变换:
用值变换密钥数组x(元素个数为m,值为0~255的整数),将待加密数据段中的数据进行值变换,方法如下:
值变换后第i个元素=(待加密数据段第i个元素+x(i))Mod256,其中i=1,2,……,m
位置变换:
用位置变换密钥数组y(元素个数为m,值为1~m的不重复整数),将上述值变换后的m个元素进行段内位置变换,方法如下:
加密后数据段第y(i)个元素=值变换后第i个元素,其中i=1,2,……,m
例如,n=5,m=3的数据加密过程如下:
段内序号待加密数据密钥数组x值变换后数据密钥数组y加密后数据
1
246
0
4
2
240
4
30
3
0
30
0
1
70
80
80
2
252
16
16
(1)已知m=3,数组x与数组y中的数据如下表所示。
则待加密数据段“155,1,250”加密后的数据段为(填数据,用逗号分隔)
x
(1)
x
(2)
x(3)
y
(1)
y
(2)
y(3)
10
20
30
3
1
2
(2)小张根据上述加密算法,设计了一个对应的解密程序,其VB代码如下,请在划线处填入合适的代码(解密与加密使用相同的密钥数据)
PrivateSubCommand1_Click()
Constn=100
Constm=6
DimiAsInteger,jAsInteger
Dima(1Ton)AsInteger,b(1Ton)AsInteger
Dimx(1Ton)AsInteger,y(1Ton)AsInteger
'读取值变换与位置变换密钥数据,分别保存在数组x与y中,代码略
'读取待解密数据,保存在数组a中,代码略
'下面进行位置变换:
位置变换后数据保存到数组b中
Fori=1To①
Forj=1Tom
②
Nextj
Nexti
Fori=(n\m)*m+1Ton
b(i)=a(i)
Nexti
'下面进行值变换:
值变换后数据仍保存到数组b中
j=1
Fori=1Ton
b(i)=③
j=j+1
Ifj>mThenj=1
Nexti
'输出解密后数据,代码略
EndSub
8.【2019.4】小王设计“模拟撤销”程序,需要用一个“历史记录”,“历史记录”是在对字符串s进行插入或删除时,将每步操作信息依次存储得到的,操作信息由操作符(“+”表示插入,“-”表示删除)、操作位置和操作字符串(只包含英文字母)构成,例如,“+23abc”表示在字符串s第23个位插入了“abc”,“模拟撤销”过程按照“历史记录”的逆序进行,将字符串s的内容恢复到初始状态。
对字符串“Book”的操作与撤销过程,如第14题a所示。
第14题图a第14题图b
小王编写的“模拟撤销”VB程序如下,文本框 Text1中的内容是撤销前字符串,文本框Text2中的内容是历史记录,单击“撤销”按钮Command1后,在标签Label1中显示撤销过程,程序运行界面如第14题图b所示。
(1)实观上述功能的VB程序如下,在程序中出现的对象没有Caption属性的是。
(选填,填字码:
A.Label1 /B.Command1 /C.Textl和Text2
(2)请在划线处填入合适代码。
PrivateSubCommand1_Click()
DimsAsString,tAsString,chAsString
DimcAsString,numAsString,ssAsString
DimnAsInteger,iAsInteger
s=Text1.Text:
t=Text2.Text
c="":
num="":
ss=s
Fori=Len(t)To1Step-1
①
Ifch>="a"Andch<="z"Orch>="A"Andch="Z"Then
c=ch+c
ElseIfch>="0"Andch<="9"Then
num=ch+num
Else
n=Val(num)
Ifch="-"Then
s=Mid(s,1,n-1)+②
Else
s=Mid(s,1,n-1)+Mid(s,n+Len(c),Len(s)-n-Len(c)+1)
EndIf
ss=ss+"→"+s:
c="":
num=""
EndIf
Nexti
Label1.Caption=ss
EndSub
(2)运行该程序,若文本框Text1中的内容是"April",文本框Text2中的内容是"-3p+3ri-6e",单击撤销按钮,For循环语句执行完成后,字符串s的值是""。
9.【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程序如下,请在划线处填入合适的代码。
Constn=18,m=6
Dima(1Ton)AsInteger
Dimb(1To2*m)AsInteger
'b
(1)、b
(2)为第1区间的下限和上限,b(3)、b(4)为第2区间的下限和上限,…
Dimc(1To2*m+1)AsInteger
'数组c用于保存统计结果:
'c
(1)、c
(2)分别存储第1段“非重叠块”和“重叠块”的元素个数,
'c(3)、c(4)分别存储第2段“非重叠块”和“重叠块”的元素个数,…
'c(2m-1)存储第m段"非重叠块"元素个数,c(2m)存储第m段"重叠块"元素个数(值为0)
'c(2m+1)存储剩余段元素个数
PrivateSubCommand1_Click()
DimiAsInteger,pAsInteger,LAsInteger,LLAsInteger
'读取n个数据并保存在数组a中,代码略
'读取m个区间的下限和上限并保存在数组b中,代码略
Fori=1To2*m+1
c(i