c语言结构体初值问题,[转载]大一 “VB简单的程序设计”常见错误汇总(1)

“VB简单的程序设计”常见错误汇总

一、“VB简单的程序设计”常见错误

1.2 常见错误和难点分析

1.标点符号错误

在VB中只允许使用西文标点,任何中文标点符号在程序编译时产生"无效字符"错误,在该行以红色字显示。用户在进入VB后不要使用中文标点符号。中、西文状态下标点符号对照见下表所示。

中、西状态下标点符号对照

西文状态

,

.

'

"

;

_

<

中文状态

'

"

——

2.字母和数字形状相似

L的小写字母"1"和数字"l"形式几乎相同、O的小写字母"。"与数字"0"也难以区,这在输入代码时要十分注意,避免单独作为变量名使用。

3.对象名称(Name)属性写错

在窗体上创建的每个控件都有默认的名称,用于在程序中唯一地标识该控件对象。系统为每个创建的对象提供了默认的对象名,例如,Text1、Text2、Command1、Label1等。用户可以将属性窗口的(名称)属性改为自己所指定的可读性好的名称,如txtInput、txtOutput、

cmdOk等。对初学者,由于程序较简单、控件对象使用较少,还是用默认的控件名较方便。

当程序中的对象名写错时,系统显示"要求对象"的信息,并对出错的语句以黄色背景显示。用户可以在代码窗口的"对象列表"框检查该窗体所使用的对象。

4.Name属性和Caption属性混淆

Name属性的值用于在程序中唯一地标识该控件对象,在窗体上不可见;而Caption属性的值是在窗体上显示的内容。

5.对象的属性名、方法名写错

当程序中对象的属性名、方法名写错时,VB系统会显示"方法或数据成员未找到"的信息。在编写程序代码时,尽量使用自动列出成员功能,即当用户在输入控件对象名和句点后,系统自动列出该控件对象在运行模式下可用的属性和方法,用户按空格键或双击鼠标即可,这样既可减少输入也可防止此类错误出现。

6.变量名写错

用Dim声明的变量名,在后面的使用中表示同一变量而写错了变量名,VB编译时就认为是两个不同的变量。例如,下面程序段求1~100的和,结果放在Sum变量中:

Dim sum As Integer,i As Integer

Sum=0

For i =1 to

100

Sum=Sun+i

Next i

Print Sum

显示的结果为100。原因是累加和表达式Sum=Sun+i中的右边的变量名Sum写成Sun。VB对变量声明有两种方式,可以用变量声明语句显式声明,也可以用隐式声明,即不声明直接使用。上述变量名的写错,系统为两个不同的变量各自分配内存单元,造成计算结果不正确。因此,为防止此类错误产生,必须对变量声明采用限制其为显式声明方式,也就是在通用声明段加Option

Explicit语句。

7.语句书写位置错

在VB中,除了在"通用声明"段利用Dim等对变量声明语句外,其他任何语句都应在事件过程中,否则运行时会显示"无效外部过程"的信息。若要对模块级变量进行初始化工作,则一般放在Form

Load()事件过程中。

8.无意形成控件数组

若要在窗体上创建多个命令按钮,有些读者会先创建一个命令按钮控件,然后利用对该控件进行复制、粘贴,这时系统显示:“已经有一个控件为"Command1"。创建一个控件数组吗?”的信息,若单击"是"按钮,则系统创建了名称为Command1的控件数组。若要对该控件的

Click事件过程编程,系统显示的框架是:

Private Sub Command1_Click(Index As Integer)

End Sub

Index表示控件数组的下标。

若非控件数组,Click事件过程的框架是:

Private Sub Command1_Click()

End Sub

请注意直到学习第四章数组前,一律不使用控件数组。

9.Print方法中定位问题

定位通过Tab、Spc函数和最后的逗号、分号和无符号来控制。VB中通过Print方法中各参数的综合使用达到所需的结果,但初学者往往难以掌握。

(1) Tab(n)与Spc(n)的区别

Tab(n)从最左第1列开始算起定位于第n列,若当前打印位置已超过n列,则定位于下一行的第n列,这是常常定位不好出现的问题。在格式定位中,Tab用得最多。

Spc(n)从前一打印位置起空n个空格。例如,下面程序段显示了Tab与Spc的区别,效果如图所示。

Private Sub Commandl_Click()

Print "1234567890”,

Print

Tab(1);"**"';Tab(2);"%%%";spc(2);"$$$$"

End Sub

(2)

紧凑格式";"分号的使用

紧凑格式";",即输出项之间无间隔。但对于数值型,输出项之间系统自动空一列,而由于数值系统自动加符号位,因此,大于零的数值,实际空两列。对于字符型之间无空格。

例如,下面程序段,效果如图所示。

Private Sub Command1_Click()

Print 1;-2;3

