解析算法及程序实现 知识点题库

自定义函数f的功能是计算自然数n的阶乘值,即f=n!。下面VB程序通过调用函数来计算S=1!+2!+3!+4!+5!+6!:

Function f(n as integer) as long

    Dim j As Integer

    f=1

    For j=1 to n

   f=f*j

    Next j

End Function

 Private Sub Command1_Click()

  Dim s As Long, AS Integer

  S=0

  For i=1 to 6

  Next i

  Text1.text=str(s)

 End Sub

方框中正确的语句是  (   )

A . s=f(i) B . s=s+f(i) C . s=f(n) D . s=s+f(n)
【加试题】数据的有损压缩:对多媒体数据进行有损压缩时,通常是以少量数据丢失作为代价的,比如对某8 bit量化的数据压缩为6bit量化,其算法可简单表示为:逐一删除各个字节的后2 bit,将删除除后的6 bit数据首尾相连,然后重新按照8bit一组构建字节,以十六进制显示。

例如,压缩前的原始数据为:

1111 1100 0101 1010 1011 0000  可表示为十六进制:FC 5A B0

  删除每字节的后2 bit:

1111 1100 0101 1010 1011 0000

  首尾相连构建新的数据:

11 1111 0101 1010 1100 表示为十六进制:... F5 AC

 自此,原数据进行了有损压缩。程序运行界面如下所示:

实现上述算法的VB程序如下,但程序中加框处有误,请改正。

Dim a(1 To 100) As Integer

Const code = "0123456789ABCDEF"

Const n = 100

Private Sub FormLoad()‘ 以随机数模拟读取原始数据

  s = ""

  Randomize

  For i = 1 To n

  a(i) = Int(Rnd * 16)

    Text1.Text = Text1.Text +  ①

  Next i

End Sub

Private Sub Command1Click()

For i = 1 To n

   t = t + HtoB(a(i))

Next i

For j = 1 To n * 4 Step 8'每8位一组,取前6个字符

   s = s + Mid(t, j, 6)

Next j

For i = 1 To 4 * (n - 1) Step 4'每4位一组转为十六进制显示

    Text2.Text = Text2.Text + BtoH(Mid(s, i, 4))

Next i

End Sub

Function HtoB(x As Integer) As String'十六进制转为二进制函数

 t = ""

 m = 0

Do While   ②

   r = x Mod 2

   m = m + 1

   t = Trim(r) + t'trim()用于删除前导空格

   x = x \ 2

 Loop

 HtoB = Mid("0000", 1, 4 - m) + t

End Function

Function BtoH(y As String) As String'二进制转为十六进制函数

 t1 = Val(Mid(y, 4, 1))

 t2 = Val(Mid(y, 3, 1))

 t3 = Val(Mid(y, 2, 1))

 t4 = Val(Mid(y, 1, 1))

 s = t1 + t2 * 2 + t3 * 4 + t4 * 8

 BtoH = Mid(code, s + 1, 1)

End Function
①  ② 

编写VB程序,实现如下功能:在文本框Text1中输入整数n(1≤n≤10),单击“生成矩阵”按钮Command1,生成n2个10到99之间(包含10和99)的随机整数,并以n行、n列矩阵的形式显示在列表框List1中,再单击“对角线”按钮Command2,则在标签Label1中输出该矩阵对角线(左上角到右下角)上的数值,运行界面如图所示,程序代码如下。
  1. (1) 要使文本框Text1上显示的默认文本由“8”改为“10”,可在其属性窗口中将属性的属性值改为“10”。

  2. (2) 为了实现上述功能,请在划线处填入合适的代码。

    Const MAXNUM = 100

    Dim i As Integer, n As Integer

    Dim a(1 To MAXNUM ^ 2) As Integer

    Private Sub Command1_Click()

      Dim line As String

      n = Val(Text1.Text)

      line = ""

    List1.Clear

      Randomize

      For i = 1  To  n ^ 2

        a(i) =            ①         

        If i > 1 And i Mod n = 1 Then

           List1.AddItem line

           line = Str(a(i))

        Else

           line =        ②         

        End If

      Next i

      List1.AddItem line

    End Sub

    Private Sub Command2_Click()

      Label1.Caption = ""

    For i = 1  to     ③    

         Label1.Caption = Label1.Caption & Str(a(i + (i - 1) * n))

      Next i

    End Sub

     ② ③ 

