Dim i as Integer, max as Integer Dim a(1 to 10) as Integer
‘代码略,随机产生 10 个不重复的数存于数组 a 的 10 个元素 a(1)~a(10)中max=a(1)
For i=2 to 10
If a(i)>a(max) then max=i Next i
变量 max 用于存储( )
移牌规则:在编号为①的堆上取的纸牌,只能移到编号为②的堆上;在编号为N(N≥2)的堆上取的纸牌,只能移到编号为N-1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。
例如N=4,4堆纸牌数分别为:
|
① |
② |
③ |
④ |
|
9 |
8 |
17 |
6 |
移动3次可达到目的:从③取4张牌放到④(9 8 13 10)→从③取3张牌放到②(9 11 10 10)→从②取1张牌放到①(10 10 10 10)。
现编写如下代码解决4堆任意张数牌的移动问题,请按提示补充划线句的代码:
Private Sub Command1_Click()
Dim aver As Single
Dim st As Integer ‘统计移动的步数
Dim ssum, i, j As Integer
Dim a( 1 To 100) As Integer
a(1) = Val(Text1.Text) ‘读取各堆牌张数,求总张数aver
a(2) = Val(Text2.Text)
a(3) = Val(Text3.Text)
a(4) = Val(Text4.Text)
ssum =a(1) + a(2) + a(3) + a(4)
aver=ssum \ 4 ‘求牌的平均张数aver
For i=1 To 4
①
Next i
i=1 ‘过滤初端和末端的0
j = 4
Do While a(i) = 0 And i < 4
i=i+1
Loop
Do While a(j) = 0 And j > 1
j = j-1
Loop
st = 0
Do While i < j ‘开始移动牌使数组a元素值均为0并过滤掉
②
a(i) = 0
st = st + 1
i=i+1
Do While a(i) = 0 And i<j ‘过滤掉数组a元素值均为0
③
Loop
Loop
Print st ‘输出移动次数
End Sub
DIM A(6) AS INTEGER
FOR I= 1 TO 6
A(I)= I
NEXT I
PRINT A(I)
Dim i As Integer, max As Integer
Dim a (1 to 10) As Integer
‘代码略,随机产生10个不重复的数存于数组a的10个元素a⑴~a⑽中max=1
For i=2 To 10
If a (i) > a(max) Then max=i
Next i
Dim a(1 To 5)As Integer
Dim res As string
n = 19: i = 0
Do While n < 0
i = i + 1
a(i) = n Mod 2
n = n\2
Loop
程序运行后,数组元素a(1)~a(5)的值依次是( )
Const n = 10
Dim d(n) As Integer, c As Integer
Private Sub Form_Load()
Dim i As Integer, j As Integer, f As Boolean, s As String
Randomize
c = n
For i = 1 To n
f = False
d(i) = ① ' 随机生成个位数为“9”的两位数
For j = 1 To i - 1
If ② Then f = True
Next j
If f Then c = c - 1
Next i
'原始数据在文本框Text1中显示。代码略
End Sub
Private Sub Command1_Click()
Dim i As Integer, j As Integer, k As Integer, m As Integer
Dim cnt As Integer,t As String, s As String
d(0) = 100
cnt = Val(Text2.Text)
If cnt > c Then
Text3.Text = "输入筛选的个数太大,请重新输入!"
Exit Sub 'Exit Sub表示退出过程
End If
For i = 1 To cnt
k = i
For j = i + 1 To n
If d(j) < d(i - 1) And (
) Then k = j
Next j
If k <> i Then
t = d(i): d(i) = d(k): d(k) = t
End If
Next i
For i = 1 To cnt
s = s + Str(d(i)) + ","
Next i
Text3.Text = ③
End Sub
① ② ③
•第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
变化段:数组中相邻两个元素构成一个变化段。变化段有上升段(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 Form_Load()
'读取数据,并存储到数组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
ElseIf 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
Dim d(1 to 5)as integer,i as integer
Dim flag as Boolean,j as integer
‘给数组元素d(1)至d(5)赋初值为1,代码略
Randomize
For i=1 to 5
J = 1:flag = True
d(i) = int(Rnd*9)
Do while j< =i-1 and flag = True
d(i) = int(Rnd*5+1)
If d(i) = d(j) then i=i-2:flag = False
j = j+1
Loop
Next i
运行程序后,数组中的数据值可能是( )
For i=1 To 10
f=i Mod 2
If f=0 Then a(i)=0 Else a(i)=1
For j=1 To i
If f=0 Then a(i)=a(i)+j Else a(i)=a(i)*j
Next j
Next i
执行该程序段后,数组元素a(4)的值为( )
以下VB程序在a数组中保存了下一个要报数的人的编号,即若。(w)=p,则表示当第w个人报过数2后,下一个要报数的是第p号。程序在列表框Listl中输出了依次出圈的人的编号,在标签Label1中输出了最后剩下的人的编号。请完善程序。
Private Sub Command1_Click( )
Dim i As Integer, n As Integer, w As Integer, num As Integer
Dim a(1 To 100)As Integer, t As Integer
n=Val(Text1.Text)
For i=1 To n-1
a(i)=i+1
Next i
a(n)=1
w=n ‘变量w表示当前检查的是第w号数组元素,即从第n号开始检查
t=0 ‘变量t用以模拟报数
Do While ①
num=a(w) ‘当前报数的人的编号
t=t+1
If t=3 Then
List1.AddItem Str(num)
a(w)= ②
t=0
Else
③
End If
Loop
Label1.Caption=Str(w)
End Sub
以上程序段运行时,为了实现上述功能,画线处应填入的代码分别为:①;②;③。
Dim a(1 To 6) As String
For i = 6 To 2 Step -1
k = i
For j = 1 To i - 1
If a(j) > a(k) Then k = j
Next j
If k <> i Then
End If
Next i
已知数组元素a(1)~a(6)的值依次为“35”,“12”,“35”,“110”,“47”,“123”,下列说法不正确的是( )