试题

试题 试卷

logo

题型:综合题 题类:真题 难易度:困难

浙江省普通高等学校招生2021年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

举一反三
字符串删除与插入:给定一个长度不超过100位的字符串S,现有以下两种操作指令:

指令1(删除):给出一个字符串S1,在字符串S中找到最左边的一个字符串S1,将其删除,若在S中不存在字符串S1,则字符串S不变。

例如:S=“China is a big family,it is big”   S1=“big”

      则执行指令1后,S=“China is a family,it is big”

      若S1=“small”,则S不变。

指令2(插入):给出一个字符串S2,和一个整数w,将S2插入到S中以w开始的位置。

例如:S=“a big family”   S2=“very ”   w=3

     则执行指令2后,S=“a very big family”

     注意S中“a”后有一个空格,S2中“y”后有一个空格

实现上述功能的VB程序如下。请在划线处填入合适代码。

Dim S As String

Private Sub Command1_Click()   ’单击Command1实现删除指令

Dim S1 As String

S = Text1.Text

S1 = Text2. Text

S = del(S1)

Text5.Text = S

End Sub

Private Sub Command2_Click()   ’单击Command2实现插入指令

Dim S2 As String, W As Integer

S = Text1.Text

S2 = Text2.Text

W = Val(Text4.Text)

S = {#blank#}1{#/blank#}      ’调用函数,实现插入指令

Text5.Text = S

End Sub

Function del(S1 As String) As String   ’在字符串S中查找并删除S1

Dim S3 As String

For i = 1 To Len(S) - Len(S1) + 1

  S3 = ""                    ’S3表示从位置i开始,取出长度和S1相同的字符串

  For j = i To i + Len(S1) - 1

    S3 = S3 + Mid(S, j, 1)

  Next j

  If {#blank#}2{#/blank#} Then     ’如果找到S1,则将S1删除

S = Mid(S, 1, i - 1) + Mid(S, i + Len(S1), Len(S) - Len(S1) - i+ 2)

del = S

    Exit Function     ’删除左边的第一个S1后,退出函数,以保证只删除一次

  End If

Next i

End Function

Function add(S2 As String, W As Integer) As String

  S =  Mid(S, 1, W - 1) + S2 + {#blank#}3{#/blank#}   ’将S2插入W开始的位置

  add = S

End Function

二叉树是每个结点最多有两个子树的树结构,如值为9的结点有两个子树6和8,值为6的结点有两个子树5和3。若设二叉树的深度为h,则除第h层外,其它各层(1~h-1)的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树。现要构造大根堆,堆是一棵顺序存储的完全二叉树,大根堆又是一种特殊的堆,它的特征是每个双亲结点的值都不小于其孩子结点的值。如下图所示,值为9的结点是6和8的双亲结点,而6和8分别是9的左孩子和右孩子;同理,6是5和3的双亲结点,而5和3分别是6的左孩子和右孩子……

假如我们用数组表示上述大根堆:

a(1)

a(2)

a(3)

a(4)

a(5)

a(6)

a(7)

a(8)

a(9)

9

6

8

5

3

4

7

2

1

现有一算法把一个无序数组改造成大根堆。例如:我们在上图的大根堆中再增加一个值为8的新元素,如下图所示。

数组存储为:

a(2)

a(3)

a(4)

a(5)

a(6)

a(7)

a(8)

a(9)

a(10)

6

8

5

3

4

7

2

1

8

具体操作方法如下:

第一步:因为a(10)大于它的双亲结点a(5),故需交换a(10)和a(5)的值;

数组存储为:

第二步:因为a(5)大于它的双亲结点a(2),故需交换a(5)和a(2)(t)值;

数组存储为:

a(1)

a(2)

a(3)

a(4)

a(5)

a(6)

a(7)

a(8)

a(9)

a(10)

9

8

8

5

6

4

7

2

1

3

第3步:因为a(2)不大于它的双亲结点a(1),故无需做交换操作。此时新元素已经放到了正确的位置,新的大根堆构造完成,上移行动结束。

返回首页

试题篮