admin 管理员组

文章数量: 1086019


2024年3月27日发(作者:学习java网站)

龙源期刊网

VB编程学习中若干典型错误的实例剖析

作者:李志辉

来源:《计算机光盘软件与应用》2013年第16期

摘 要:通过具体的程序实例剖析了VB初学者在编程过程中出现的若干典型错误,以期帮

助他们了解这些程序错误产生的原因,从而加深他们对相关VB编程知识的理解。文中的错误

程序示例也可供VB教师作为教学素材使用,为他们改进课程教学提供一定的参考依据。

关键词:Visual Basic;典型错误;实例剖析

中图分类号:TP312

《Visual Basic程序设计》(下文简称VB)是许多高校为非计算机专业学生开设的第一门

程序设计语言课程。由于VB课程本身理论性和实践性都比较强,加之学生初次接触程序设计

语言,缺乏相应的知识背景,在编程时难免会产生各种各样的错误。面对出错的程序,学生找

不出错误原因,不知如何处理,这极易使学生对VB编程产生畏难情绪,从而不利于课程的进

一步学习。基于此,本文针对笔者在VB教学实践中收集到的学生编程时出现的若干典型错误

以具体实例的方式进行了剖析,以期帮助他们了解这些程序错误产生的原因,从而加深他们对

相关VB编程知识的理解。

1 VB编程典型错误

1.1 误用“+”运算符

“+”运算符在VB中既可以用来计算和,也可以用来连接字符串。“+”作为字符串连接符来

使用,只有一种情况,就是“+”旁边的两个操作数的数据类型都是字符串型时,“+”旁边的操作

数只要有一个的数据类型是数值型,“+”就用来求和。学生初学VB时,容易受数学思维的影

响,因而经常出现误用“+”运算符的情况。

例如,要求编写程序“从键盘分别输入一个学生三门课的成绩,求他的总成绩”。有学生是

这么做的,先在窗体上绘制三个文本框,分别用来输入三门课的成绩,再绘制一个命令按钮,

然后编写如下程序:

Private Sub Command1_Click()

Dim mark As Single

mark = + +

Print "该学生的总成绩为:"; mark

龙源期刊网

End Sub

对于上面的程序,运行时要么出现“溢出”错误,要么得不到正确的结果,主要原因就是

“+”运算符的使用有错误。学生误认为“+”在这里是求和,实际上“+”在这里是做字符串的连

接,因为文本框的Text属性的数据类型是字符串型。因此使用“+”运算符时一定要特别注意,

如果指定“+”要用来求和,一定要确保“+”旁边的两个操作数的数据类型都是数值型(如果不是

数值型,应通过VB的相应类型转换函数将其转换为数值型,例如上面的程序就应使用Val函

数来完成转换);如果指定要做的是字符串连接,最好不要使用“+”,直接使用“&”运算符。

1.2 潜在的类型不匹配错误

对于赋值语句,赋值号“=”两边的数据类型一般要求应一致,如果两边的类型不同,VB的

处理方法是:以左边变量的数据类型为基准,如果右边表达式计算结果的数据类型能够转换成

左边变量的数据类型,则先由VB自动完成数据类型转换后,再赋值给左边的变量;如果不能

转换,就会出现类型不匹配的错误。学生初学VB时,在程序中很少有意识地去关注赋值号

“=”两边的数据类型是否一致,这使得程序可能隐含着潜在的错误,导致程序可靠性不高。

例如,要求编写程序“从键盘输入华氏温度,将其转换为对应的摄氏温度”,学生一般编程

如下:

Private Sub Command1_Click()

Dim f As Single, c As Single

f = InputBox("请输入华氏温度")

c = 5 * (f - 32) / 9

Print "c="; c

End Sub

对于上面的程序,在赋值语句“f = InputBox("请输入华氏温度")”中,“=”两边的数据类

型是不一致的,变量f是数值型,而InputBox函数返回值的数据类型是字符串型。学生测试程

