您现在的位置: 中国男护士网 >> 考试频道 >> 计算机等级 >> 二级辅导 >> VB >> 辅导 >> 正文    
  “三步逐过程法”解二级VB上机考试改错题 【注册男护士专用博客】          

“三步逐过程法”解二级VB上机考试改错题

www.nanhushi.com     佚名   不详 

一、改错题解法现状 
    许多同学为了掌握解决改错题的技巧和方法,一方面着重熟练VB集成开发环境中调试工具的使用,另一方面归纳总结了近几年来二级考试改错题中涉及到的错误类型。这些对于提高应试能力无疑是有帮助的。但是在实际考试中,他们也发现,解答改错题的方法沦为逐一去猜测错误类型,然后按模式来套解。毫无疑问,这一解法效率慢,正确率不高,而且即便正确解答出来,也有一种侥幸的感觉。之所以如此,根本的原因在于没有抓住具体题目算法逻辑特征这一主线,因而单纯的总结错误类型的意义也就不大了。

    为此,我们可以采用一种比较完善的改错题解法——“三步逐过程法”。
    二、“三步逐过程法”解法说明
    “三步逐过程法”核心是把握题目算法逻辑特征,按照“从整体到部分,再由部分到整体”的思路排查错误,调试程序,具体步骤可分为三步:
    步骤一:把握题意,泛读程序,分析程序组成和各过程的功能;
    步骤二:从通用过程入手, 逐过程输入并逐过程调试;
    步骤三:输入并调试事件过程,完成对各通用过程调用和组装。
    下面,我们结合一道改错题来具体说明每个步骤中的方法和技巧。 
    三、“三步逐过程法”解改错题举例

    以江苏省二级VB上机考试中的一道考题为例。

    已知下面程序的功能是找出2000以内这样的正整数N: 它的不同值的因子(包括1和N在内)之和是一个素数。 例如: 16: 1+2+4+8+16=31(下图为程序正确执行时的画面)。


含有错误的源程序如下:
    Option Explicit
    Option Base 1
    Private Sub Command1_Click()
    Dim I As Integer, K As Integer, Sum As Integer
    Sum = 0
    For I = 2 To 2000
    Call Fctor(I, Sum)
    If Prime(Sum) Then
    K = K + 1

    Text1 = Text1.Text & Str(I) & "  "
    If K Mod 5 = 0 Then Text1 = Text1 & Chr(13) & Chr(10)
    End If
    Next I
    End Sub
    Private Sub Fctor(N As Integer, S As Integer)
    Dim I As Integer, J As Integer
    Do While I < N
    If N Mod I = 0 Then
    S = S + I
    End If
    I = I + 1
    Loop
    End Sub
    Private Function Prime(N As Integer) As Boolean
    Dim m As Integer
    For m = 2 To Sqr(N)
    If N Mod m = 0 Then Exit Sub
    Next m
    Prime = True
    End Function

“三步逐过程法”解题步骤:

    步骤一:把握题意,泛读程序,分析程序组成和各过程的功能;

    显然,该程序的组成如下图所示:

那么,我们如何分析出各个过程的功能呢?
    核心技巧是从输出语句着手, 逆向推导, 分析各变量的含义, 进而根据过程的输入参数及其输出或者反馈, 分析出此过程的功能。

    1.     标记出输出语句
    输出语句有两句:
    (1)、Text1 = Text1.Text & Str(I) & "  "
    (2)、If K Mod 5 = 0 Then Text1 = Text1 & Chr(13) & Chr(10)
    2.     逆向推导,分析各变量的含义
    对于输出语句(1),显然是将符合条件的数I显示到文本框。而根据题意,符合条件的数必须满足:2000以内和因子和为素数两个条件,因此,我们从语句(1)逆向推导,我们知道I是由2到2000的循环变量,并且只有满足Prime(Sum)为True的才能显示到文本框,因此,我们知道Sum应该是I的因子和;对于输出语句(2),后半句的功能是为了实现回车和换行,结合K Mod 5=0以及逆向找出的K=K+1,我们知道,K的功能是为了控制输出按照每5个换行进行。
    3.     分析过程功能
    对于语句Call Fctor(I,Sum),由于此时的I为2到2000的循环变量,Sum为I的因子和,因此我们可以判定Fctor的功能是求I的因子和,并将该和赋给Sum变量;根据Prime(Sum),我们可以判定Prime的功能是对Sum值进行是否是素数的判定,如果是,则返回True,否则返回False.
    步骤二: 从通用过程入手, 逐过程输入并逐过程调试。
    核心技巧是将通用过程输入后, 根据步骤一中分析出的各过程的功能,用含有具体参数值的过程调用语句来调试过程, 即: 给定确定的输入, 看有无准确的输出或者反馈。

那么如何构造含有具体参数值的过程调用语句呢?

    对于Function过程,由于有输入参数和返回值,因此比较好构造调用调试语句。譬如,对于Prime过程,由步骤一中我们已经知道其作用是用于判断输入参数是否为素数,如果为素数则返回True,否则返回False.因此我们可以构造:

    Print Prime(7);Prime(10)

    为此,我们只要在窗体上放置一个按钮Command1,在Command1_Click中输入Print Prime(7);Prime(10)即可,若输出为“True  False”,则该过程正确。如此操作,调试结果为:


由此,我们将Exit Sub修改为Exit Function,运行正确。 
    对于Sub过程,其没有返回值,因此该过程的反馈信息将可以通过两种方式得到,一种是直接在Sub中使用输出语句显示运行结果;一种是利用按地址传递的参数将反馈信息由被改变的实参带出。对于Fctor(N,S)过程,根据步骤一,知其功能是,求N的因子和并由S带出。为此,首先,我们根据给定的可以设定N为16.

    1.       输入Prime过程, 用print prime(7),prime(10)来调试;
    2.       输入fctor过程, 用
    dim s as integer
    call fctor(16,s)
    print s
    来调试。
    步骤三: 对于事件过程, 若代码较长, 则逐程序块输入并调试(程序块通常以循环来区分)
    核心技巧: 在事件过程中, 将完成对通用过程的调用组装, 因此特别留意以下三点:
    循环:注意循环变量的初值、终值和步长以及累积量的初值。
    数组:元素从0开始还是从1开始。
    过程:注意参数传递(Byval、 ByRef),返回值类型,调用形式,具体的说包括:
    1.       实参与形参类型是否一致。
    2.       参数传递方法(ByVal与ByRef)是否正确
    3.       循环调用时, 同一变量调用前后值有无干涉,具体体现在: 前值没有清空遗留在后值中或者动态数组元素未清空等, 此时错误表现在: 清空语句放置位置不对。
    四、总结:
    1.       思维过程是微观到宏观
    体现在: 由题意及变量含义推断过程作用; 逐过程输入调试后再进行事件工程中的调用和组装;
    2.       在调试通用过程时, 应用了数学中的特殊值法;
    3.       在组装事件过程时, 应用了工程中的经验法。

 

文章录入:杜斌    责任编辑:杜斌 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     

    联 系 信 息
    QQ:88236621
    电话:15853773350
    E-Mail:malenurse@163.com
    免费发布招聘信息
    做中国最专业男护士门户网站
    最 新 热 门
    最 新 推 荐
    相 关 文 章
    没有相关文章
    专 题 栏 目

      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)                            【进男护士社区逛逛】
    姓 名:
    * 游客填写  ·注册用户 ·忘记密码
    主 页:

    评 分:
    1分 2分 3分 4分 5分
    评论内容:
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。