a(j+1)=a(j):
j=j-1
Loop
a(j+1)=t
Nexti
解析 插入排序也是经常要考到的问题。
先是分别对奇数位和偶数位进行排序,排序后再使偶数位大于前面的元素,最后进行插入排序,只需要对奇数位进行插入排序即可。
仅奇数位插入排序,i从1时会导致出现a(0)下标越界,所以i从3开始,即第二空答案为3Ton。
答案
(1)a(j)>a(j+2)
(2)3Ton
2.(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的数据加密过程如下:
(1)已知m=3,数组x与数组y中的数据如下表所示。
则待加密数据段“155,1,250”加密后的数据段为________(填数据,用逗号分隔)。
x
(1)
x
(2)
x(3)
10
20
30
y
(1)
y
(2)
y(3)
3
1
2
(2)小张根据上述加密算法,设计了一个对应的解密程序,其VB代码如下,请在划线处填入合适的代码(解密与加密使用相同的密钥数据)。
PrivateSubCommand1_Click()
Constn=100
Constm=6
DimiAsInteger,jAsInteger
Dima(1Ton)AsInteger,b(1Ton)AsInteger
Dimx(1Tom)AsInteger,y(1Tom)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
解析 数据构成环是本题考核的其中一个问题。
155,1,250值变换后变成165,21,24,位置变换后变成21,24,165。
加密时,先进行值变换,再进行位置变换,解密时应先位置变换,再进行值变换。
进行位置变换时,变量i表示共有多少整数段,也可以理解为多少行,易知完整的m个数据段的个数为nm个.变量j表示每段中每列的位置。
当i=1时,完成第1段数据变换,即b(j)=a(y(j)),当i=2时,完成第2段数据变换,即b(m+j)=a(m+y(j)),当i=3时,完成第3段数据变换,即b(m*2+j)=a(m*2+y(j)),当i=4时,完成第4段数据变换,即b(m*3+j)=a(m*3+y(j))……归纳得出第i段数据变换为b((i-1)*m+j)=a((i-1)*m+y(j))。
在进行值变换时,加密时值的变换方式为b(i)=(b(i)+x(j))Mod256。
推导出解密时b(i)=b(i)-x(j),其中b(i)>=x(j)或b(i)=b(i)-x(j)+256,其中b(i)b(i)=(b(i)-x(j)+256)Mod256。
答案
(1)21,24,165
(2)①nm 或Int(n/m)
②b((i-1)*m+j)=a((i-1)*m+y(j))
③(b(i)+256-x(j))Mod256
或(b(i)+256-x((i-1)Modm+1))Mod256
1.插入排序也是一种排序的方法,在各地的模拟卷是经常出现。
其算法的原理可以理解为在整理一幅扑克牌的过程,当摸到两张及以上牌,将牌放在合适位置,实现整幅牌从小到大排列。
2.数据构成环在数据加密、钟表等问题中经常出现。
关键是构成环的原理。
考点1 插入排序
一、排序思想
在将第i个数key插入到数据区间[1,i-1]或[i+1,n]范围内,使得数据区间[1,i]或[i,n]有序。
重复执行n-1遍,使得全部数据有序。
该算法包括两个步骤,一是查找key位置,二是把key放在该位置上。
查找key位置的方法是:
把a(i)赋值给key,如果从前往后有序,变量j从i-1位置开始,向前查找,a(j)与key比较,直到找到位置或找到最前面(j=1)。
如果从后往前有序,变量j从i+1位置开始,向后查找,a(j)与key比较,直到找到位置或找到最后面(j=n)。
二、算法实现
1.理解变量i、j和key的含义
变量i每次要插入数的位置,key表示第i个数的值。
j表示查找和比较位置位置。
2.从前往后有序,进行升序排列
从第2个数(i的初值为2)开始,插入到前面有序的数列中。
某数列已经插入3个数,数列为49,60,71,61,54,3,66,以i=4为例说明插入排序的过程。
查找位置j:
区间为[1,3],从第3个数开始向前查找。
比较对象:
先把当前a(i)的值存在变量key中,再用key分别与前面的数a(j)进行比较。
找到位置的条件:
比前面的数大,即key≥a(j)。
当key≥a(j)时,key应所处的位置是j+1。
如果没有找到位置,条件是key<a(j),把该数向后移动,即把a(j)赋值给a(j+1),a(j)=a(j+1)。
三、实现的核心代码
四、也可以从后往前进行插入排序
变量i的初值是n-1,一直插入排序,使得第1个数在序。
【例1】小明对两个班级的90名同学进行编号,随机产生不同号码,对于其中相同的号码,只保留一个,在号码产生过程中,号码始终是从小号到大号排列,直到找到10个同学号码为止。
1)用b数组表示该号码是否产生,b(x)若为0,表示x未产生;
2)先产生第1个号码,从第2个开始,产生数x,先判断b(x)的值,如果为0,再去插入到合适位置;
3)如果x比前面第一个数大,则直接放入a(i)数组元素中,否则利用对分查找法找到相应位置;
4)从该数x应该存放的位置开始的数据向后移动,并把该数x存放起来。
单击“产生”按钮Command1,在列表框List1中输出每次产生的号码。
请在划线处填入合适的代码。
Dima(10)AsInteger,b(100)AsInteger
PrivateSubCommand1_Click()
Dimi AsInteger,xAsInteger,sAsString
a
(1)=Int(Rnd()*90+1):
b(a
(1))=1
①____
DoWhilei<=10
x=Int(Rnd()*90+1)
Ifb(x)=0Then
If____②____Then
a(i)=x
Else
wz=seach(i,x)
Fork=i-1TowzStep-1
a(k+1)=a(k)
Nextk
____③____
EndIf
b(x)=1:
s=“产生前”+Str(i)+“个号码是:
”
Forj=1Toi
s=s+Str(a(j))
Nextj
List1.AddItems
i=i+1
EndIf
Loop
EndSub
Functionseach(pAsInteger,xAsInteger)AsInteger
DimmAsInteger,jAsInteger
m=Int(p/2)
If______④____Then
j=m+1
DoWhilea(j) j=j+1
Loop
Else
Ifm=1Thenj=1Elsej=m-1
DoWhilea(j)>xAndj>=1
j=j-1
Loop
j=j+1
EndIf
seach=j
EndFunction
解析 变量i表示插入的位置,往往从第2个位置开始。
B数组是一个标志,若其值为0,表示该下标的数没有出现过。
若他比前一个数大,直接放入第i个位置,否则进行查找,并放入合适位置。
答案 ①i=2 ②x>a(i-1) ③a(k+1)=x ④a(m)【变式训练1】在编号为1-100的观众中随机产生10位不同的幸运观众,并将幸运观众的编号升序排列。
请在划线处填入合适的代码。
n=10:
a
(1)=Int(Rnd*100+1)
i=2
DoWhilei<=n
t=Int(Rnd*100+1)
Forj=1Toi-1
Ifa(j)=tThenExitFor
Nextj
If____①____Then
Forj=i-1To1Step-1
Ifa(j)>tThena(j+1)=a(j)ElseExitFor
Nextj
____②____
i=i+1
EndIf
Loop
解析 要求产生10位不同的幸运观众,在已经产生的号码中先进行查找,如果没有重复,会找到i的位置。
在利用插入排序的思想,把新产生的数放入合适的位置。
答案 ①i=j ②a(j+1)=t
考点2 约瑟夫环问题
约瑟夫环是一个数学的应用问题:
已知n个人(以编号1,2,3……n分别表示)围坐在一张圆桌周围。
从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
在生活中会碰到类似很多问题,如钟表走向、值日的轮值等。
一、以24小时制式计算(0点-23点),完成如下表格
t的初值
经历时长(n)
结果时间
统一
表达式
t=3时
13小时后
16时
(t+n)Mod24
23小时后
2时
t=15时
-3小时后
12时
(t+n+24)
Mod24
-18小时后
21时
二、将字母表的字母A替换为E,B替换为F,C替换为G,…,W替换为A,X替换为B,…
对于环的操作一般用Mod运算符进行计算,某个数Modn的范围是[0,n-1],其他下标必须从0开始编号。
若要实现从1开始编号,需把编号减去1,进行运算后,再加上1。
对于任意字母表中第t个位置的字母加密后的表达式为(t-1+4)Mod26+1。
如字母w在字母表中处于第23,代入以上公式,加密后为第1个位置。
字符ch转换的表达式是Chr((Asc(ch)-1+4)Mod26+1)。
也可以用以下自定义函数来实现大写字母x向后移动y个位置的功能
FunctionRun(xAsString,yAsInteger)AsString
DimansAsInteger
ans=Asc(x)-65
ans=(ans+y)Mod26
Run=Chr(ans+65)
EndFunction
同理,例如对于一个m行乘以n列的矩阵,第i个位置元素所处的列数为(i-1)Modn+1。
所处行为(i-1)\n+1。
【例2】字符环上的最长公共字符串。
将字符串首尾相接后可以得到一个环,如图1和图2分别是由字符串“ABCUVKLM”和“MADJKLUVKL”首尾相接后得到的环。
在图1和图2所示的两个环中,最长的公共字符串为“UVKLMA”(图中带背景圆圈表示)。
编写VB程序,实现如下功能:
在文本框Text1和Text2中分别输入一个字符串(仅由大写字母构成,每个字符串长度不超过100),单击命令按钮Command1后,在标签Label3中输出两个字符串构成的环的最长公共字符串长度(字符串在环中必须连续)。
程序运行效果如图所示。
实现上述功能的VB程序如下,请回答下列问题:
(1)根据题意描述,字符串“BCEFGK”和“GKBLMCKEF”的最长公共字符串长度为________。
(2)请在划线处填入合适的代码。
Functiongetmin(aAsInteger,bAsInteger)′获取两个整数的较小者
IfaEndFunction
PrivateSubCommand1_Click()
Dims1AsString,s2AsString,iAsInteger,jAsInteger,xAsInteger,yAsInteger
DimcntAsInteger,ansAsInteger,len1AsInteger,len2AsInteger
s1=Text1.Text
s2=Text2.Text
len1=Len(s1)
len2=Len(s2)
minlen=____①____ ′minlen中保存s1和s2中较短字符串的长度
ans=0
Fori=1Tolen1
Forj=1Tolen2
cnt=0:
x=i:
y=j
DoWhile ____②____Andcnt cnt=cnt+1
x=xModlen1+1
y=yModlen2+1
Loop
If ____③____Thenans=cnt
Nextj
Nexti
Label3.Caption=Str(ans)
EndSub
解析 用x和y分别记录s1和s2中正在比较的字符的位置,通过对字符串长度求余,巧妙地回到第一个字符的位置,实现了字符环的功能。
注意:
因为字符串的下标从1开始,故不能写作x=(x+1)Modlen1。
答案
(1)5
(2)①getmin(len1,len2) ②Mid(s1,x,1)=Mid(s2,y,1) ③cnt>ans
【变式训练2】编写VB程序,实现如下功能:
在文本框Text1中输入当天对应的星期,文本框Text2中输入天数,单击“推算”按钮Command1,推算出相应天数后的星期情况,并在标签Label1中输出结果。
界面如图所示。
(1)为实现上述功能,请在划线处填入合适的代码。
PrivateSubCommand1_Click()
DimxAsString,xqAsString,numAsInteger
DimiAsInteger,hAsInteger
x=“日一二三四五六”
xq=Text1.Text
i=1
num=Val(Text2.Text)
Fori=1ToLen(x)
Ifxq=Mid(x,i,1)Thenh=i:
ExitFor
Nexti
_____①____
Label1.Caption=“星期”+Mid(x,r,1)
EndSub
(2)若当天是“星期五”,在文本框Text2中输入“166”,单击“推算”按钮后,标签Label1中显示的内容是________。
解析 先找出今天在星期中的位置,但构成环,需用0-(n-1)来表示,因此输入五,获得位置6,但用5来表示,加上166=171,171Mod7=3,表达成字符串还加1,应用星期三。
答案
(1)①r=(h+num-1)Mod7+1
(2)星期三
一、选择题
1.有如下VB程序段:
Fori=4To3Step-1
Ifa(i) tmp=a(i)
Forj=i-1To1Step-1
Iftmp>a(j)ThenExitFor
a(j+1)=a(j)
Nextj
a(j+1)=tmp
EndIf
Nexti
数组元素a
(1)到a(6)的值依次为“19,8,96,92,85,88”,经过该程序段“加工”后,数组元素a
(1)到a(6)的值依次为( )
A.8,19,92,96,85,88B.8,19,85,88,92,96
C.19,8,92,96,85,88D.19,8,85,92,96,88
解析 变量i从第4个位置开始,如果小于他前面的数,时行插入排序,结果为19,8,92,96,85,88,当i=3时,条件不满足。
答案 C
2.小张编写程序,实现把数据temp插入到升序序列中,得到一个新的升序序列,原升序序列各元素已依次存放在数组元素a
(1)、a
(2)、a(3)、……、a(n)中。
他编写的VB程序段如下:
Iftemp>=a(n)Then
a(n+1)=temp
Else
j=n
DoWhilej>=1Andtemp ____①____
j=j-1
Loop
____②____
EndIf
要使程序实现上述功能,则方框①②中的语句分别是( )
A.①a(j+1)=a(j) ②a(j+1)=temp
B.①a(j)=a(j-1) ②a(j+1)=temp
C.①a(j+1)=a(j) ②a(j)=temp
D.①a(j)=a(j-1) ②a(j)=temp
解析 如果满足条件temp答案 A
3.某VB程序段如下:
s=”Abc”
i=Len(s)
DoWhilei>=1
ch=Mid(s,i,1)
t=(Asc(ch)Mod32+4)Mod26
s1=s1+Chr(t+65)
i=i-1
Loop
Text1.Text=s1
该程序段执行后,在文本框Text1中显示的内容是( )
A.HGFB.HgfC.FGHD.Fgh
解析 Asc(ch)Mod32是取出他在字母表中位置,且位置是从1-26,若要构成环,可以理解为Asc(ch)Mod32-1+5)Mod26,即后移5位。
从s的最后一个位置开始进行转换,转换后只有大写字母。
答案 C
二、非选择题
4.对一段字符(仅包含大小写字母和数字)加密,加密规则为:
①字母和数字都往后循环顺移3位,如“a”变为“d”,“y”变为“b”;“0”变为“3”,“7”变为“0”,②加密后字母在前,数字在后,③字母按逆序排列,数字按顺序排列,如输入明文“a1b7Z8x3”,密文为“aCed4016”。
(1)根据程序代码分析,“加密”按钮的名称是__________。
(2)根据加密规则,明文“9G78fbY5”,则密文为________。
(3)请在划线处填入合适的代码:
PrivateSubCom_jm_Click()
DimxAsString,chAsString,c1AsString
Dims1AsString,s2AsString,sAsString
DimiAsInteger,nAsInteger,yAsInteger
x=Text1.Text
n=Len(x)
Fori=1Ton
ch=Mid(x,i,1)
Ifch>=”0”Andch<=”9”Then
____①____
s2=s2&Str(y)
ElseIfch>=”a”Andch<=”z”Then
y=(Asc(ch)-Asc(”a”)+3)Mod26
____②____
s1=c1+s1
Else
y=(Asc(ch)-Asc(”A”)+3)Mod26
c2=Chr(Asc(”A”)+y)
s1=c2+s1
EndIf
Nexti
____③____
Text2.Text=s
EndSub
解析 s2连接的是数字串,0-6依次加3后的值为3-9,7-9加3后的值为10-12。
将10-12转换成0-2,可以用该数Mod10的方法。
答案
(1)Com_jm
(2)Beij2018 (3)①y=(Val(ch)+3)Mod10 ②c1=Chr(Asc(”a”)+y) ③s=s1+s2
5.小王编写了一个