Print"1234";"5678"

Print"A";"B";"C";"D","E","F"

End Sub

从该例应区分数值和字符在紧凑格式输出的差异。

10.打开工程时找不到对应的文件

一般,一个再简单的应用程序也应由一个工程.vbp文件和一个窗体.frm文件组成。工程文件记录该工程内的所有文件(窗体.frm文件、标准模块.bas文件、类模块.cls文件等)的名称和所存放在磁盘上的路径。

若在上机结束后,把文件复制到软盘上保存,但又少复制了某个文件,下次打开工程时就会显示"文件未找到"。也有在VB环境外,利用Windows资源管理器或DOS命令将窗体文件等改名,而工程文件内记录的还是原来的文件名,这样也会造成打开工程时显示"文件未找到"。

解决此问题的方法:一是修改.vbp工程文件中的有关文件名:二是通过"工程"菜单的"添加窗体"中的"现存"选项,将改名后的窗体加入工程。

二、表达式

1.书写规则

(1)运算符不能相邻。例a+-b是错误的。

(2)乘号不能省略。例x 乘以y

应写成:x*y

(3)括号必须成对出现,均使用圆括号。

(4)表达式从左到右在同一基准上书写,无高低、大小。

2. 不同数据类型的转换

运算结果的数据类型向精度高的数据类型靠.

Integer< P>

3.逻辑表达式书写错,在VB没有造成语法错而形成逻辑错

例:数学表达式 3≤x<10 VB表达式为 3<=x<10

问题在于VB中的逻辑量与数值量可互转

4.同时给多个变量赋值,在VB没有造成语法错而形成逻辑错

例 Dim x%,y%,z%

x=y=z=1

5. 标准函数名写错

6.变量名写错

检查方法:在通用声明段加Option Explicit

7.语句书写位置错

在通用声明段只能有Dim语句,不能有赋值等其他语句

1.逻辑表达式书写错,在VB没有造成语法错而形成逻辑错

例如,要将数学上表示变量x在一定数值范围内如3≤x<10,以VB的逻辑表达式表示,有的读者写成的VB表达式为:

3<=x<10

此时在其他语言中将产生语法错,而在VB中不产生语法错,程序能运行,但不管x的值为多少,表达式的值永远为True,这造成程序能正常运行的假象,其结果是不正确的。

因为在VB中,当两个不同类型的变量或常量参加运算时,有自动向精度高的类型转换的功能。例如,逻辑常量True转换为数值型的值为-1,False为0;反之数值型非0转换为逻辑型的值为True,0为False。同样数字字符与数值运算,转换为数值型。

例如,语句Print

True+3 '显示的结果是2

Print

"123"+100 '显示的结果是223

Print#5/1/2000#+3 '显示的结果是00-5-4

根据此原因,表达式:

3<=x <10

(1)

(2)

值的计算过程是:首先根据x的值计算3<=x,结果总为True或False;然后该值(-1或0)与10比较永远为True。正确的VB表达式书写为:

3<=x And x<10

2.同时给多个变量赋值,在VB没有造成语法错而形成逻辑错

例如,要同时给x,y,z三个整型变量赋初值1,有的读者写成如下赋值语句:

x=y=z=1

在C语言中,上述语句是可以实现同时对多个变量赋值,而在VB中规定一句赋值语句内只能给一个变量赋值,但上述语句并没有产生语法错,运行后x,y,z中的结果均为0。

原因是VB将y=z=1作为一个表达式,再将表达式的结果赋值给x。在VB中默认数值型变量的初值为0,根据上面错误1的分析类推,因此表达式y=z=l的结果为0,所以x赋得的值为0、y、z变量的值为默认值o。

3.标准函数名写错

VB提供了很多标准函数,如IsNumeric()、Date()、LeR()等。当函数名写错时,如将

IsNumeric写成IsNummeric,系统显示"子程序或函数未定义",并将该写错的函数名选中提醒用户修改。

[提示]

如何判断函数名、控件名、属性、方法等是否写错,最方便的方法是当该语句写完后,按

Enter键,系统把被识别的上述名称自动转换成规定的首字母大写形式,否则为错误的名称。

4.数据合法性检查中引起程序的死循环

在数据输入时,经常需要对输入的数据作合法性检查,以确保程序运行的正确性。如在实验::第1题中,对输入的温度要求是数字,否则删除原输入的内容,焦点仍定位于文本柜。有关属性设置见下表,界面如图2所示,程序段如下。

表2 控件有关属性

有关控件名

TabIndex

Text1

2

Text2

3

Command1

4

Command1

5

Private Sub Text1_LostFocus()

If

Not IsNumeric(Text1)Then

Text1=""

Text1.SetFocus

End If

EndSub

Private Sub Text2_LostFocus()

If

Not IsNumeric(Text2)Then