【加试题】有一组正整数,要求对其中的数据进行排列, 排列后奇数在前, 偶数在后。其中最后一个数据排到奇数与偶数交接处;自前到后的第一个偶数排到最后一个位置,空出的位置排列自后向前的第一个奇数,依此类推。排序示例如下。

实现上述功能的 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

 ⑵

【加试题】异或的数学符号为“⊕”,其运算法则相当于不带进位的二进制加法:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(即符号两侧数值相同时,计算结果为0;数值不同时为1)。

如果要对两个十进制数进行异或运算,可以按以下步骤进行:

①   先将要进行异或运算的两个十进制数分别转换为二进制;

②   对两个二进制数按位进行异或运算;例:(101101)2⊕(111)2=(101010)2

③   再把步骤②中的运算结果转换为十进制,该十进制数即为运算结果。

小明编写了一个VB程序来模拟上述运算过程,程序功能如下:在文本框Text1和Text2中分别输入要参加异或运算的十进制数,单击计算按钮Command1,程序对输入的两个数进行异或运算,并将运算结果显示在文本框Text3中,程序运行界面如图所示。

  1. (1) 通过以上关于异或运算的描述,可知10⊕6的结果是
  2. (2) 实现上述功能的VB程序如下。请在划线处填入合适的代码。

    Private Sub Command1_Click()

      Dim a As Integer, b As Integer, c As Integer

      Dim a1 As String, b1 As String

      Dim lena1 As Integer, lenb1 As Integer, i As Integer

      Dim result As String

      a = Val(Text1.Text)

      b = Val(Text2.Text)

      If a > b Then

        c = a: a = b: b = c

      End If

      result = ""

      a1 = DtoB(a): b1 = DtoB(b)

      lena1 = Len(a1): lenb1 = Len(b1)

      i = 1

      Do While i <= lena1

        If Mid(a1, lena1 - i + 1, 1) = Mid(b1, lenb1 - i + 1, 1) Then

          result = "0" + result

        Else

          result = "1" + result

        End If

        i = i + 1

      Loop

      result =

      Text3.Text = BtoD(result)

    End Sub

    Public Function DtoB(x As Integer) As String

      Dim remainder As String

      DtoB = ""

      Do While x > 0

        remainder = CStr(x Mod 2)   '如:CStr(3 Mod 2)的值为"1"

        DtoB = remainder + DtoB

          

      Loop

    End Function

    Public Function BtoD(x As String) As Integer

      Dim i As Integer

      BtoD = 0

      For i = 1 To Len(x)

        BtoD =+ Val(Mid(x, i, 1))

      Next i

    End Function

条形码是按照一定编码规则排列的图形标识符。如图所示,条形码下方数字左边12位代表信息,最右边一位是校验码。校验码产生方法如下:

①把条形码下方数字从右往左依次编序号为“1,2,3,4……”;

②从序号2开始把所有偶数序号位上的数相加求和,并乘以3;

③从序号3开始把所有奇数序号上的数相加求和;

④把第②和第③步结果相加求和;

⑤10减去第④步结果的个位数,得出校验码(如果差值为10,则校验码为0);

如条形码的数字为:977167121601X(X为校验码),则校验码主要产生步骤如下:

1)   (1+6+2+7+1+7)×3=72

2)   0+1+1+6+7+9=24

3)   72+24=96

4)   10-6=4

所以最后校验码X=4,此条形码数字为9771671216014。

小何为此编写了VB程序,用以验证条形码输入正确与否。程序运行时,从文本框Text1获取条形码数字部分,单击按钮Command1后,在标签Label1中输出结果。实现上述功能的VB代码如下,请补全代码。

Private Sub Command1_Click()

Dim i As Integer, b As String, Lb As Integer

Dim s1 As Integer, s2 As Integer, tmp As Integer

Dim c As String

Dim d(1 To 13) As Integer     '存储数据

Dim res As String             '存储结果

  b = Text1.Text              '输入条形码

  Lb = Len(b)

  s1 = 0 : s2 = 0

  flag = True

  res = "输入错误!"

  listt1.Clear

  If  Lb = 13 Then

    For i = 1 To 13

      c = Mid(b, Lb - i + 1, 1)

      If c >= "0" And c <= "9" Then

                '输入转换

      Else

        flag = False : Exit For

      End If

    Next i

    If flag Then

      For i = 2 To Lb Step 2

        s1 =  s1 + d(i)                 '参数计算1

        s2 =         '参数计算2    