序时,如果只是输入了数值(InputBox函数返回的实际上是数值型字符串),由于VB会自动

完成数据类型转换,程序可以得到正确的结果,类型不匹配的潜在错误不会暴露出来;但是如

果不慎输入的是一个非数值型的字符串,VB不能自动转换,这种错误就会显现,影响程序的

正常运行。为了避免这种错误的出现,最好由编程者自己通过程序转换的方式使赋值号“=”两

边的数据类型保持一致,一味寄希望于由VB自动进行数据类型转换是存在一定风险的。

龙源期刊网

同样地,对于关系运算符,两边操作数的数据类型最好也应保持一致。如果不一致,在某

些情况下VB通过自动类型转换可以将它们转换为同一数据类型后再比较(比如字符串和数值

比较,将字符串转换为数值再比较;逻辑型数据和数值比较,将True和False分别转换为-1、

0后再比较),遇上不能转换的情况,也会产生类型不匹配的错误,例如,执行语句Print

77>"teat"就会产生这类错误。

1.3 对多分支语句执行流程理解不透引发错误

VB中用来实现多分支结构的语句有If(采用If…Then…ElseIf…结构)语句和Select Case

语句。这两个语句的执行流程具有两个特点:(1)不管有多少个分支,只执行其中的一个分

支,执行这个分支后不再执行其他的分支,直接执行End If或End Select后面的语句;(2)

只有前面的分支条件不成立时,才会去判断后面的分支条件。学生初学VB时,由于对这个执

行流程特点的理解还不够透彻,在阅读和编写多分支结构程序时经常犯错误。

例如,给出下面的程序阅读题:程序运行后,如果在文本框Text1中输入10,然后单击命

令按钮,写出在Text2中显示的内容。

Private Sub Command1_Click()

n = Val()

Select Case n

Case 1 To 20: x = 10

Case 2, 4, 6: x = 20

Case Is < 10: x = 30

Case 10: x = 40

End Select

= x

End Sub

对于上面的程序阅读题,有相当一部分学生认为Text2中显示的内容应是40,他们给出的

理由是:程序中第1个和第4个Case后面的“测试值”都与Select Case后面n值相匹配,第4

个Case分支给变量x赋的值会取代第1个Case分支给变量x赋的值。学生这样理解显然是对

Select Case语句的执行流程特点认识不清所致。因为根据执行流程特点(1),第1个Case后

面的“测试值”匹配了,就会执行该Case分支相关联的语句,不会再去判断其他的分支,直接

龙源期刊网

执行End Select后面的语句;根据执行流程特点(2)如果要判断第4个Case分支,前面的3

个Case分支必须都是不匹配的。

再如,要求编写程序将学生的百分制成绩按要求转换成相应的等级(90~100转换为优

秀,80~89转换为良好,70~79转换为中等,60~69转换为及格,60分以下转换为不及

格),有学生编程如下:

Private Sub Command1_Click()

Dim Cj As Single, Dj As String

Cj = Val()

Select Case Cj

Case Is >= 60: Dj = "及格"

Case Is >= 70: Dj = "中等"

Case Is >= 80: Dj = "良好"

Case Is >= 90: Dj = "优秀"

Case Else: Dj = "不及格"

End Select

n = Dj

End Sub

上面的程序,虽然可以正常运行,但存在着逻辑错误。根据Select Case语句执行流程特点

(1),当输入98、88、78这些分数时,输出结果都是及格。如果学生完全理解了VB多分支

结构语句的执行流程,编完程序后按执行流程检验一下,是完全可以避免这类错误的。

1.4 错写Select Case语句中Case后面“测试值”的形式

Select Case语句中Case后面的“测试值”有三种不同的形式:(1)表达式1[,表达式

2]…;(2)表达式1To表达式2;(3)Is 。第1种形式看上去是一个表达式列表,实际上是

一个离散值的列表,因为是表达式列表中表达式的值与Select Case后面“测试表达式”的值进行

