1. 某物品柜有5层,每层有10个格子,每个格子只能放一个物品。第1层格子编号依次为1到10,第2层格子编号依次为11到20,依此类推。有9组物品(组号1~9),每组有2到8个物品,物品总数不超过50个。将9组物品按组号由小到大依次放入柜中,放置方式有两种:

1)整体放置。按格子编号由小到大的次序查找第一个可放置该组全部物品的空区域(空区域是指从某个空格子开始的同层连续的所有空格子),若找到,则在该空区域居中、连续放置该组全部物品,如图a所示。

2) 零散放置。若所有空区域格子数都小于该组物品数,则将该组每个物品依次放置在当前编号最小的空格子中,如图b所示。

编写VB程序,模拟物品放置。运行程序,在列表框List1中显示每组物品的组号和数量,单击“放置”按钮Command1,在列表框List2中显示每组物品放置结果。程序运行界面如图c所示。

图c

(1) 若第1、第2组的物品数分别为6和2,则放置第2组物品的格子编号依次为
(2) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

Constm = 50     'm表示物品柜的格子数

Const w = 10    'w表示物品柜每层的格子数

Const n = 9    'n表示物品的组数

'f(i)存储第i个格子开始的同层连续的所有空格子数。f(i)为0表示第i个格子不是空格子

Dim f(m)As Integer

Dim a(n)As Integer

Private Sub Form_Load( )

'读取各组物品的个数依次存入数组a,并在List1中显示

'代码略

End Sub