Next i

tmp = s1 * 3 + s2

If   Then res = "输入正确!" 

    End If

  End If

  Label1.Caption = res

End Sub

编写VB程序,实现如下功能:在文本框Text1中输入投资金额,Text2中输入投资的目标金额,Text3中输入投资的年收益率,单击按钮Command1,在文本框Text4中输出达成预期投资目标至少需要的年数。投资收益按复利计算,如投资金额10000元,年收益率为5%,则1年后的本息为10000×(1+5%),2年后的本息为10000×(1+5%)2。程序运行界面如图所示。
  1. (1) 代码“Private Sub Command1_Click()”中的Command1_Click()是(填字母:A .对象名/B .事件名/C .事件处理过程名/D .方法名)
  2. (2) 为实现上述功能,请在划线处填入合适的代码。

    Private Sub Command1_Click()

      Dim pv As Single, fv As Single, rate As Single, n As Integer

    pv = Val(Text1.Text)

    fv = Val(Text2.Text)

      n = 1

      Do While pv<fv

    pv = pv * (1 + rate)

        List1.AddItem "第" + Str(n) + "年" + "  " + Str(pv) + "元"

       

      Loop

    End Sub

“字符洗牌”程序模拟扑克洗牌的操作,为了打乱牌序,把手上的扑克牌中间抽一部分放到最上面,完成一次洗牌(如字符串“1234ABCD”,若把中间的第3个到第5字母抽出并保持原来的顺序放到最前面,则一次洗牌操作后字符串变成“34A12BCD”),也可以把扑克牌分成上下两部分,把下面的部分放置到上面(如字符串“1234ABCD”,把第3个字符到最后一个字符移到前面,变成“34ABCD12”),多次重复做这个动作,就能达到洗牌的目的,效果如图所示。

  1. (1) 若要把窗体的标题名称由“Form1” 改为“字符洗牌”,应改变窗体的属性。
  2. (2) 完成上述功能的程序代码如下,请在划线处填入合适的代码

    Private Sub Command1_Click()

        Dim r As Integer, k1 As Integer, k2 As Integer, r As Integer

        Dim s As String, n As Integer

                           '从文本框TxtIn中获取字符串

        Randomize

        r = Int(Rnd() * 10) + 1   '随机生成洗牌次数

        n = Len(s)

        Do While r >= 1        '洗牌操作

            k1 = Int(Rnd() * (n - 2)) + 2

            k2 = Int(Rnd() * (n - k1 + 1)) + k1

            s =   + Mid(s, 1, k1 - 1) + Mid(s, k2 + 1, n - k2)  

            r = r - 1

        Loop

            '输出结果

    End Sub

  3. (3) 若加框处的语句改为TxtOut.Text = Str(s),则运行程序时会发生的错误消息为_________
    A . B . C . D .
在VB的算术运算中,最大的实数类型double有效位数也只有15位。为了实现除法运算保留任意位数,小明根据除法原理,编写了如下程序,功能如下:在文本框Text1中输入被除数(正整数),在文本框Text2中输入除数(正整数),在文本框Text3中输入小数位数,单击按钮Command1,在标签 Label 中显示除法运算的商。程序运行界面如图所示,但加框处代码有错,请改正:

Private Sub Command1_Click

Dim x, y As Integer

Dim n As Integer

Dim s As String

x = Val(Text1.Text): y = Val(Text2.Text)

n = Val(Text3.Text)

s = s + Str(x \ y)

s = s + "."

k = x Mod y

For i = 1 To n

    ‘①

    ‘②

k = x Mod y

Next i

Label1.Caption = "商为: " + s

End Sub

 ② 

现要求编写VB程序实现如下功能:在文本框Text1中输入正整数n(n为奇数),单击 “生成”命令按钮后,如下图所示,在文本框 Text2 中会显示一个有规律的对称数字串,形 式为“1 3 …… n-2 n n-2 3 1”。例如n=9时,显示的数字串为“1 3 5 7 9 7 5 3 2 1”。

  1. (1) 根据代码可知,命令按钮“生成”的对象名是
  2. (2) 实现上述功能的VB程序如下。请在划线处填入合适代码。

    Private Sub C1_Click()

    Dim n as integer, i as integer Dim s as string

    n =

    s = ""

    For i = 1 To n

    If i <= n \ 2 + 1 Then

    Else

    s = s +    End If

    Next i Text2.Text = s End Sub

  3. (3) 当 n=9 时,在实现程序功能的情况下,如果将程序中加框处的代码换成“Str(2 * i - 1)+s”,单击“生成”按钮,其输出结果为