Text2=""

Text2.SetFocus

End

If

End Sub

当华氏温度(Text1)输入错时,焦点在Text2处不停地闪动,程序产生死循环。

原因是当Textl输入结束按Tab键,激发Textl

LostFocus事件,焦点已到Text2;但当判断Textl文本框输入数据错时,执行Textl.SetFocus,使焦点从Text2拉回到Textl;而又激发Text2_LostFocus事件,此时并没有判断Text2文本框输入数据错,又执行

Text2.SetFocus,使焦点从Text1拉回到Text2,如此交错造成死循环。

而当摄氏温度(Text2)输入错时,程序正常运行。因为当Text2输入结束按Tab键,焦点已到Commanl,因此不会产生死循环。

解决Text1输入错时死循环的问题,只要把Private Sub

Text2_LostFocus()事件的If表达式If Not

IsNumeric(Text2)Then改为:IfText2<>""And

Not isNumeric(Text2)Then即可。

5.如何终止死循环

当编写程序时考虑不周到,产生死循环(尤其使用第四章介绍的循环结构)时,只要同时按Ctrl+Break键就町终止死循环,找出死循环的原因,修改程序。

6.声明局部变量和窗体级变量的问题

在VB程序中,除了大量的控件对象外,还要使用一些变量,暂时存放一些中间结果。这些变量的声明可以放在过程外的"通用声明"段(称为窗体级变量),也可以放在过程中(称为局部变量),怎样安置这些变量,初学者觉得有点头疼。两者区别:窗体级变量在本窗体的所有过程中均可使用:而局部变量仅在变量所在的过程中可使用,也即随着本过程的执行而分配存储空间,当执行到EndSub语句,分配的内存空间回收,变量的值也丢失。

具体对实验二第2题来说,在方法一中窗体内有四个过程,共同要用到三个变量a,b,c,因此这些变量的声明应在"通用声明"段,否则Click事件过程中a,b,c变量的值为零。在方法二中只有一个事件过程,变量a,b,c作为过程级变量声明,当然声明与窗体级变量效果相同。

方法一: 方法二:

Dim

ag,b#,c# Private

Sub Form_Click()

Private Sub

Textl_LostFocus() Dima#,b#,c#

… '对变量a赋值 … '用到变量a,b,c

EndSub EndSub

Private Sub Text2_LostFocus()

… '对变量b赋值

EndSub

Private Sub Text3_LostFocus()

… '对变量c赋值

EndSub

Private Sub Command1_Click()

… '用到变量a,b,c

EndSub

7.在Form

Load事件中,SetFocus方法不起作用

原因同Print方法,因为系统在窗体装入内存时无法同步地用SetFocus方法定位控件的焦点。解决的方法在属性窗口对要定位焦点的控件将其Tablndex值设置为。就可。

8.程序运行时对多个文本框间焦点移动的问题

方法-:按"Tab"键。这时可不必编程,直接利用系统提供的功能方便地在各控件之间移动。若要确定离开或进入了哪个控件,则利用"控件LostFocus''或"控件_GotFocus''事件进行判断。

方法二:按"回车"键。这时必须通过KeyPress事件编程宋实现,有关程序段如下:

Private Sub某文本框_KeyPress(KeyAscii As

Integer)

If KeyAscii=13 Then

另一控件.SetFocus

End If

End Sub

三、选择结构/循环结构常见错误

1.选择结构语法错误

(1)块IF语句中如果有Else,必须单独作为一行;且End

If不可缺省;

(2)多条件选择ElseIf关键字的书写:

ElseIf 不要写成Else If;

(3)Select Case语句要与End

Select配对出现;

(4)Select Case

后不能出现多个变量;Case子句后不能出现变量及有关运算符;

(5)Select

Case结构中Case后面的表达式之一是:Is

,它是简单关系式,例如:

Private Sub Command1_Click()

x =

Val(InputBox("输入学生成绩"))

Select Case

x

Case Is <

60 ' 不能写成:Case x<60

Print "不及格"

Case Else

Print "及格"

End

Select

End Sub

以下语句也是错误的:

Select Case x1,x2,x3

Case

(x1+x2+x3)>=270

Print "优秀"

……

End Select

2.选择结构逻辑错误

VB程序的语法错误在编译过程中系统会给出提示信息。但是,如果存在逻辑错误系统就无能为力了,只能给出错误的结果,此时程序员很难找出错误所在。下面的例子是一个多条件表达式,例如,根据输入学生的百分制成绩,显示出五个不同的等级评定,评定条件如下:

以下程序段是正确的:

Private Sub Command1_Click()

Dim mark As Integer, grade As String

mark = InputBox("请输入学生的成绩:")

If mark >= 90 Then

grade =

"优"

ElseIf mark >= 80 Then

grade =

"良"

ElseIf mark >= 70 Then

