科目 |
政治 |
历史 |
地理 |
物理 |
化学 |
生物 |
技术 |
人数 |
193 |
151 |
112 |
186 |
167 |
103 |
179 |
设计VB程序,实现功能:将每个科目的选课人数按照选考人数降序排序后输出。其中,科目名称存放在数组a(i)中,人数存放在数组b(i)中。
程序运行界面设计如图所示,左边列表框List1是显示科目名称和选课人数,单击“排序”按钮Command1后,在右边的列表框List2中显示排序后的科目名称和选课人数。
Command1的处理事件过程如下,但加框处代码有错,请改正。
Private Sub command1_click()
Dim a(1 To 7) As String
Dim b(1 To 7) As Integer
Dim i As Integer, j As Integer, p As String, q As Integer
For i = 1 To 7
List1.AddItem a(i) + " " + Str(b(i))
Next i
For i = 1 To 6
k = i
For j = i + 1 To 7
Next j
If i <> k Then
p = a(i): a(i) = a(k): a(k) = p
End If
Next i
For i = 1 To 7
List2.AddItem a(i) + " " + Str(b(i))
Next i
End Sub
① ②
实现上述功能程序如下,在横线处填入合适的代码。
Dim n As Integer
Dim a(1 To 50) As Integer
Sub makedata(s As String) ‘该过程实现将输入的体重分别存入数组a中
Dim in As Long, x As Long, c As String, i As Integer
m=Len (s) : n=0
For i=1 To m
c=Mid(s, i, 1)
If c >=“0” And c <=“9” Then
x=x+Asc(c)-Asc(“0”)
Else
If x > 0 Then n=n+1: a(n)=x
x=0
End If
Next i
n=n+1: a(n)=x
End Sub
Private Sub Command1_Click()
Dim s As String, i As Integer, j As Integer, t As Integer
Dim cnt As Integer, st As Integer, ed As Integer
s=Text1.Text Call makedata(s) ‘调用过程
For i=1 To n-1 ‘实现降序排序
For j=n To i+1 Step-1
IfThen
a(j)=a(j)+a(j-1) : a(j-1)=a(j)-a(j-1) :
End If
Next j
Next i
‘下列程序段实现计算最多可组队伍
cnt=0: st=1: ed=n
Do While st < ed
If a(st)+a(ecl) <=120 Then
List1. AddItem Str(a(st))+“和”+Str(a(ed))+“组队”
cnt=cnt+1
st=st+1
Else
st=st+1
End If
Loop
Label2. Caption=“最多可以组”+Str (cnt)+“组队伍”
End Sub
i |
1 |
2 |
3 |
4 |
5 |
a(i) |
17 |
19 |
9 |
13 |
6 |
index(i) |
5 |
3 |
4 |
1 |
2 |
a(index(i)) |
6 |
9 |
13 |
17 |
19 |
实现上述功能的VB程序如下,但加框处代码有错,请改正。
Const n = 10
Const maxn = 20
Dim a(1 To n) As Integer, index(1 To n) As Integer, flag(1 To n) As Boolean
Private Sub Form_Load()
Dim i As Integer
Randomize
For i = 1 To n
flag(i) = False
a(i) = Int(Rnd() * maxn) + 1
List1.AddItem Str(a(i))
Next i
End Sub
Private Sub Command1_Click()
Dim i As Integer, j As Integer
Dim k As Integer
For i = 1 To n
For j = 1 To n
If flag(j) = False Then k = j: Exit For
Next j
For m = k + 1 To n
If Then k = m ‘⑴
Next m
index(i) = k
flag(k) = True
Next i
For i = 1 To n
List2.AddItem ‘⑵
Next i
End sub
⑴ ⑵
Dim n As Integer
Dim a(1 To 100) As Integer
Dim b(1 To 100) As Integer
Private Sub Form Load()
‘读取若干数据依次存储到数组a中,并将数据元素的总个数存储到变量n中。
‘将每段数据的元素个数及排序的次序依次存储到数组b中;
‘b(1)、b(2)分别存储第1段数据的元素个数、排序的次序,
‘b(3)、b(4)分别存储第2段数据的元素个数、排序的次序,.....
“代码略。
End Sub
Private Sub Command1_Click())
Dim i As Integer, j As Integer, k As Integer, t As Integer
Dim pb As Integer, endpos As Integer
pb=1: endpos =b(1)
For i=1 To n-1
If i=endpos Then
pb=pb+2:i=endpos+1
①
End If
k=i
For j =i+1 To endpos
If Then k=j ‘⑵
Next j
If k<>i Then
②
End If
Next i
Text3.Text ="" ‘⑷
For i=1 To n
Text3.Text=Text3.Text + Str(a(i))
Next i
End Sub
① ②
For I = 1 To 5
t = 1
For j = i + 1 To 6
If a(t) < a(j) Then
If i <> t Then
temp = a(i)
a(i) = a(t)
a(t) = temp
End If
Next j
Next i
下列描述正确的是( )
例如:依次输入以下区间:[2 5],[4 7],[1 4],[5 9],[4 5],[2 4],数轴如下:
坐标点“4”覆盖了[2 5],[4 7],[1 4],[4 5],[2 4]共5个区间,坐标点“9”覆盖了[5 9]区间,所以覆盖这6个区间所需的坐标点数为2个。
程序运行界面如图所示。实现上述功能的VB代码如下:
Dim n As Integer
Dim a(1 To 100) As Integer
Private Sub Input_Click()
'输入n个正整数区间,依次存放到数组
'a(1)到 a(2*n)中,并在List1中显示
'代码略
End Sub
Private Sub Count_Click()
Dim right As Integer, t As Integer, k As Integer
Dim tmp As Integer, i As Integer, ans As Integer
tmp = a(k): a(k) = a(t): a(t) = tmp
tmp = a(k + 1): a(k + 1) = a(t + 1): a(t + 1) = tmp
End If
Next i
‘改错
ans = 1: t = 3
Do While t < 2 * n
If ① Then
If a(t + 1) < right Then right = a(t + 1)
Else
ans = ans + 1
right = a(t + 1)
End If
②
Loop
Text3.Text = Str(ans)
End Sub
请回答下列问题:
① ②
每位选手的成绩数据记录规则如下:成绩数据以“;”(分号)结尾,中间用“/”(斜杠)分隔,例如:“王一超/4.10/-/3.78;李雨歆/3.87/3.85/4.20;”,表示第一位选手王一超,第一次成绩4.10米,第二次成绩无效(用“-”表示),第三次成绩3.78米,最好成绩为4.10米。第二位选手李雨歆,3次成绩分别是3.87米、3.85和4.20米,最好成绩为4.20米。
小强编写VB程序实现上述功能:程序运行时,读取所有选手数据保存在变量cj中,并显示在列表框List1中。在文本框Text1中输入进入第二轮的名次,单击“第二轮复赛名单”按钮 Command1,对数据进行统计分析,并在列表框 List2 中显示进入复赛的选手名单和最好成绩,程序运行界面如图所示,请回答下列问题。
Private Sub Command1_Click()
Dim cj As String, xm(1 To 20) As String, maxcj(0 To 20) As Single
Dim s As String, c As String, t As Single, z As Integer
Dim i As Integer, j As Integer, n As Integer, k As Integer, m As Integer
'读取所有选手数据保存在变量cj中,并显示在列表框 List1中,代码略
n = Len(cj)
i = 1 : m = 1 : z = 1
Do While i <= n
c = Mid(cj, i, 1)
j = i
Do While ‘⑶
i = i + 1
c = Mid(cj, i, 1)
Loop
If z = 1 Then
Else
t = Val(Mid(cj, j, i - j))
If t > maxcj(m) Then maxcj(m) = t
End If
z = z + 1 : i = i + 1
If c = ";" Then m = m + 1: z = 1
Loop
m = m - 1
k = Val(Text1.Text)
For i = 1 To m - 1
For j =
If maxcj(j) > maxcj(j - 1) Then
c = xm(j): xm(j) = xm(j - 1): xm(j - 1) = c
t = maxcj(j): maxcj(j) = maxcj(j - 1): maxcj(j - 1) = t
End If
Next j
If Then
List2.AddItem xm(i) + Str(maxcj(i))
Else
Exit For
End If
Next i
End Sub
Const n = 20
Dim score(1 To n) As Single
Function adj(s As String, n As Integer)
‘此函数功能:在字符串 s 前添加若干个空格,使其长度变为 n。代码略
End Function
Function search_left(key As Integer)
‘此函数功能:返回大于等于 key 的数组元素的起始位置。代码略。
End Function
Function search_right(key As Integer)
Dim i As Integer, j As Integer, m As Integer
i = 1: j = n
Do While i <= j
If key >= score(m) Then i = m + 1 Else j = m - 1
Loop
End Function
Private Sub Form_Load()
‘从数据库中读取成绩存数组 score,记录数存 n,并对此数组 score 升序排序,代码略
End Sub
Private Sub Command1_Click()
Dim num1 As Integer, num2 As Integer, first As Integer, last As Integer
List2.Clear
num1 = Val(Text1.Text): num2 = Val(Text2.Text)
first = search_left(num1): last = search_right(num2)
If total <= 0 Then
List2.AddItem "无筛选到的记录!"
Else
List2.AddItem "筛选到" + Str(total) + "条记录!"
List2.AddItem "依次是:"
For i = first To last
List2.AddItem adj(Str(i), 3) + adj(Str(score(i)), 6)
Next i
End If
End Sub
例如,读取的数据为2、3、15、25、10、14、1、5、30、60、15、25,过程是:
⑴设置区间信息为[2,3],[15,25],[10,14],[1,5],[30,60],[15,25];
⑵按区间左端点升序排序,得到J区间信息为[1,5],[2,3],[10,14],[15,25],[15,25],[30,60],[15,25];
⑶合并区间,得到[1,5],[10,25],[30,60]。说明:区间[1,5]和[2,3]合并为[1,5],区间[10,14]和[15,25]合并为[10,25],区间[10,25]和[15,25]合并为[10,25],因此合并后的结果为:[1,5],[10,25],[30,60]三个区间。
程序功能如下:单击“读数据库”按钮Command1,程序从数据库读取数据,输出在文本框Text1中;单击“开始处理”按钮Command2,程序进行区间排序,并进行区间合并操作,操作后的结果输出在文本框Text2中。程序运行结果如图所示。
实现上述功能的VB程序如下,请回答下列问题:
Dim a(1 To 100) As Integer ′数组a存储合并前的区间
Dim b(1 To 100) As Integer ′数组b存储合并后的区间
Dim n As Integer ′n表示区间个数
Private Sub Command1_Click()
Dim s1 As String, i As Integer
'读取数据,并存储到数组a中,并输出在文本框Text1中,代码略
End Sub
Private Sub Command2_CIick()
Dim s2 As String, i As Integer, j As Integer, k As Integer
Dim n As Integer, t As Integer, x As Integer
For i=1 To n-1
For j=1 To 2 * n-2 * i Step 2
If Then
t=a(j): a(j)=a(j+2): a(j+2)=t
t=a(j+1): a(j+1)=a(j+3): a(j+3)=t
End If
Next j
Next i
k=2
b(1)=a(1): b(2)=a(2)
i=2: j=3
Do While j <=2 * n
If b(i) >=a(j) Then
If b(i) <=a(j+1) Then
Else If b(i)+1=a(j) Then
b(k)=a(j+l)
Else
k=k+1:
k=k+1: b(k)=a(j+1)
i=i+2
End If
j=j+2
Loop
For x=1 To k-2 Step 2
s2=s2 & "[" & b(x) & "," &b(x+1) & "]" & ","
Next x
s2=s2 & "[" & b(x) & "," & b(x+1) & "]"
Text2.text=s2
End Sub
实现上述功能的VB代码如下,请在横线处填入合适代码。
Dim n As Integer '存储随机数的个数
Dim f(1To100)As Boolean
'f(i)为True时表示随机整数i已经产生过
Dim a(1 To 100)As Integer
'依次存放升序排序后的n个随机数
Private Sub Command1_Click()
'命令按钮“产生随机数并升序排列”的单击事件
Dim i As Integer
Randomize
For i=1 To 100
f(i)=False
Next i
n=Val(Text1. Text)
For i=1 To n
t=Int(Rnd * 100+1)
Do While f(t)=True
t=Int(Rnd * 100+1)
Loop
Next i
j=0
For i=1 To 100 '实现排序并输出
If f(i)=True Then
a(j)=i
List1.AddItem Str(i)
End If
Next i
End Sub
Private Sub Command2_Click()
'命令按钮“查找”的单击事件
Dim key As Integer
key=Val(Text2. Text)
If key <=a(1) Then Label3. Caption=Str(a(1)): Exit Sub
If key >=a(n) Then Label3. Caption=Str(a( n)): Exit Sub
L=1: R=n
Do While L<=R '找到与 key 较为接近的两个数a(R)和a(L)
m=(L+R)\2
If key<=a(m)Then
R=m-1
Else
L=m+1
End If
Loop
If Then
'在a(R)和 a(L)中选出更接近key的数
Label3. Caption=Str(a(R))
Else
Label3. Caption=Str(a L))
End If
End Sub
For i=1 To n\2
iMax= i:iMin= i
For j=i+ 1 To n-i+1
If a(j) > a(iMax) Then iMax=j
If a(j) < a(iMin) Then iMin=j
Next j
If iMax= i Then
Else
End If
Next i
上述程序段中方框处可选语句为:
①temp=a(i):a(i)=a(iMin):a(iMin)=temp
②temp=a(iMin):a(iMin)=a(n-i+1):a(n-i+1)=temp
③temp=a(iMax):a(iMax)=a(n-i+1):a(n-i+1)=temp
则方框处的语句依次为( )
a(1) = 1: a(2) = 2: a(3) = 3: a(4) = 4: a(5) = 5
k = Int(Rnd * 4) + 1: m = k
For i = 1 To m
If i <> k Then
If a(i) < a(k) Then
t = a(i): a(i) = a(k): a(k) = t
If k < 5 Then k = k + 1
End If
End If
Next i
执行该段程序段后,数组元素a(1)~a(5)的值依次不可能为( )
Dim a(1 To 15) As Integer
'生成数组a, a(1)=24:a(2)= 17:a(3)=21:
a(4)=15:a(5)=14 …代码略
n= Val(Text1. Text)
For i=1 To n-1
For j=(n+1) * n/2 To ① Step-1
If ② Then
t=a(j):a(j)=a(j- 1):a(j- 1)=t
End If
Next j
Next i
'将处理后的数组,以金字塔形显示,代码略
上述程序段中①②处的语句分别为( )
For i = 1 To ①
k = i
For j = i + 1 To ②
If a(j) < a(k) Then k = j
Next j
If k <> i Then
t = a(k)
a(k) = a(i)
a(i) = t
End If
s = s + Str(a(i))
If ③ Then
List1.AddItem s: s = ""
End If
Next i
划线处的代码应为( )
For i = 1 To 4
For j = i + 1 To 5
If a(j) > a(i) Then t = a(j): a(j) = a(i): a(i) = t
Next j
Next i
数组元素a(1)~a(5)的值依次为“15,4,12,7,9”,整个排序过程中,数组中数据比较次数和交换次数分别是( )
For i=1 To 2
For j=5 To i+1 Step-1
If a(j)<a(j-1) Then
t=a(j) : a(j)=a(j-1) : a(j- 1)=t
End If
Next j
Next i
数组元素a(1)到a(5)的值依次为“95,88,66,80,75”,经过该程序段“加工”后,数组元素a(1)到a(5)的值依次为( )
Private Sub Command1_Click( )
Dim a(1 To 100) As Integer
Dim i As Integer, j As Integer
Dim temp As Integer, k As Integer
Dim res As Integer, ed As Integer
'从文本框Text1中读入整数存储到数组a中,整数的个数存放在变量k中,代码略
For i=1 Tok\ 2-1 '以区间左边数据为主要关键字升序排序
For j=k\2 To i+1 Step-1
If Then
temp=a(j*2-1):a(j*2-1)=a((j-1)*2-1):a((j-1)*2-1)=temp.
temp=a(j*2):a(j*2)=a((j-1)*2):a((j-1)*2)=temp
End If
Next j
Next i
ed=a(2)
res= 0
For i=2 To k\2 '计算需要删除区间的最小数量
If Then
res=res+1
ed= min(ed, )
Else
ed=a(i * 2)
End If
Next i
Text2. Text= Str(res)
End Sub
Function min(x As Integer, y As Integer) As Inte-ger '函数功能:返回x与y的最小值
'代码略
End Function
编写VB程序,实现上述功能。运行程序,在列表框List1中显示n个英文单词(单词仅由小写字母组成且字母个数至少为1),单击“统计”按钮Command1,在列表框List2升序显示全部单词的按键组合,在文本框Text1中显示最频繁使用的按键组合,若有多个,则全部输出。程序运行界面如图b所示。
'n为常量,代码略
Dim a(1 To n) As String '数组a存储所有单词
Dim b(1To2*n) As String '数组b存储转换后的按键组合
Private Sub Form_ Load()
'读取所有单词存入数组a,并显示在列表框List1中
'初始化数组b各元素为空字符串,代码略
End Sub
Private Sub Command1_Click()
Dim i As Integer, j As Integer, k As Integer, p As Integer, max As Integer
Dim m As Integer, key As String, t As String, s1 As String, s2 As String
key= 222334455566677889999 'key 表示a-z各个字母所对应的键盘数字
max=0
'以下代码实现将数组a中的每个单词转化成按键组合,并依次存入数组b中
For i= 1 To n
t= ""
For j= 1 To Len(a(i))
m = Asc(Mid(a(i), j, 1))- Asc("a")
t=
Next j
b(i)= t
Next i
'以下代码实现对数组元素b( 1)~b(n)升序排序
Do While i>=1
For j= 1 To i
If b(j+ 1)< b(j) Then
t=b(j+ 1): b(j+ 1)= b(j): b(j)=t
End If
Next j
i=i- 1
Loop
'将排序后数组元素b(1)~b(n)显示在列表框List2中,代码略
s1= b(1)
p=n+ 1
i= 1:j= 2
Do While j<= n '从数组元素b(n+1)开始存储最高频次的按键组合
s2 = b(j)
If s1 < s2 Then
If Then
max=j-i
p=n+ 1
b(p)=s1
Else If max=j- i Then
p=p+ 1
b(p)= sl
End If
s1= s2
End If
j=j+ 1
Loop
t=""
If max<j- i Then
t= s1
Else
For k=n+ 1 To p
t=t+ b(k)+" "
Next k
If max=j- I Then t=t+" "+s1
End If
Text1.Text= "最频繁按键组合为: " &t
End Sub