【加试题】贝尔三角矩阵是以数学家埃里克·坦普尔·贝尔(Eric Temple Bell)命名的,是组合数学中的一组整数数列。右边表格是5阶贝尔三角矩阵。

采用以下方法可以建构一个贝尔三角矩阵(见图):

A.第一行第一项是1。

B.对于n>1,第n行第一项等同第n-1行最后一项。

C.对于m,n>1,第n行第m项等于它左边和左上方的两个数之和。

小明编写了一个生成贝尔在角矩阵的程序,其功能如下:

程序运行时在文本框Text1中输入整数n(1≤n≤9),单击按钮Command1后,在列表框List1上输出n阶的贝尔三角矩阵。

  1. (1) 当n=6时,第6行第2项的数为
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适代码。

    Private Sub Command1_Click()

    Dim n As Integer, s As String, i As Integer, j  As Integer

    Dim bell(1 To 100) As Integer

      

    bell(1) = 1

    List1.AddItem gs(bell(1))

    For i = 2 To n

          For j = i To 2 Step -1

              bell(j) = bell(j - 1)

          Next j

          bell(1) = bell(i)

          For j = 2 To i

           

          Next j

          s = gs(bell(1))

           For j = 2 To i

              s = s + gs(bell(j))

          Next j

          List1.AddItem s

    Next i

    End Sub

    Function gs(x As Integer) As String      '将x转换为字符串,若不足5位,则用空格补足

    Dim i As Integer

      

    For i = 1 To 5 - Len(Str(x))

          gs = gs + " "

    Next i

    End Function

计算梯形面积的算法描述如下:

①输入上底a、下底b和高h

②计算梯形面积s(计算公式为:s=(a+b)*h/2)

③输出结果

④结束

上述算法属于(  )

A . 解析算法 B . 排序算法 C . 递归算法 D . 枚举算法
若参与运算的数范围大大超出了标准数据类型能表示的范围的运算,就要用到高精度算法。小明编写了如下的高精度乘法程序,文本框Text 1和Text 2中分别输入两个乘数,单击命令按钮Command 1,在文本框Text 3中输出两个数的乘积, 运行界面如图所示。

  1. (1) 请在划线处填入合适的代码。

    Private SubCommand1_Click()

    Dim a( 1 To 100) As Integer, b( 1 To 100) As Integer, c( 1 To 1000) As Integer

    Dim t As Integer, k As Integer, i As Integer, jAs Integer

    Dims1As String, s2As String, output As String

    s 1=Text 1.Text:s2=Text2.Text:Text3.Text=“”

    For i=1 To Len(s1)

        a(i)=  ①     ‘将文本框Text 1中的自然数按从低位到高位的顺序依次存放在数组a(1),a(2) ……a(len(s1))中

    Next i

    ‘将文本框Text2中的自然数按从低位到高位的顺序依次存放在数组b(1),b(2) …… b(len(s2))中,代码略

        len c=Len(s1) +Len(s2) -1

        For i=1 To Len(s1)

            For j=1 To Len(s2)

              c(i+j-1)=c(i+j-1)+a(i)*b(j)

           c(i+j)=  ② 

           c(i+j-1) =c(i+j-1) Mod 10

        Next j

      Next i

      If c(len c+1) > 0 Then   ③ 

      Do While c(len c) =0Andlenc> 1 (2)

           len c=len c-1

      Loop

      output=“”

      For i=len c To 1 Step-1

          output=output+Mid(Str(c(i)),2,1)

      Next i

      Text 3.Text=output

    End Sub

  2. (2) 若将方框内代码“And len c>1”删除,在文本框Text 1中输入122134,在文本框Text 2中输入0,单击命令按钮Command 1,则程序提示
20项的和。(最后结果四舍五入精确到0.01)

注:请书写VB代码,画流程图不得分。

算法设计与程序实现。

某市出租车收费标准如下:

⑴3公里内(含3公里),收费8元;

⑵超过3公里但未超过6公里部分,按1.5元/公里收费;

⑶超过6公里部分,按2.25元/公里收费。

根据以上标准,输入出租车行驶的公里数,请计算顾客需付费多少元?

【参考代码】

Dim s As Single

Dim p As Single 

s=Val(InputBox(“s=”))  