grade =

"中"

ElseIf mark >= 60 Then

grade =

"及格"

Else

grade =

"不及格"

End If

Print grade

End Sub

如果将IF……End

IF之间的语句改为以下程序段结果就是错误的:

If mark >= 60 Then

grade =

"及格"

ElseIf mark >= 70 Then

grade =

"中"

ElseIf mark >= 80 Then

grade =

"良"

ElseIf mark >= 90 Then

grade =

"优"

Else

grade =

"不及格"

End If

以上语句除了输入小于60分的输出正确以外,其他只要输出大于或等于60分的都输出“及格”。这是因为只要遇到第一个满足条件的即不再往下进行判断。

另外还应该注意的是,Then后面不能写语句,必须换行。

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

对多行式的If块语句中,应有配对的End

If语句结束。否则,在运行时系统会显示"块

If没有End If"的编译错误。

同样对Select

Case语句也应有与其相对应的EndSelect语句。

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

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

If。

在多个条件表达式的表示时,应从最小或最大的条件依次表示,以避免条件的过滤。

3.Select Case语句的使用

(1)"表达式列表i"中不能使用"变量或表达式"中出现的变量。例如,上述多边选择的例子改为Select

Case语句实现,方法一Case子句中出现变量mark,运行时不管mark的值多少,始终执行Case

Else子句,运行结果不正确;方法二、方法三正确。

方法一: 方法二: 方法三:

Select Case mark Select Case

mark Select Case mark

Case

mark>=90 Case

Is>=90 Case

Is>=90

Print"优"

Print"优" Print"优"

Case

mark>=80 Casels>=80 Case 80 To 89

Print"良" Print"良" Print"良"

Casemark>=70 Case Is>=70 Case 70To 79

Print"中" Print"中" Print"中"

Case

mark>=60 Case Is>=60 Case 60TO 69

Print

"及格" Print "及格 Print"及格"

Case Else

Case

Else

Case

Else

Print"不及格" Print"不及格"

Print"不及格"

End

Select End

Select End Select

(2)在"变量或表达式"中不能出现多个变量。实验三第5题对三门课程奖学金的判断,只能用If语句的多边选择,而不能用SelectCase语句实现。例如,有些读者用如下语句表示:

Select Case markl,mark2,mark3

Case

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

Print"一等奖"

End Select

这样就会在"Select Case

markl,mark2,mark3"语句行出现编辑错误:同时Case(markl+mark2

+mark3)/3>=95书写也错误。

3.不循环或死循环问题

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

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

For i=1 To 10 Step

–2 '

步长为负,初值必须大于等于终值才能循环

For I=100 To

10 '

缺省步长默认为正1,初值必须小于等于初值才能循环

Do While

False ' 循环条件是逻辑常量False,不执行循环

Do While

0 ' 循环条件为0等同于False

例如,以下循环形成死循环:

For I=10 to 100 Step

0 ' 步长为0初值永远不会超过终值

Do While

True '

循环条件是逻辑常量True,永远满足循环条件

Do While

1 ' 循环条件为非零值等同于True

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

For循环缺少Next语句;Do语句缺少Loop,尤其是多重循环这类问题更应该注意。

5.多重循环语句内外循环交叉

For i=1 to

4 For i=1 to 4

For j=1 to

5 应改为: For j=1 to

5 或将Next后面的j和i均去掉;

?i+j; ?i+j;

Next

I Next

j 或将以下两行写成一行:Next i, j

Next

j Next i     Next后面的i,j不能缺且顺序不能错

6.计数、累加、连乘结果变量赋初值问题

计数一般的语句格式是:n=n+1的形式,每循环一次自动加1,而累加的一般格式是:s=s+x,每次将x的值累加到s中去。如果已经定义n、s为数值型变量,则默认初值为0,可以省略赋初值。而连乘的一般格式是:p=p*j,此时p应该赋初值1。例如,求10!的语句为:

p=1

for i=1 to 10

p=p*i

next I

如果是多重循环,存放累加、连乘结果的变量初值设置放在内、外循环的位置应视具体问题分别处理。

例如,以下程序段是求出30位同学三门课的平均成绩:

Private Sub Command1_Click()

For i = 1 To 30

aver =

0       ' 每换一位同学重新置0

For j = 1 To

3

m = InputBox("输入第" & j &

"门课的成绩:")

aver = aver + m

Next j

aver = aver

/ 3

Print "第"

& i &

"位同学的平均成绩是:", aver

Next

End Sub

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.循环结构中缺少配对的结束语句

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

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

For I=1 to

4

For j=1 to 5

Next

i

Next j

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

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

(1)一重循环

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

例如,求1~100的3的倍数和,结果放入Sum变量中,如下程序段,输出结果如何?

Private SubForm_Click()

Fori=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

Nexti

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值