a(1) | a(2) | a(3) | a(4) | a(5) | a(6) |
69 | 58 | 32 | 21 | 39 | 33 |
若采用冒泡排序算法对这组数据进行升序排列,那么在完成第一遍排序时,数组元素a(1)到a(6)的数据依次是( )

若采用选择排序算法对其进行从大到小排序,则第二趟的排序结果是( )
实现上述功能的VB程序如下,但加框处代码有错,请改正。
Const maxn=100
Dim id(1 To maxn)As Integer ‘存储每个学生的学号
Dim tall(1 To maxn)As Single ‘存储每个学生的身高
Dim n As Integer ‘存储学生的个数
Private Sub Form_Load()
‘从数据库得到学生的总人数n
‘从数据库读取学号信息,并存入id数组中
‘从数据库读取身高信息,并存入tall数组中
‘在列表框List1中显示学号与身高
End Sub
Private Sub Command1_Click()
Dim a(1 To maxn)As Integer ‘存储排好队形的学号
Dim b(1 To maxn)As Single ‘存储排好队形的身高
Dim i As Integer,j As Integer
Dim t1 As Integer,tr As Integer,mid As Integer
Dim tmp1 As Single,tmp2 As Integer
For i=1 To n-1
For j=n To i+1 Step-1
If
Then ‘(1)
tmp1=tall(j):tall(j)=tall(j-1):tall(j-1)=tmp1
tmp2=id(j):id(j)=id(j-1):id(j-1)=tmp2
End If
Next j
Next i
If n Mod 2=0 Then ‘根据总人数的奇偶性,确定队形的中间位置
mid=n\2+1
Else
mid=(n+1)\2
End If
‘身高第一位的同学,安排在队形的中间位置
a(mid)=id(1)
b(mid)=tall(1)
t1=mid-1
tr=mid+1
For i=2 To n
If
Then ‘(2)
a(tr)=id(i)
b(tr)=tall(i)
tr=tr+1
Else
a(t1)=id(i)
b(t1)=tall(i)
t1=t1-1
End If
Next i
List2.AddItem“位置”+“学号 ”+“身高”
For i=1 To n
List2.Addltem Str(i)+” ”+Str(a(i))+” ”+Str(b(i))
Next i
End Sub
|
排序前 |
71 |
85 |
64 |
55 |
42 |
62 |
33 |
17 |
34 |
30 |
|
排序后 |
71 |
85 |
17 |
55 |
33 |
30 |
62 |
42 |
34 |
64 |
实现上述功能的VB程序如下,但加框处代码有错,请改正。
Const n=10
Dim a(1 To n) As Integer
Private Sub Command1_Click()
Dim i As Integer,j As Integer
Dim temp As Integer,flag As Boolean
'读取一组正整数,存储在数组a中,代码略
i=1:j=n
temp=a(j):flag=True
Do While i<j
If flag Then
If a(i) Mod 2=0 Then
a(j)=a(i)
j=j-1
flag=Not flag
Else
'
End If
Else
If a(j) Mod 2=1 Then
a(i)=a(j)
flag=Not flag
Else
j=j-1
End If
End If
Loop
'
'依次输出排序后的数据,代码略。
End Sub
1)在每遍冒泡过程中,若最后一次交换的是last与last-1位置的数,则last位置之前的相邻数据均已有序。进行下一遍冒泡,无序区域设置为[last,n],每一遍排序均可能使当前的无序区域缩小。
2)若在某一遍排序中没有数据交换,说明待排序数据都已经有序,冒泡排序过程可在此遍排序后结束。因此可以引入一个变量lag,记录在每遍排序过程中是否发生了交换。
小刘按上述方法设计了一个冒泡优化VB程序功能如下:单击“生成数据”按钮 Command1后,随机生成一组无重复的两位整数存入数组a,并显示在列表框List1中。单击“排序”按钮Command2后,将数组a中的数据进行降序排序,排序后的数据显示在列表框List2中,排序过程中实际的冒泡遍数显示在Label3中。程序运行界面如图所示。实现上述功能的VB程序如下,回答下列问题。
Dim a (1 To 20) As Integer
Private sub command1_Click ( ) ‘ 随机生成不重复的两位数
Dim i As Integer, j As Integer
List1, Clear : List2. Clear
Randomize
For i = 1 To 20
a(i) = Int (Rnd*90) + 10
For j = 1 To i-1
If ① Then i =i-1:Exit For
Next j
Next i
For i=1 To 20
List1.AddItem Str(a(i))
Next i
End Sub
Private Sub Command2_ Click ( )
Dim flag As Boolean, i As Integer, j As Integer
Dim temp As Integer, num As Integer, last As Integer
num = 0 : last = 1
flag= True
Do While flag=True
②
For j = 20 To last +1 Step -1
If a(j) > a(j-1) Then
temp =a(j):a(j) = a(j-1): a(j-1) = temp
③
flag = True ' 有交换发生
End if
Next j
num = num +1
Loop
For i =1 To 20
List2 AddItem Str(a(1)
Next i
Label13. Caption = "本次排序的冒泡遍数为:" & str(num)
End sub
① ② ③
如10名运动员1号到10号的成绩分别是“13,6,9,8,10,11,10,14,16,13”,从高到低排序后,第一组的成绩依次是“16,13,10,10,9”,第二组的成绩依次是“14,13,11,8,6”。第1位的成绩分别是16和14,则第一组获胜得1分,第二组扣1分,再比较两个分组第2位的成绩13和13,则两组均不得分。依次处理,比较完剩余队员的成绩,可得第一组得分为2,第二组得分为-2。
编写一个VB程序,实现如下功能:在文本框Text1中依次输入成绩(偶数个整数,用逗号分隔并以逗号结尾),单击“确定”按钮Command1后,在列表框List1中显示对阵编号、对阵成绩及两个分组的最后得分。程序运行界面如图所示。
Private Sub Command1_Click()
Dim i As Integer, j As Integer, k As Integer
Dim s As String, ch As String, sum1 As Integer, sum2 As Integer
Dim bh (1 To 50) As Integer, cj(1 To 50) As Integer
s= Text1.Text
j= 1: k=0
For i= 1 To ①
ch = Mid(s, i, 1)
If Not (ch>= "0" And ch <= "9") Then
k=k+1
bh(k)=k
cj(k) = Val(Mid(s, j, i-j))
②
End If
Next i
For i= 1 To k-2 Step 2
For j= k To ③ Step -1
If cj(j)> cj(j-2) Then
t= cj(j): cj(j)=cj(j-2): cj(j-2)=t
t= bh(j): bh(j)= bh(j-2): bh(j-2)=t
End If
Next j
Next i
sum1 = 0: sum2= 0
List1 .AddItem "对阵编号 对阵成绩"
For i=1 To k- 1 Step 2
If cj(i)> cj(i+1) Then
sum1 = sum1 + 1: sum2 = sum2- 1
sum1=sum1-1: sum2=sum2+1
End If
List1.AddItem adj(bh(i)) + "<-->" + adj(bh(i+1)) + adj(cj(i)) + "<-->" + adj(cj(i+1)
Next i
List1.AddItem"第一组得分: "+ adj(sum1)
List1.AddItem"第二组得分: " + adj(sum2)
End Sub
Function adj(x As Integer) As String
‘函数功能:将数值x转换成字符串,并在字符串的左侧添加若干空格。代码略
End Function
① ② ③
Dim a( 1 To 100) As Integer
Dim n As Integer
Function dq(s As String, L As Integer) As String ‘自定义对齐函数
‘在输入的字符串s前加若干空格,输出长度为L的字符串,代码略
EndFunction
Private SubCommand1_Click() '生成数字矩阵
‘随机生成n^2个数字,存储在数组a中,代码略
‘以一行n个,共n行的格式显示在List 1中,代码略
End Sub
Private Sub Command2_Click() '数字矩阵排序
Dim i As Integer, k As Integer, j As Integer, s As String
Dim f As Boolean
List 2.Clear
f=True
For i=1 To n^2 Step n
s=“”
For j=i To
k=n^2
Do While ①
If a(k) <a(k-1) Then
t=a(k):a(k)=a(k-1):a(k-1)=t
End If
k=k-1
Loop
If f=True Then
s=s+“”+dq(Str(a(j) ) , 2)
Else
s=“”+dq(Str(a(j) ) , 2) +s
End If
Next j
List 2.Add Items
②
Next i
End Sub
① ②
Dim a(1 To 10) As Integer,b(1 To 10) As Integer
k = 0
For i = 10 To 1 Step -1
Do While b(i) <> 0 k = k + 1
a(k) = i: b(i) = b(i) - 1
Loop
Next i
若 a(1)~a(10)的值分别为 7,9,8,1,9,4,4,2,1,1,则运行以上程序后,下列说法正确的是( )
| d[1] | d[2] | d[3] | d[4] | d[5] | d[6] | d[7] | d[8] |
| 206 | 216 | 210 | 222 | 218 | 208 | 220 | 202 |
For i=1 To 7
flag=False
For j=8 To i+1 Step-1
If a(j)<a(j-1) Then
t=a(j):a(j)=a(j-1):a(j-1)=t
flag=True
End If
Next j
If Not flag Then Exit For
Next i
数组a(1)到a(8)存储的数据依次为“38,11,21,62,59,65,77,79”,如果用上述算法排序,程序执行后,变量i的值为( )
划分赋分等级:将考生每门选考科目的原始成绩从高到低划分为A、B+、B、C+、C、D+、D、E共8个等级,各等级人数所占比例分别为3%、7%、16%、24%、24%、16%、7%、3%,如下表所示。
|
等级 |
A |
B+ |
B |
C+ |
C |
D+ |
D |
E |
|
比例 |
3% |
7% |
16% |
24% |
24% |
16% |
7% |
3% |
转换赋分成绩: 将A至E等级内的考生原始成绩,依照等比例转换法则,分别转换到91-100、81-90、71-80、61-70、51-60、 41-50、31-40、21-30八个分数区间,得到考生的赋分成绩,如图a所示。

转换公式如下: t=t2+(s-s2)*(t1-t2)/(s1-s2), 其中t表示转化后的赋分成绩,t1 表示该档最高转化分,t2 表示该档最低转化分,s表示原始分,s1 表示该档最高原始分,s2表示该档最低原始分。
比如选择物理的学生有20000人,小明物理卷面分90分,排名为1800名,则他在物理学科中的比例是9%。按照赋分等级表可知他所处等级为B+。若原始分4%-10%区间的最高分为94,最低分为88,B+区间分数为81-90分。小明转化后的赋分成绩为81+ (90-88)* (90-81)/(94-88)=84分。
编写一个VB程序计算某校学生某科目成绩的赋分,功能如下:从数据库中读入学生学号、姓名、班级和原始成绩,并在列表框List1中显示,单击“赋分”按钮Command1,在列表框List2中按原始成绩从高到低显示赋分等级和赋分成绩。赋分时,先按原始成绩从高到低排序,再根据人数比例计算切分位置,最后对落入同一等级的学生进行赋分。若切分位置有相同分数学生,则归为同一个等级。例如,某等级切分位置是第100位,但第101位学生的原始成绩和第100位相同,则这两名学生的赋分等级相同。程序运行界面如图b所示。

实现上述功能的VB程序如下,请回答下列问题:
Const max = 1000
Dim n As Integer '存放学生人数
Dim xh(1 To max) As String, xm(1 To max) As String
Dim bj(1 To max) As Integer, fs(0 To max) As Single
Dim ffcj(1 To max) As Integer '数组ffdj存储学生的赋分等级
Dim ffdj(O To max) As String '数组ffcj存储学生的赋分成绩
Private Sub Form_ Load()
Dim i As Integer, km As String
Dim conn As New ADODB. Connect ion
Dim rs As New ADODB. Recordset
Conn.ConnectionString =“prov ider-microsoft.ace.oledb.12.0;data source=” +App. Path + “\s tudent. accdb”
conn. Open
Set rs. ActiveConnection = conn
Rs. Open' 'select * from stu_ info"
‘本过程其它代码从数据库中读入学生学号、姓名、班级和原始成绩存储到数组xh、xm、bj和fs中,并在List1中显示。学生数存储在变量n中。
Loop
End Sub
Private Sub Command1_ Click()
Dim q(1 To max) As Integer, p(1 To 8) As Single, dj(1 To 8) As String
Dimi As Integer,j As Integer, t As Integer, pos As Integer, last As Integer
Dim t1 As Integer, t2 As Integer, s1 As Single, s2 As Single
p(1) =0.03: p(2) = 0.07: p(3) =0.16: p(4) = 0.24
p(5) =0.24: p(6) =0.16: p(7) =0.07: p(8)=0.03
dj(1)="A : dj(2) = "B+*: dj(3) = "B": dj(4) = C+
dj(5)= "C: dj(6) = "D+*: dj(7) = "D": dj(8)="E”
For i=2 To 8 ‘计算到该等级累计所占比例
p(i) =
Next i
For i=1 To n
q(i) = i
Next i
For i=1 To n- 1
For j=n To i+1 Step-1
If fs(q(j)) > fs(q(j - 1)) Then
t=q(j):q(j)=q(j-1):q(j-1)=t
End If
Next j
Next i
pos=1
t1=100:t2=91
For i =1 To 8
last=Int(n*p(i)+0.5)
Do While
last=last+1 ‘处理切分位置的同分数学生
Loop
s1 = fs(q(pos)): s2 = fs(q(last))
Do While pos <= last
ffcj(q(pos)) = t2 + (fs(q(pos)) - s2) / (s1 - s2) * (t1 - t2)
pos=pos+1
Loop
t1 = t1 -10:t2=t2- 10
Next i
For i=1 To n
List2. AddItem xh(q(i)) + xm(q(i)) + Str(bj(q(i))) + dj(ffdj(q(i))) +Str (ffcj(q(i)))
Nexti
End Sub
编写一个VB程序,实现上述功能。程序运行时,在列表框List1中显示n名学生的姓名、性别和成绩,在文本框Text1中输入性别,Text2中输入k,单击“筛选”按钮Command1,在列表框List2中显示筛选出的学生姓名、性别和成绩。程序运行界面如图所示。
Dim n As Integer
Dim xm(1 To n) As String
Dim xb(0 To n) As String
Dim cj(0 To n) As Integer
Private Sub Form_Load()
'读取学生姓名、性别和成绩分别存 xm、xb 和 cj 数组,并在列表框 List1 中显示。
'学生人数存变量 n,代码略。
End Sub
Private Sub Command1_Click()
Dim s As String, k As Single, m As Single, mm As Integer
Dim c As Integer, p As Integer, i As Integer, j As Integer
Dim t1 As String, t2 As Integer
s = Text1.Text
k = Val(Text2.Text)
c = 0
For i = 1 To n
If xb(i) = s Then
Next i
m = c * k / 100
If m < 1 Then
mm = 1
Else
mm =
End If
i = 1
Do While i <= n
p = i
For j = i + 1 To n
If xb(j) = s Then
If
Then p = j
End If
Next j
If i <> p Then
t1 = xb(i): xb(i) = xb(p): xb(p) = t1
t2 = cj(i): cj(i) = cj(p): cj(p) = t2
End If
If i > mm And (xb(i) <> xb(i - 1) Or cj(i) <> cj(i - 1)) Then Exit Do
i = i + 1
Loop
For i = 1 To mm
List2.AddItem xm(i) + " " + xb(i) + " " + Str(cj(i))
Next i
End Sub
a(1)="20": a(2)="16": a(3)= "12": a(4)="o": a(5)="k"
For i=1 To 4
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
Next j
List3.AddItem a(i)
Next i
该程序段运行后,列表框List1中显示的内容为( )
在Text1中输入班级,在Text2中输入姓名,单击“查询”按钮Command1,显示:①学生行列位置显示在标签Label2中:②学生具体位置显示在列表框List1中。程序运行界面如图所示。
|
班级 |
1 |
1 |
1 |
1 |
1 |
2 |
2 |
2 |
3 |
3 |
…… |
|
姓名 |
王宽 |
彭建飞 |
杨健 |
黄楠 |
李明 |
李英 |
张本初 |
吴曦 |
宋纯 |
姜明 |
…… |
|
节目编号 |
1 |
5 |
2 |
5 |
5 |
2 |
1 |
4 |
5 |
5 |
…… |
|
表1 |
|||||||||||
Const n = 150
Const row = 10: Const col = 20
Const acty = 3: Const actx= 4
Dim a(1 To n) As Strire, b(1 To n) As String, c(1 To n) As String
Dim e(1 To row * col) As String ‘存储学生姓名
Private Sub Command1_Click( )
num = f(Text1. Text, Text2. Text)
If num <> 0 Then
l= (num-1) \col + 1
'在list1中用实心图形标记查找到的位置,代码略
Label2. Caption =“你的位置在:第“+ Str(1) +”排,第“+ Str(r) + ”列”
Else
Label2. Caption =“没有找到你的座位!”
End If
End Sub
Private Sub Form _Load( )
Dim lastn As Integer, m As Integer ,flag As Boolean,k As Integer
'读取班级、学生姓名、参加节目编号到数组a、b、c中,代码略
flag = True: lastn = 1
Do While flag
For j=n To lastn+1 Step -1
If c(j)<c(j-1) Then
t= a(j): a(j) = a(j-1): a(j- 1) = t
t=b(j): b(j) = b(j-1): b(j- 1) = t
t=c(j): c(j) = c(j- 1): c(j-1)= t
lastn = j:flag = True
End If
Next j
Loop
‘座位初始化,并且在list1中显示,代码略
m=1:k=13
For i=1 To row
For j=1 To col
If Then
e((i-1) *col+j)=b(m):m=m+1
ElseIf k <= n Then
e((i - 1) * col + j) = b(k):k=k+1
End If
Next j
Next i
End Sub
Function f(a As String,b As String) As Integer
‘函数f根据输入的班级、姓名返回在数组e中的位置,如果没有找到则返回数字0
End Function
Const n=8
a(1)=33:a(2)=8:a(3)=49:a(4)=25:a(5)=56:a(6)=3:a(7)=12:a(8)=41
x=n\2
For i=x To 2 Step-1
For j=1 To i - 1
If a(j)< a(i) Then
t=a(j):a(j)=a(i):a(i)=t
End If
Next j
Next i
i =n
Do While i>x+ 1
k=i
For j=i-1Tox+1 Step -1
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
i=i-1
Loop
执行完这段代码后,数组a中各个元素的值为( )
n=6:Text2. Text=" "
m=Val(Text1. Text)
For i=1 To 3
k=i
j=i+1
Do While j<=m
If a(k)> a(j) then k=j
j=j+1
Loop
If i<>k Then
Text2. Text= Str(a(k))+Text2. Text
t=a(i):a(i)=a(k):a(k)=t
End If
Next i
数组元素d(1)到d(6)的值依次为“39,25,18,20,73,70”,现运行程序在文本框Text1里输入5,点击按钮Command1后文本框Text2中显示的内容是( )

Const nc=10 '城市数
Const n=200000'志愿者总人数
Dim a(1 To n) As String'存储志愿者数据
Private Sub Form_Load()
'本过程读取志愿者数据,存入数组a并显示在列表框List1中,代码略
End Sub
Private Sub Command1_Click()
Dim city(1 To n) As Integer,pname(1 To n) As String,cs(1 To n) As Integer
Dim t As Integer,t1 As String
Dim b(1 To nc) As Integer '存储每个城市的报名人数
Dim index(1 To n) As Integer '定义索引数组
For i = 1 To n
city(i) = Val(Mid(a(i), 1, 1))
pname(i) =
cs(i) = Val(Mid(a(i), 7))
Next i
i = 1 '按城市序号升序排序
Do While i < n
k = i: i = n
For j = n To k + 1 Step -1
If city(j) < city(j -1) Then
t = city(j): city(j) = city(j -1): city(j -1) = t
t1= pname(j): pname(j) = pname(j -1): pname(j -1) = t1
t = cs(j): cs(j) = cs(j -1): cs(j -1) = t
End If
Next j
Loop
For i = 1 To n
![]()
index(i) = i
Next i
pos = 1 '相同城市志愿者按服务次数降序排序
For i = 1 To nc
For j = pos To pos + b(i) -2
k = j
For p = j + 1 To
If cs(index(p)) > cs(index(k)) Then k = p
Next p
t = index(j): index(j) = index(k): index(k) = t
Next j
pos = pos + b(i)
Next i
'最终结果显示在列表框List2中,代码略
End Sub
‘生成6个随机正整数,依次存入数组元素a(1)到a(6),代码略
For i=1 To 2
For j=6 To i+ 1 Step -1
If a(j)Mod 3 >a(j-1)Mod 3 Then
t=a(j):a(j)=a(j-1):a(j-1)=t
End If
Next j
Next i
执行上述程序段后,下列选项中,a(1)到a(6)各元素值不可能的是( )

小明使用选择排序思想对上述n个节目按得分进行降序排序(得分相同的按编号升序排列),并依据得分插入各个节目的排名信息,处理后数组a的存储结构如下图所示:

程序运行时,单击命令按钮Command1后读取数据到数组a中并显示在列表框List1中,单击命令按钮Command2后将节目按照上述规则进行排序,并将排名结果显示在列表框List2中。实现上述功能的VB程序如下,请回答下列问题:
Const n = 20
Dim a(1 To 3 * n) As Integer
Private Sub Command1_Click ()
‘读取数据,存储在数组a中,并显示在列表框List1中。代码略
End Sub
Private Sub Command2_Click ()
![]()
k=i
For j=1 To i-1
If a(2*j) < a(2*k) 0r Then
k=j
End If
Next j
a(3*i)=a(2*k)
a(3*i-1)=a(2*k-1)
a(2*k-1)=a(2*i-1)
Next i
List2. AddItem "第1名:编号”+ CStr(a(2)) + ",分数”+ Str(a(3))
a(1) =1
mc=1
For i=2 To n
If Then mc=i
List2. AddItem "第"+ Str(mc) + "名:编号" + CStr(a(3* i-1)) +",分数"+Str(a(3 * i))
a(3*i-2)=mc
Next i
End Sub