If s<=3 Then

    p=8

End If

If             Then

    p=1.5*(s-3)+8

End If

If s>6 Then

    p=2.25*(s-6)+1.5*3+8

End If

Print p

根据上述回答下列问题:

  1. (1) 本题采用的算法是(填写:解析法/查找法/枚举法/排序法)。
  2. (2) 程序代码中空白处应填写的条件是            
    A . 3<s≦6   B . 3 ≦s≦6 C . s>3 And s<=6  D . s>3 Or s<=6
算法设计与程序实现。

某省2016年的GDP是6.7万亿元,如果每年按7%的比例增长,问多少年以后此省的GDP超过15万亿?

【算法分析】

假设n 年后此省的GDP超过15万亿元,根据题意得出数学关系式?求最小的n。

【参考程序】

Dim p As Single      ‘p用于记录GDP的值

Dim r As Single     ‘r用于记录GDP的年增长比例

Dim n As Integer    ‘n用于统计年数

p=6.7

r=0.07

n=0

  Do While             

    p=p*(1+r)

    n=n+1

  Loop

Print n & ”年后,GDP的值超过15万亿元。”

根据上述回答下列问题:

  1. (1) 本题采用的算法是(填写:解析法/枚举法/排序法/递归法)。
  2. (2) 写出程序中空白处表达式
下面Python程序的功能是实现人民币兑换美元的换算,结果保留两位小数,并对第三位小数进行四舍五入。

rmb=float(input(输入人民币数量:))

fx=float(input(输入汇率:))

usd=      

print(usd)

下列选项中适合填入程序划线处并能实现程序功能的语句是(     )

A . Int(mb/fx*100+0.5)/10 B . Int(rmb/ fx*100+0.5)/ 100 C . Int(rmb/ fx*1000)/1000 D . Int(rmb*fx* 100+0.5)/100
寻找受潮药瓶:现有5瓶药,每瓶中有20粒药丸,每粒药丸重10克,其中有几瓶药受潮了,受潮的每粒药丸重11克,如何用天平只称一次找出受潮的那几瓶药?解决此问题的方法:将5瓶药编号为1~5号,从中分别取出1、2、4、8、16粒药丸进行称重。在不受潮时应是(1+2+4+8+16)×10=310(克)。假如称出的重量是315克,那么超出的重量是5克,说明有5粒超重,(5)<sub>10</sub>=(00101)<sub>2</sub>,因此受潮的是第1瓶和第3瓶。编写程序模拟此过程,程序运行时,单击“模拟”按钮Command1,在文本框Text1中输出超重克数,在列表框List1中输出药瓶编号,运行界面如图所示。实现上述功能的VB程序如下。

Private Sub Commandl_Click( )

Dim s As Integer, cz As Integer            'cz存储超重克数

Dim k As Integer

'依次从1~5号瓶中取出1、2、4、8、16粒药,并计算总重量,存储在变量s中,代码略

cz=s-310

Text1.Text=    ①    

k=0

Do While cz<>0

k=k+1

If    ②     Then List 1.Addltem"第"+Str(k)+"瓶"

cz=cz\2

Loop

End Sub

  1. (1) 代码 List1.AddItem 中的 AddItem 是(单选,填字母:A .属性名/B .方法名/C .事件名)
  2. (2) 请在划线处填入合适代码。

  3. (3) 假如超重为 10 克,则受潮的药瓶编号是(填数字,若有多瓶,用“,”隔开)。
分析完善程序。

假设银行的年存储利率为3%,如果现在存储10000元钱,问多少年后连本带利超过12000元。设定:连本带利=本金*(1+利率)∧年数

假设n年后连本带息超过12000,根据题意得出数学关系式:10000*(1+3%)∧n>12000,求最小的n。

(参考程序)

Dim s as single

Dim r as single

Dim n as integer

s=10000

r=0.03

n=0

Do while            

    n=n+1

    s=s*(1+r)

Loop

Print n;“年后”:“连本带利超过”;s

根据上述回答下列问题:

  1. (1) 本题采用的算法是(填写:解析法/穷举法/排序法/递归法)
  2. (2) 写出参考程序中空白处表达式
以下适合用解析法解决的问题是(      )。
A . 计算出租车费 B . 求符合要求的三位正整数的“水仙花数” C . 将10个评委的打分按由大到小的顺序排序 D . 找出一筐乒乓球质量不符合标准的球
最近更新