zoukankan      html  css  js  c++  java
  • 常见错误和难点分析

    轉自:http://wwww.hyit.edu.cn/edu/vb/study/index.htm

    常见错误和难点分析

    1.在选择结构中缺少配对的结束语句

    对多行式的If块语句中,应有配对的End If语句结束。否则,在运行时系统会显示" If没有End If"的编译错误。同样对Select Case语句也应有与其相对应的End Select语句。

    2.多边选择ElseIf关键字的书写和条件表达式的表示

    多边选择ElseIf子句的关键字ElseIf之间不能写有空格,即不能写成Else If

    在多个条件表达式的表示时,应从最小或最大的条件依次表示,以避免条件的过滤。例如,已知输入某课程的百分制成绩mark,要求显示对应五级制的讦定,评定条件如下:

     有以下几种表示方式,语法上都没有错,但执行后结果有所不同,请分析哪些正确? 哪些错误?

    下面给出的答案中,方法一、二、五正确,其余错误,请分析各自的原因。

    方法一:

    方法二:

    方法三:

    方法四:

             方法五:

    If mark>=90Then

             Print""

    ElseIf mark>=80Then

             Print""  

    ElseIf mark>=70Then

             Print""  

    ElseIfmark>-60Then

             Print"及格"

    Else

             Print"及格"

    End If

    If mark<60Then

    Print"不及格"

    ElseIf mark<70Then

             Print"及格"

    ElseIf mark<80Then

             Print""  

    ElseIf mark<90Then

             Print""  

    Else

             Print""

    End If

    If mark>=60Then

             Print"及格"

    ElseIf mark>=70Then

             Print""

    Elselfmark>=80Then

             Print""

    Elselfmark>=90Then

             Print""

    Else

             Print"不及格"

    End If

    If mark>=90Then

             Print""  

    ElseIf  80<=mark<90 Then

             Print""

    ElseIf  70<=mark<80 Then

             Print""

    ElseIf  60<=mark<70 Then

             Print"及格"

    Else

             Print"不及格"    

    End If        

    If mark>=90Then

             Print""

    ElseIf 80<=mark And mark<90 Then

             Print""

    ElseIf 70<=mark And mark<80Then

             Print""

    ElseIf 60<=mark And mark<70Then

             Print"及格"

    Else

             Print"不及格"

    End If

    3Select Case语句的使用

    (1)    "表达式列表i" 中不能使用"变量或表达式"中出现的变量。

    例如,上述多边选择的例子改为Select Case语句实现,方法一Case子句中出现变量mark,运行时不管mark的值多少,始终执行Case Else子句,运行结果不正确;方法二、方法三正确。

    方法一:

    方法二:

    方法三:

    Select Case mark   

           Case mark>=90     

                  Print""

           Case mark>=80

                  Print""

           Casemark>=70      

                  Print""

           Case mark>=60

                  Print"及格"    

           Case Else

                  Print"不及格"

    End Select

    Select Case mark   

    Case Is>=90  

           Print""

    Casels>=80    

           Print""       

    Case Is>=70  

           Print""

    Case Is>=60  

           Prim"及格"    

    Case Else

           Print"不及格"

    End Select

    Select Case mark

    Case Is>=90

           Print""

    Case 80 To 89

    Print""

    Case 70 To 79

           Print""

    Case 60 TO 69

           Print"及格"

    Case Else

           Print"不及格"

    End Select

    (2)    "变量或表达式"中不能出现多个变量。

    实验三第5题对三门课程奖学金的判断,只能用If语句的多边选择,而不能用SelectCase语句实现。例如,有人用如下语句表示:

           Select Case marklmark2mark3

                  Case (markl+mark2+mark3)/3>=95

                         Print"一等奖"

           End Select

    这样就会在 "Select Case markl,mark2,mark3" 语句行出现编辑错误, 同时

    Case (markl+mark2 +mark3)/3>=95书写也错误。

    第四章  常见错误和难点分析

    1. 不循环或死循环的问题主要是循环条件、循环初值、循环终值、循环步长的设置有问题。

    例如,以下循环语句不执行循环体:

    For i=10 To 20 Step-1  ' 步长为负,初值必须大于等于终值,才能循环

    For i=20 To10  ' 步长为正,初值必须小于等于终值,才能循环

    Do While False  ' 循环条件永远不满足,不循环

    例如,以下循环语句死循环:

    For i=10 To 20 Step 0       ' 步长为零,死循环

    Do While 1  ' 循环条件永远满足,死循环

    2.循环结构中缺少配对的结束语句

    ForNext语句没有配对的Next语句;Do语句没有一个终结的Loop语句等。

    3.循环嵌套时,内外循环交叉

           For I=1 to 4

                  For j=1 to 5

                  …

                  Next i

           Next j

    上述循环的交叉运行时显示"无效的Next控制变量引用"

    4.累加、连乘时,存放累加、连乘结果的变量赋初值问题

    (1) 一重循环

    在一重循环中,存放累加、连乘结果的变量初值设置应在循环语句前

    例如,求11003的倍数和,结果放入Sum变量中,如下程序段,输出结果如何?应作如何改进?

           Private SubForm_Click()

                  For i=3 To 100 Step 3

                         Sum=0

                         Sum=Sum+i

                  Next i

                  Print Sum

           End Sub

    (2) 多重循环

    在多重循环中,存放累加、连乘结果的变量初值设置放在外循环语句前,还是内循环语句前,这要视具体问题分别对待

    例如,期末30位学生参加三门课程的考试,求每个学生的三门课程的平均成绩如下程序能否实现?

           aver=0

           For i=1 To 30

                  For j=1 To 3

                         m=InputBox("输入第"&j&"门课的成绩")

                         aver=aver+m

                  Next j

                  aver=aver/3

                  Print aver

           Next I

    第五章  常见错误和难点分析

    1Dim数组声明

    有时用户为了程序的通用性,声明数组的上界用变量来表示,如下程序段:

         n=InputBox("输入数组的上界")

         Dim a(1 To n) As Integer

    程序运行时将在Dim语句处显示"要求常数表达式"的出错信息。即Dim语句中声明的数组上,下界必须是常数,不能是变量。

    解决程序通用的问题,一是将数组声明的很大,这样浪费一些存储空间;二是利用动态数组,将上例改变如下:

        Dim a() As Integer

         n=InputBox ("输入数组的上界")

         ReDim a(1 To n)As Integer

    2.数组下标越界

    引用了不存在的数组元素,即下标比数组声明时的下标范围大或小即为越界。例如,要形成有如下30项的斐波那契数列:

    1,1,2,3,5,8,13,21,34,,317811514229832040

    正确的程序段如下:

    Dim a(1 To 30) As Long, i%

    若将For i=3 To 30改为For i=1 To 30,程序运行时会显示"下标越界"的出错信息,因为开始循环时i=l,执行到循环体语句a(i)=a(i-2)+a(i-1),数组下标i-2i-1均小于下界1

    同样若将上例:a(i)+a(i-2)+a(i-1) 语句改为:a(i+2)=a(i)+a(i+1)

    程序运行时也会显示"下标越界"的出错信息,这时是数组下标大于上界30

    3.数组维数错

    数组声明时的维数与引用数组元素时的维数不一致。例如,下程序段为形成和显示3×5的矩阵:

          Dim a(3,5) As Long

                  For i=1 To 3

                         For j=1 To 5

                                a(i)=i*j

                                Print a(i);"";

                         Next j

                  Print

           Next i

    程序运行到a(i)=i*j语句时出现"维数错误"的信息,因为在Dim声明时是二维数组,引用时的一个下标。

    4Aarry函数使用问题

    Aarry函数可方便地对数组整体赋值,但此时只能声明Variant的变量或仅由括号括起的动态数组。赋值后的数组大小由赋值的个数决定。

    例如,要将1234567这些值赋值给数组a,下表列出了三种错误及相应正确的赋值方法。

    Aarry函数表示方法

    错误的Aarry函数赋值,

    改正的Aarry函数赋值

    Dim a(1 To 8)  a=Array(1,2,3,4,5,6,7,8)

    Dim a( ) a=Array(1,2,3,4,5,6,7)

    Dim a As Integer  a=Array(1,2,3,4,5,6,7)

    Dim  aa=Array(1,2,3,4,5,6,7)

    Dim aa()=Array(1,2,3,4,5,6,7)     

    Dim  aa=Array(1,2,3,4,5,6,7)

    5.如何获得数组的上界、下界

     Aarry函数可方便地对数组整体赋值,但在程序中如何获得数组的-上界、下界,以保证访问的数组元素在合法的范围内,可使用UBoundLBound函数来决定数组访问。

    在上例中,若要打印a数组的各个值,可通过下面程序段实现:

    For i=Lbound(A) To Ubound(A)

              Print a(i)

    Next l

    6.给数组赋值

    VB6.0提供了可对数组整体赋值的新功能,方便了数组对数组的赋值操作。但真正使用不那么方便,有不少限制。数组赋值形式如下:数组名2=数组名1

    这里的数组名2,实际上在前面的数组声明时,只能声明为Varian的变量,赋值后的数组2的大小、维数、类型同数组名1;否则,若声明成动态或静态的数组,例如:

    Dim数组名2() Dim数组名2 (下标)

    程序在运行到上述赋值语句时显示"不能给数组赋值"的出错信息。


    第五章     

    5.1  知识要点

    1.数组的概念

    数组:存放具有相同性质的一组数据,也就是数组中的数据必须是同一个类型和性质。

    数组元素:数组中的某一个数据项。数组元素的使用同简单变量的使用。

    2.静态数组的声明

    静态数组:在声明时已确定了数组元素个数。

    声明形式Dim数组名([下界To]上界[[下界To]上界[,…]])As  类型

    此语句声明了数组名、数组维数、数组大小、数组类型。

    [注意] 下界、上界必须为常数,不能为表达式或变量:省略下界,默认为0,也可用Option Base语句重新设置下界的值。

    3.动态数组的声明

    声明形式 Dim数组名 ()

                ReDim  [Preserve]数组名([下界To]上界[[下界To]上界[,…]])

    [注意]

    此时的上界、下界可以是赋了值的变量或表达式。若有Preserve关键字,表示当改变原有数组最末尾的大小时,使用此关键字可以保持数组中原来的数据。

    4.控件数组

    即相同类型的控件组成的数组。

    控件数组的建立:在设计时的窗体上,通过对某控件的复制和粘贴操作:在程序运行时通过Load方法实现。

    控件数组元素:由控件的Index属性值表示数组的F标。

    5.数组的操作

    应掌握的基本操作有:数组初始化、数组输入、数组输出、求数组中的最大(最小)元素及下标、求和、平均值、排序和查找等。

    5.2  常见错误和难点分析

    1Dim数组声明

    有时用户为了程序的通用性,声明数组的上界用变量来表示,如下程序段:

         n=InputBox("输入数组的上界")

         Dim a(1 To n) As Integer

    程序运行时将在Dim语句处显示"要求常数表达式"的出错信息。即Dim语句中声明的数组上,下界必须是常数,不能是变量。

    解决程序通用的问题,一是将数组声明的很大,这样浪费一些存储空间;二是利用动态数组,将上例改变如下:

        Dim a() As Integer

         n=InputBox ("输入数组的上界")

         ReDim a(1 To n)As Integer

    2.数组下标越界

    引用了不存在的数组元素,即下标比数组声明时的下标范围大或小即为越界。例如,要形成有如下30项的斐波那契数列:

    1,1,2,3,5,8,13,21,34,,317811514229832040

    正确的程序段如下:

    Dim a(1 To 30) As Long, i%

    若将For i=3 To 30改为For i=1 To 30,程序运行时会显示"下标越界"的出错信息,因为开始循环时i=l,执行到循环体语句a(i)=a(i-2)+a(i-1),数组下标i-2i-1均小于下界1

    同样若将上例:a(i)+a(i-2)+a(i-1) 语句改为:a(i+2)=a(i)+a(i+1)

    程序运行时也会显示"下标越界"的出错信息,这时是数组下标大于上界30

    3.数组维数错

    数组声明时的维数与引用数组元素时的维数不一致。例如,下程序段为形成和显示3×5的矩阵:

          Dim a(3,5) As Long

                  For i=1 To 3

                         For j=1 To 5

                                a(i)=i*j

                                Print a(i);"";

                         Next j

                  Print

           Next i

    程序运行到a(i)=i*j语句时出现"维数错误"的信息,因为在Dim声明时是二维数组,引用时的一个下标。

    4Aarry函数使用问题

    Aarry函数可方便地对数组整体赋值,但此时只能声明Variant的变量或仅由括号括起的动态数组。赋值后的数组大小由赋值的个数决定。

    例如,要将1234567这些值赋值给数组a,下表列出了三种错误及相应正确的赋值方法。

    Aarry函数表示方法

    错误的Aarry函数赋值,

    改正的Aarry函数赋值

    Dim a(1 To 8)  a=Array(1,2,3,4,5,6,7,8)

    Dim a( ) a=Array(1,2,3,4,5,6,7)

    Dim a As Integer  a=Array(1,2,3,4,5,6,7)

    Dim  aa=Array(1,2,3,4,5,6,7)

    Dim aa()=Array(1,2,3,4,5,6,7)     

    Dim  aa=Array(1,2,3,4,5,6,7)

    5.如何获得数组的上界、下界

     Aarry函数可方便地对数组整体赋值,但在程序中如何获得数组的-上界、下界,以保证访问的数组元素在合法的范围内,可使用UBoundLBound函数来决定数组访问。

    在上例中,若要打印a数组的各个值,可通过下面程序段实现:

    For i=Lbound(A) To Ubound(A)

              Print a(i)

    Next l

    6.给数组赋值

    VB6.0提供了可对数组整体赋值的新功能,方便了数组对数组的赋值操作。但真正使用不那么方便,有不少限制。数组赋值形式如下:数组名2=数组名1

    这里的数组名2,实际上在前面的数组声明时,只能声明为Varian的变量,赋值后的数组2的大小、维数、类型同数组名1;否则,若声明成动态或静态的数组,例如:

    Dim数组名2() Dim数组名2 (下标)

    程序在运行到上述赋值语句时显示"不能给数组赋值"的出错信息。

    申明

    非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!

    博文欢迎转载,但请给出原文连接。

  • 相关阅读:
    HTML<head></head>中标签的含义
    axios发送post请求node服务器无法通过req.body获取参数
    Vue下URL地址栏参数改变却不能刷新界面
    Vue中img标签src属性绑定
    vue-cli 初始化项目时开发环境中的跨域问题
    【CODEVS2152】滑雪
    【NOIP2005】过河
    【CODEVS2776】寻找代表元
    【CodeVS1231】最优布线问题
    【CODEVS1073】家族
  • 原文地址:https://www.cnblogs.com/Athrun/p/970098.html
Copyright © 2011-2022 走看看