Function getpos(r As Integer As Integer

'按格子编号从小到大的次序,查找空格子数≥r的第一个空区域

'若找到,返回该空区域的起始编号,否则返回 -1

'代码略

End Function

Private Sub Command1_Click( )

    Dim i As Integer,j As Integer, k As Integer,p As Integer,v As Integer

    Dim s As String

    For i = 1 To m

        f(i) = w -(i -1)Mod w     'w为10,表示每层的格子数

    Next i

    v = 1

    For i = 1 To n

    s = ""

    p =

    If p = - 1 Then

        j = 1

        Do While j < = a(i)

            If f(v) <> 0 Then

                s = s + Str(v)

                f(v)=

                j = j + 1

            End If

           

        Loop

    Else

        k =(f(p)- a(i)) \ 2

        For j = k To 1 Step - 1

            f(p) = j

            p = p + 1

        Next j

        For j =

            f(j) = 0

            s = s + Str(j)

        Next j

    End If

    List2. AddItem "第" + Str(i) + "组:" + s

    Next i

End Sub

【考点】
过程与自定义函数; 查找算法及程序实现;
【答案】

您现在未登录,无法查看试题答案与解析。 登录
综合题 困难
能力提升
换一批
1. (加试题)最大回文子串。回文字符串是具有回文特性的字符串:即该字符串从左向右读,与从右向左读都一样。如:凤落梧桐梧落凤,abcba等。“最大回文子串”是指一个字符串中长度最大的回文字符串,其基本算法思想如下:

⑴每个回文都有一个“中心”,当回文字符数为奇数时,中间的那个字符就是回文中心;但是当回文的字符数为偶数时,回文的中心是最中间的那两个字符,且这两个字符相同。

⑵对任意一个字符或者相同的两个连续字符,我们都可以假设它为回文的“中心”,向它的 左右两边扩展出尽可能长的回文。对于每种假设,我们都能得到一个回文,而最长回文必定由 其中的某个假设中得到!

现编写一个程序,在 Text1 中输入一串字符,单击“统计”按钮,在 Text2 中显示该字 符串中的最大的回文子串(长度相同时,输出最左边的子串)。请回答下列问题:

(1) 当 Text1 中输入“123321344332423112113123”时,则输出的结果为
(2) 请在划线处填入合适的代码。

Dim n As Integer

Dim a(0 To 100) As String Private Sub Command1( Click)() Dim s As String

Dim left As Integer, right As Integer, i As Integer

Dim max As Integer, m As Integer, b1 As Integer

'变量b1用于记录回文子串的左端起点

Text2.Text = ""

s = Text1.Text n = Len(s)

For i = 1 To n

a(i) = Mid(s, i, 1) Next i

max = 0: left = 0: right = 0

For i = 1 To n left = i

right = i

m = longest(left, right) If m > max Then

b1 = i - m \ 2 max = m

End If left = i

right = i + 1

If a(left) = a(right) Then

m = longest(left, right) + 1

If m > max Then

    ①   

max = m

End If

End If

Next i

For i = b1 To     ②   

Text2.Text = Text2.Text + a(i) Next i

End Sub

Function longest(left As Integer, right As Integer) As Integer

Dim p As Integer p = 1

Do While left > 1 And right < n And     ③   

left = left - 1 right = right + 1 p = p + 2

Loop

longest = p

End Function

 ② ③ 

综合题 普通
2. 有n个小组(编号1至n),每个小组有m个成员,每个成员都有一个大于等于0的得分。现要求按下列规则计算每个小组的成绩,并找出成绩最高的小组。

小组成绩的计算规则是:若小组成员中得分最高的前k人得分都不低于k,且其他成员得分都不超过k,则该小组成绩为k。例如,第1小组共有8个成员,得分依次为“5,2,7,11,8,6,5,1”,由此可知最高的前5人得分为“11,8,7,6,5”,其他3人得分为“5,2,1”,因此该小组成绩为5。

按上述要求,编写VB程序,功能如下:在列表框List1中显示各小组每个成员的得分,单击“计算”按钮Command1,在列表框List2中显示成绩最高的小组编号及成绩(如果有多个小组并列最高,则全部显示)。

(1) 若第2小组各成员得分依次为“0,4,12,1,5,9,3,9”,则该小组的成绩是
(2) 请在划线处填入合适的代码。

Const n = 6

Const m = 8

Dim a(n * m)As Integer

Dim c(m)As Integer,ans(n)As Integer

Private Sub Form_Load( )

    ‘读取n个小组每个成员的得分,按组别从小到大依次存入数组a,并显示在List1中

     ‘n(1)到a(m)存储第1小组m个成员的得分

     ‘a(m+1)到a(2*m)存储第2小组m个成员的得分

     ‘以此类推,代码略

End Sub

Private Sub Cummand1_Click( )

    Dim i As Integer,p As Integer,g As Integer,maxg As Integer

    maxg = -1

    For i = 1 To n

        g = GroupScore(i)

        If g > maxg Then

            maxg = g: p=1

           

        ElseIf g = maxg Then

            p=p+1

            ans(p)=i

        End If

    Next i

    For i = 1 To p

        List2. AddItcm“第”+Str(ans(i))+“组,成绩:”+Str(maxg)

    Next i

End Sulb

‘函数返回第w小组的成绩

Function GroupScone(w As Integer)As Integer

    Dim i As Integer,k As Inteser

    For i = 0 To m

        c(i)=0

    Next i

    For i=(w-1)*m+1 To w *m

        k=a(i)

        If k > m Then

        c(k)=c(k)+1

    Next i

    k=m

    Do White c(k)< k And k>0

        k=k-1

       

    Loop

    GroupScore=k

End Function

综合题 困难
3. 用VB编程求两个字符串的最长连续公共子串,程序功能如下:在文本框Text1和Text2中分别输入任意两个字符串s1和s2,单击命令按钮 Command1,在标签 Label3和Label4中分别输出这两个字符串的最长连续公共子串和子串的长度其算法思想:分别从字符串s1和s2的左边第一个字符开始检查,若发现这两个字符串中有一个字符相同,则以这个字符为基准向右边扩大搜索范围,先检查其后面的第一个字符是否相同,若还是相同则继续搜索,直到找到不同的字符为止。然后按照该方法依次继续往后搜索,直到查找结束。程序界面如图所示,请回答下列问题:

(1) 根据代码,若输入的s1为“Teacher”,s2为“teacher”,则最长连续公共子串为
(2) 实现上述功能的VB程序如下,请在划线处填入合适代码。

Dim s1 As String, s2 As string, maxstr As string

Dim len1 As Integer, len2 As Integer, maxlen As Integer

Function Min (a As Integer, b As Integer) As Integer

    If a >=b Then min = b else min = a

End Function

Function Search (m As Integer, n As Integer) As Integer

    Dim c As Integer

    c = 1

    Do While c<= Min (len1 -m, len2 - n)

        If Mid (s1, m+ c, 1) = Mid(s2,n+c,1) Then

            

        Else

            Exit Do 'Exit Do的作用是退出Do循环

        End if

    Loop

    Search = c -1

End function

Private Sub Command1_Click()

    s1 = Text1. Text

    s2 = Text2. Text

    len1 = Len (s1)

    len2 = Len (s2)

    maxlen = 0: maxstr = ""

    Dim i As Integer, j As Integer, k As Integer

    For i=1 To len1

        For j=1 To len2

            If Mid(s1, i, 1) = Mid(s2,j,1) Then

                k =  'k用于记录连续公共子串的长度

                If (k> maxlen) Then

                    maxlen = k

                    maxstr =

                End if

            End If

        Next j

    Next i

    Labe13. Caption= "最长连续公共子串为:"& maxstr

    Labe14. Cantion = "该子串长度是:"& str (maxlen)

End sub

综合题 困难