比较,只要Select Case后面“测试表达式”的值与表达式列表中的任何一个表达式的值相同,就

龙源期刊网

认为是匹配的;第2种和第3种形式实际上都是区间的表示形式,代表的是一系列连续的值,

比如Case 9 To 12表示的是区间[9,12],Case Is >= 9表示的是区间[9,+∞],Case Is

例如,要求编写程序将学生的百分制成绩按要求转换成相应的等级,有学生编写出如下程

序:

Private Sub Command1_Click()

Dim Cj As Single, Dj As String

Cj = Val()

Select Case Cj

Case Cj >= 90: Dj = "优秀"

Case Cj >= 80: Dj = "良好"

Case Cj >= 70: Dj = "中等"

Case Cj >= 60: Dj = "及格"

Case Else: Dj = "不及格"

End Select

n = Dj

End Sub

对于上面的程序,输入98、88、78、68这些分数时,输出结果都是不及格,程序出现逻

辑错误。在程序的各个Case分支中,本应采用Is关键字表示区间的Is被替换成变量名Cj,这

一替换使得Case后面的内容不再是表示区间,而成为一个关系表达式,对应的就是Case后面

的“测试值”的第1种表示形式。Case后面跟的是一个关系表达式,关系表达式的计算结果要么

是True,要么是False,与Select Case后面变量Cj的值是不可能相等的,因此Case Else前面

的分支都不匹配,从而执行Case Else分支关联的语句,输出不及格。

1.5 使用循环结构遍历查找数据时产生错误

使用循环结构查找某个数据在一个数据集中是否存在,是常见的编程问题。这类问题的解

决思路是将这个数据和数据集中的每个数据分别进行比较,如果发现相同的,就表示找到;如

果没有发现一个相同的,就表示没有找到。学生初学VB时,解决这类问题也经常出现错误。

龙源期刊网

例如,要求编写程序,用来实现下面的功能:当用户在组合框中输入一个新的项目后,单

击命令按钮时,如果输入的项在组合框的列表中不存在,则自动添加到组合框的列表中[1]。

有学生编程如下:

Private Sub Command1_Click()

Dim i As Integer

For i = 0 To unt - 1

If Trim() = (i) Then

MsgBox "输入项已在组合框中"

Else

m Trim()

MsgBox "已成功添加输入项"

End If

Next i

End Sub

对于上面的程序,假定组合框列表中原来有“北京、上海、天津、武汉”这4个选项,再输

入1个新项目“广州”,单击命令按钮后,“广州”就会在组合框的列表中被添加4次,显然程序

有错误,错误的原因是在循环结构中一旦发现新项目与组合框列表中某一个项目不同时就马上

去添加,这显然是不合理的。新项目“广州”是否添加到组合框的列表中,判断依据应是将新项

目与组合框列表中的项目逐一比较完之后,都没发现相同的,才可以添加;当然在循环的过程

中如果发现相同的,这时立刻就可以得出不添加的结论,新项目就没有必要再和组合框列表中

剩下的还没有比较的项目去比较了,循环就可以提前终止了。据此上面的程序可以修改如下:

Private Sub Command1_Click()

Dim i As Integer

For i = 0 To unt - 1

If Trim() = (i) Then

MsgBox "输入项已在组合框中"

龙源期刊网

Exit For

End If

Next i

If i > unt - 1 Then

m Trim()

MsgBox "已成功添加输入项"

End If

End Sub

2 结束语

以上总结的是学生初学VB编程时常见的一些典型错误,文中的错误程序示例不但可以供

VB初学者借鉴,以避免此类错误再在编程中出现,而且也可供VB教师作为教学素材使用,

为他们改进课程教学提供一定的参考依据。

参考文献:

[1]吴保荣.Visual Basic程序设计[M].北京:高等教育出版社.广州:中山大学出版社,2007.

作者简介:李志辉(1976-),男,湖北红安人,硕士,讲师,研究方向:信息系统、数

据库技术。


本文标签: 错误 程序 学生 数据