实现上述功能的VB程序如下,请回答下列问题:
Dim ach(1 To 500) As String '存储各学生选课编码
Dim bno(1 To 10) As Integer '存储各科目编号
Dim bname(1 To 10) As String '存储各科目名称
Dim bnum(1 To 10) As Integer '存储各科目被选次数
Dim bmc(1 To 10) As Integer '存储各科目被选的名次
Dim n As Integer, num As Integer
Private Sub Command1_Click()
Dim i As Integer, km As String
km = "物理化学生物政治历史地理技术"
Dim cn As New ADODB.Connection, rs As New ADODB.Recordset, sql As String
cn.Open "provider=Microsoft.Jet.oledb.4.0;Data Source=" + App.Path + "\students.mdb"
rs.Open "select * from choose", cn
Do While Not rs.EOF
n = n + 1 : ach(n) = rs.Fields("subject") : rs.MoveNext
Loop
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
For i = 1 To 7
bno(i) = i
bname(i) = Mid(km, (i - 1) * 2 + 1, 2)
List2.AddItem Str(bno(i)) + "---" + bname(i)
Next i
End Sub
Private Sub Command2_Click()
Dim i As Integer, j As Integer, k As Integer
Dim c As String, per As Integer
For i = 1 To n
If check(ach(i)) = True Then
For j = 1 To 3
c = Mid(ach(i), j, 1)
bnum(Val(c)) =
Next j
num = num + 1
End If
Next i
i = 1
Do While i <= 7'该循环得到各学科被选人数的名次
bmc(i) = 1
For j = 1 To 7
If bnum(j) >bnum(i) Then
Next j
i = i + 1
Loop
For i = 1 To 7
For j = 1 To 7
If Then
per = Int(bnum(j) * 100 / num * 100) / 100
List3.AddItem Str(bno(j)) + "---" + bname(j) + "---" + Str(per) + "%"
End If
Next j
Next i
End Sub
Function check(s As String) As Boolean
'代码略! 若学生选科代码有效,函数返回True,否则返回False
End Function
●变化段:数组中相邻两个元素构成一个变化段。变化段有上升段(a(i)>a(i-1))、下降段(a(i)<a(i-1))和持平段(a(i)=a(i-1))。数组a中的n个元素可构成n-1个依次排列的变化段。
●波峰:从上升段转到下降段形成一个波峰。波峰的起点是峰顶前所有连续上升段中的第1个,终点是峰顶后所有连续下降段中的最后1个。
●对称波峰:上升段与下降段个数相同的波峰称为对称波峰。
下图为一组数据的变化段及波峰示意图。
现要求统计数组a各元素依次变化过程中“对称波峰”的个数。小李依据上述描述设计了如下VB程序。请回答下列问题:
Const n=20
Dim a(1 To n)As Integer
Private Sub FormLoad()
‘读取数据,并存储到数组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
EIself 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
① ② ③
查找的英文单词由连续的ASCII英文字符(a~z或A~Z)组成。组合词程序会进行分解,如river-small可拆分为2个单词river和small,查找的英文单词不区分大小写。程序代码如下,但加框处代码有错,请改正:
Private Sub Command1_Click()
Dim article As String,f As String,count As Integer
Dim i As Intege,,begin As Integer,s As String
article=Text1.Text : f=Text2.Text : count=0
begin = 1
For i=1 To Len(article)
t = Mid(article,i,1)
If Not(t>="A"And t<="Z" Or t>="a" And t<="z") Then
If i > begin Then
s = '①
If LowerCase(f)=LowerCase(s) Then
count = count+1
End If
End If
begin = i + 1
End If
Next i
Text3.Text=Str(count)
End Sub
Function LowerCase(word As String) As String '单词转化为全小写的形式
Dim i As Integer,c As String
For i=1 To Len(word)
c = Mid(word,i,1)
'小写英文字母的ASCII码值比大写字母的值大32
If c>="A" And c<="Z" Then c = '②
LowerCase = LowerCase + c
Next i
End Function
以上程序段运行时,为了实现上述功能,加框处代码应改正为:
①;②。
删数的算法如下:
⑴如果k>0,则从前往后检测相邻字符,否则,转⑶;
⑵①若所有相邻字符都已非降序,则将串尾k个字符删去,k值置0,转⑴;
②若相邻两数存在逆序(即前一个数>后一个数),则将前一个数删除,k值变化,然后回到⑴;
⑶去掉串首的0,输出结果。
按照上述算法思路,编写了VB程序,功能如下:在文本框Text1中输入数字串,在文本框Text2中输入删数的个数,单击“处理”按钮Command1,在文本框Text3中显示最小的整数。程序运行界面如图所示。
delete函数说明:delete(st,x,y)为自定义函数,功能为在字符串st中删除x位置开始的y长度的子串。
Private Sub Command1_Click()
Dim s As String, k As Integer, i As Integer, j As Integer, n As Integer
s = Text1.Text
k = Val(Text2.Text)
n = Len(s)
Do While k > 0
i = 1
Do While i < n And
i = i + 1
Loop
If i = n Then
n = n - k
k = 0
Else
s = delete(s, i, 1)
n = n - 1
End If
Loop
i = 1
Do While n > 1 And Mid(s, 1, 1) = "0"
s = delete(s, 1, 1)
i = i + 1
n = n - 1
Loop
Text3.Text = s
End Sub
Function delete(st As String, x As Integer, y As Integer) As String
delete = Mid(st, 1, x - 1) + Mid(st, x + y) 'mid函数第3个参数省略,则截取从开始位置向右到字符串结尾的所有字符
End Function
解决此问题可采用自底至顶分析的方法。如图a所示的数塔中,先从第3层开始分析:如果路径经过第3层的第1个数字12,那么从12到尾结点的路径上数字之和的最大值是当前结点值加上该结点左下方、右下方结点中的较大值,记作f(3,1)=12+141同理,f(3,2)=7+15、f(3,3)=26+15:再分析第2层,计算f(2,1)、f(2,2):最后计算出第1层f(1,1),即为所求结果。
Const n= 5
Dim a(1 To n^2) As Integer ‘数组a存储数塔数据,存储结构如图c所示
Dim f(1 To n^2) As Integer ‘数组f存储从第i层第j个数到底层尾结点的最大数字之和,其存储结构与数组a一样
Private Sub Command2Click()
‘生成数塔,将数据存入a数组中,代码略
End Sub
Private Sub Command2Click()
Dim i As Integer, j As Integer, k As Integer
For j=1 To n
f((n-1)*n+j)=
Next j
For i=
For j=1 To i
k=(1-1)*n+j
f(k)=
Next j
Next i
Label1.Caption=“路径上的数字和最大值为:"+Str(f(1)
End Sub
Function max(a As Integer, b As Integer) As Integer
If a>b Then max=a Else max=b
End Function
Private Sub Command1_Click()
Dim a(1 To 100) As Single
Dim b(0 To 100) As String
Dim s As String, c As String
Dim sz As Integer, i As Integer, k As Integer
s=Text1.Text,
k=0
For i=1 To Len(s)
c=Mid(s, i, 1)
If c>="0" And c <= "9" Then
sz=0
Do While c>="0" And c<="9"
sz= ①
i=i+1
c=Mid(s, i, 1)
Loop
k=k+1:a(k)=sz:b(k)=c
End If
Do While k>1 And ②
If b(k-1)="+"Then a(k-1)=a(k-1)+a(k)
If b(k-1)="-"Then a(k-1)=a(k-1)-a(k)
If b(k-1)="*"Then a(k-1)=a(k-1)*a(k)
If b(k-1)="/"Then a(k-1)=a(k-1)/a(k)
b(k-1)=b(k)
k=k-1
Loop
Next i
Label1.Caption="运算的结果是:"+Str(a(1))
End Sub
Function yxj (x As String) As Integer
If x="*"Or x="/"Then
yxj=1
ElseIf x="+"Or x="-"Then
yxj=2
Else
③
End If
End Function
① ② ③
1)变化段:数组中相邻两个元素构成一个变化段。变化段有上升段(a(i)>a(i-1))、下降段(a(i)<a(i-1))和持平段(a(i)=a(i-1))。数组a中的n个元素可构成n-1个依次排列的变化段。
2)波峰:从上升段转到下降段形成一个波峰。波峰的起点是峰顶前所有连续上升段中的第1个,终点是峰顶后所有连续下降段中的最后1个。
3)对称波峰:上升段与下降段个数相同的波峰称为对称波峰。下图为一组数据的变化段及波峰示意图。
现要求统计数组a各元素依次变化过程中“对称波峰”的个数。小李依据上述描述设计如下VB程序。请回答下列问题:
Const n=20
Dim a(1 To n)As Integer
Private Sub Form_Load()
'读取数据,并存储到数组a中,代码略
End Sub
Private Sub Commandl_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+l
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+l
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
①②③
租车原则是首先考虑自带经费多的部分同学优先租相对花费少的自行车,尽量少花学校经费以达到最多同学租车的结果。比如学生带的钱为9,3,6,7,5,租车的钱分别需要15,8,12,6,9,11,如果5个人都能租车,至少需要学校提供经费为(6-3)+(8-5)+(9-6)+(11-7)+(12-9)=16,如果学校经费只有10元,则自带钱最少的同学不租车,这时所需学校经费为(6-5)+(8-6)+(9-7)+(11-9)=7。计算过程中采用二分查找法来判断租用自行车的人数能否达到最大值。
Dim a( 1 To 100) As Integer, b( 1 To 100) As Integer
Dim n As Integer, m As Integer
Private Sub Command1_Click()
Dim left As Integer, right As Integer, mid As Integer, an s As Integer
n=Val(Text 1.Text) :m=Val(Text 2.Text)
‘从数据库读取n位同学带的钱存储在数组a,m辆自行车租用的钱存储在数组b,代码略。
Call px(a(),n)
Call px(b(),m)
left =1:right=n:ans= 0
Do While left<=right
mid=(left+right) \ 2
If check(mid) =True Then
①
right =mid-1
Else
left =mid+ 1
End If
Loop
Label 1.Caption=“能租车的最大人数为”+Str(ans)
End Sub
Sub px(d() As Integer, s As Integer)
Dimi as integer, j as integer, k as integer
For i=2Tos
k=d(i)
j=i-1
Do While k<d(j)
d(j+1)=d(j)
j=j-1
If j=0ThenExitDo
Loop
②
Next i
End Sub
Function check(mid As Integer) As Boolean
Dim cnt As Integer, jf As Integer, t As Integer
cnt=Val(Text 3.Text)
For t=1Ton-mid+ 1
If b(t) >a(mid+t-1) Then jf=b(t) -a(mid+t-1) Else jf= 0
③
Next t
If cnt>= 0 Then check=True
End Function
① ② ③
Function c(m As Integer, n As Integer) As Long
If n= m Then
c=1
Else
If n=1Then c= m Else c=c(m-1, n-1)*m\n
End If
End Function
Private Sub Command1_Click()
Dim k As Integer, i As Integer, sum As Long
k = Val (Text1. Text): sum= 0
For i= 2 To k
sum=sum+c(k,i)
Next i
Text2. Text = Str (sum)
End Sub
在文本框Text1中输入3,执行该程序段,则文本框Text2中显示的内容是( )
Private Sub Command1_Click()
Dim i As Integer,s As string
s = ""
For i = 1 To 3 Step 2
s = str(f(i)) + s
Next i
Text1. Text = s
End Sub
Function f(n As Integer) As Integer
If n = 1 Then
f = 2
Else
f = f(n - 1) + n
End If
End Function
则执行该程序段后,s 的值为( )
•第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。
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(2 m+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 i <= n And p <= m
If IsIn(i, p) Then
If Then
LL = LL + 1
Else
L = L + LL + 1
LL = 0
End If
i = i + 1
Else
c(2 ∗ p - 1) = L
c(2 ∗ p) = LL
L = 0
p = p + 1
End If
Loop
If i <= n Then
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 a(i) >= b(2 ∗ p - 1) And a(i) <= b(2 ∗ p)
And p <= m Then
IsIn = True
Else
IsIn = False
End If
End Function
实现上述功能的程序如下,请在划线处填入合适的代码。
def isprime(x):
for i in range(2,x):
if :
return False
return True
n=int(input("请输入一个正整数 n:"))
c=0
k=3
while k<=n-2:
if isprime(k) and :
print(k,k+2)
k=k+1
print("共有"+str(c)+"对双胞胎数")
有5个人坐在一起,第5个人说他比第4个人小3岁;第4个人说他比第3个人小3岁;第3个人说他比第2个人小3岁;第2个人又说他比第1个人小3岁;第1个人说他是38岁。编写程序,计算出第5个人的年龄并显示。
def age(n):
if n == 1: c =
else: c = age(n - 1) - 3
return
print("第5人的年龄:",age())
input("运行完毕,请按回车键退出...")
例如,压缩前的原始数据为:
11111100 010111010 10110000可表示为十六进制:FC 5A B0
删除每字节的后2 bit:
111111 00 010110 10 101100 00
首尾相连构建新的数据:
11 11110101 10101100表示为十六进制:…F5 AC
自此,原数据进行了有损压缩。程序运行界面如下所示,
实现上述算法的VB程序如下,但程序中加框处有误,请改正。
Dim a(1 To 100) As Integer
Const code="0123456789ABCDEF"
Const n=100
Private Sub Form_Load() '以随机数模拟读取原始数据
s=""
Randomize
For i=1 To n
a(i)=Int (Rnd()*16)
Text1.Text=Text1.Text+ '①
Next i
End sub
Private Sub Command1_Click()
For i=1 To n
t=t+HtoB(a(i))
Next i
For j=1 To n* 4 Step 8 '每8位一组每8位一组,取前6个字符
s=s+Mid(t, j, 6)
Next j
For i=1 To 4 *(n-1) Step 4 '每4位一组转为十六进制显示
Text2.Text= Text2.Text +BtoH (Mid(s, 1, 4))
Next i
End sub
Function HtoB (x As Integer) As String '十六进十六进制转为二进制函数
t=""
m=0
Do While '②
r=x Mod 2
m=m+1
t= Trim(r)+t 'trim()用于删除前导空格
x=x\2
Loop
HtoB=Mid("0000", 1, 4-m)+t
End Function
Function BtoH (y As String) As String '二进制转为十六进制函数
t1=Val(Mid(y, 4, 1))
t2=Val(Mid(y, 3, 1))
t3=Val(Mid(y, 2, 1))
t4=Val(Mid(y, 1, 1))
s=t1+t2*+t3*4+t4*8
BtoH= Mid(code,s+1,1)
End Function
例:使用凯撒密码对明文“yza”进行加密的过程:“yza”→121 122 97→…→ 98 99 100 →“bcd”
要求:如果明文是大写字母则需要转小写。如果明文是其它字符则不作任何处理。例如:明文为“ABc,z”密钥为3,则结果密文为“def,c”
def change(code,key):
#change函数功能:实现要进行加密的字符code由大写字母转小写字母
#判断转换后的字符code是否为小写字母,若是则进行加密
m=ord(code)
return chr(m)
code=input(“请输入要加密的明文”)
key=int(input(“请输入密钥”))
code_new=“”
for i in code:
code_new+=change(i,key)
print(code_new)
A)在输入的字符串中提取英文字母,作为需要加密的明文(明文字符数必须是3的倍数,不足3位的舍去)
B)将明文ASCII码分成3个字节一组,顺次连接后得到24位二进制数;
C)将得到的24位二进制数字按每6位一组分成4组,每组6个位;
D)在C)中得到的6个位前补上2个0,得到8个字节的二进制数;
E)将D)中得到的8个二进制数分别转换为十进制数;
F)将得到的数字用随机产生的大写字母连接起来,以大写字母结尾
按照上述规则,设计了一个加密VB程序,功能如下:单击“加密”按钮Command1,程序依次将文本框Text1中英文字母提取,将3的倍数个的字母转换为4个数字,并输出在文本框Text2中程序运行效果如下图所示。请回答下列问题:
Private Sub Command1_ Click()
Const maxn= 100
Dim s As String, i As Integer, n As Integer
Dim ch As String, k As Integer, jg As String
Dim a(1 To maxn) As Integer, b(1 To maxn) As Integer
s= Text1. Text
n=0
For i=1 To Len(s)
ch= Mid(s, i, 1)
If Then
n=n+1
a(n)= Asc(ch)
End If
Next i
For i=0 To k
b(i * 4+1)=a(i*3+1)\ 4
b(i*4+2)=
b(i*4+3)=(a(i*3+2)Mod16)* 4+a((i- 1) *3+3)\ 64
b(i*4+4)=a(i*3+3)Mod64
Next i
Randomize
jd= ""
For i=1 To 4 * (k+1)
jd=jd+Str(b(i)) +
Next i
Text2. Text=jd
End Sub
Function pd(c As String) As Boolean
pd= False
If c>="A" And c<="Z" Or c>="a" And c<="z" Then:
pd= True
End If
End Function
def mychar(s,c):
count=0
for i in s:
if i==c:
count+=1
return count
x1=input('请输入字符串:')
x2=input('请输入字符:')
print(mychar(x1,x2))
①请填空完善该程序,实现功能:计算组合数Cnm=n!/(m!*(n-m)!),其中n!=1×2….. ×n,m和n均为正整数,且m<=n<=1000。
②编写完成后原名保存并关闭应用软件。
def fac(n): #用递归的方法求n!
if n == 0:
return 1
else:
return n*
n=int(input("请输入正整数n的值:"))
m=int(input("请输入正整数m的值(m<=n):"))
c = //(fac(m)*)
print(c)
①将明码中每个字符的ASCII码转为八位二进制,依次连接
②位置加密:每4位一组进行移位,第1组左移一位,并将原第一位数码移至最后(如0110转化为1100),第2组右移一位,并将原最后一位数码移至头部(如0001转化为1000),第3组左移...以此类推,实现位置加密,并将每组移动后的结果转换成十进制,按顺序连接
③值加密:随机产生一个密钥key,在符号列表['+','*','//','%']中取出对应运算符号,将②中的十进制结果分别与密钥key进行运算,顺次连接求得该字符的密文,(如key为3,取得运算符'%',则字符'a'的高位密文为12%3=0,低位密文为8%3=2,顺次连接后得'a'的密文为'02'
④将每个字符的密文顺序连接,得到最终字符串密文。
用Python编写的程序运行结果如图所示,请回答下列问题:
import random
def jzzh(x):
s=''
for i in range(8):
r=x%2
s=
x=x//2
return s
def jisuan(x): #进行key运算
m=0
if fh[key]=='+':
m=x+key
elif fh[key]=='*':
m=x*key
elif fh[key]=='//':
m=x//key
elif fh[key]=='%':
m=x%key
return m
def yidong(x):
jg=''
n=len(x)//4
for i in range(n):
if i%2==0:
f=
else:
f=x[i*4+3]+x[i*4:i*4+3]
s=0
for j in f: #将4位二进制转成十进制
s=s*2+int(j)
jg+=
return jg
mingw=input('请输入要加密的明文:')
fh=['+','*','//','%']
miw='' global key
key=random.randint(0,3) for a in mingw:
a=ord(a)
L=jzzh(a)
miw+=L jieguo=yidong(miw)
print("产生的随机密钥为:",key,"\n 密文为:",jieguo)