VB新手入门之二

lt;数字类型变量>,值为1的返回值,值为2的返回值…)

Switch(<条件表达式1>,条件表达式1为True时的值

[,<条件表达式2>,条件表达式2为True时的值…])

3.3 常见错误和难点分析

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

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

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

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

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

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

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

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

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

If mark>=90Then If mark<60Then If mark>=60Then

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

ElseIf mark>=80Then ElseIf mark<70Then ElseIf mark>=70Then

Print"良" Print"及格" Print"中"

ElseIf mark>=70Then ElseIf mark<80Then Elselfmark>=80Then

Print"中" Print"中" Print"良"

ElseIfmark>-60Then ElseIf mark<90Then Elselfmark>=90Then

Print"及格" Print"良" Print"优"

Else Else Else

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

End If End If End If

方法四: 方法五:

If mark>=90Then If mark>=90Then

Print"优" Print"优"

ElseIf80<=mark<90Then ElseIf80<=mark And mark<90 Then

Print"良" Print"良"

ElseIf70<=mark<80Then ElseIf70<=mark And mark<80Then

Print"中" Print"中"

ElseIf60<=mark<70Then ElseIf60<=mark And mark<70Then

Print"及格" Print"及格"

Else Else

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

End If End 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 80To 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"及格" Prim"及格" 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书写也错误。

第四章 循环结构

4.1 知识要点

1.For … Next循环结构形式和使用

For<循环变量>=<初值>To<终值>[Step<步长>]

<循环体>

Next<循环变量>

常用于已知循环次数的场合。步长可正可负,可为整数,也可为实数。掌握循环次数的计算: ,当循环变量(步长为正)大于终值,循环终止。

例如,程序段都是以每100显示sin的值:

(1)Fori=0 To 360 Stepl0 (2)For x=0To 6.28 Step 6.28/36

Print sin(i*3.14/180) Print sin(x)

NextiNextx

(3)For j=360 To 0 Step-10

Print sin((360-j)*3.14/180)

Next j

2.Do…Loop循环结构形式和使用

根据不同组合,有5种形式:

1)无条件循环 2)当条件为真循环 3)当条件为真不循环 4)先循环再判断 5)先循环再判断

Do Do While<条件> Do Until<条件> Do Do

<循环体> <循环体> <循环体> <循环体> <循环体>

Loop Loop Loop Loop While<条件> LoopUntil<条件>

3.循环的嵌套及注意事项

循环体内又出现循环结构称循环的嵌套或多重循环。计算多重循环的循环次数由每一重循环次数的乘积。

外循体内要完整地包含内循环结构,不能交叉。

4.其他辅助语句

Eixt For退出For循环语句、Exit Do退出Do循环、GoTo五条件转向语句、End程序运行结束语句、With语句。

4.3 常见错误和难点分析

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

第五章 数 组

5.1 知识要点

1.数组的概念

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

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

2.静态数组的声明

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

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

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

[注意]

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

3.动态数组的声明

声明形式: Dim数组名 ()

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

[注意]

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

4.控件数组

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

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

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

5.数组的操作

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

5.3 常见错误和难点分析

1.Dim数组声明

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

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

Dim a(1 To n)As Integer

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

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

Dima()As Integer

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

ReDim a(1 To n)As Integer

2.数组下标越界

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

1,1,2,3,5,8,13,21,34,…,317811,514229,832040

正确的程序段如下:

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

若将For i=3To 30改为For i=1 To 30,程序运行时会显示"下标越界"的出错信息,因为开始循环时i=l,执行到循环体语句a(i)=a(i-2)+a(i-1),数组下标i-2、i-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声明时是二维数组,引用时的一个下标。

4.Aarry函数使用问题

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

例如,要将1,2,3,4,5,6,7这些值赋值给数组a,表2.5.1列出了三种错误及相应正确的赋值方法。

表2.5.1 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 Integera=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函数可方便地对数组整体赋值,但在程序中如何获得数组的-上界、下界,以保证访问的数组元素在合法的范围内,可使用UBound和LBound函数来决定数组访问。

在上例中,若要打印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 (下标)

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

所以,为了程序的安全、可靠,建议读者还是忍痛割爱,少用VB6.0的这一新功能,使用传统的循环结构来给数组赋值。基于此原因,我们也就在教程中不作展开。

第六章 过 程

6.1 知识要点

1.过程的概念

VB的程序是由一个个过程构成的,除了VB系统提供了大量使用的内部函数过程和事件过程外,VB系统还允许用户根据各自需要自定义过程。使用过程的好处:使程序简练、高效、便于程序的调试和维护。本节涉及的过程主要指的是用户自定义的子过程和函数过程。

2.两类过程定义与调用

(1)子过程

定义形式:Sub<子过程名>[(形参表)]

End Sub

特点:子过程名无值,无类型。

调用形式:Call<子过程名>[(实参表)]

或:<子过程名>[(实参表)]

特点:是一句独立的语句。

(2)函数过程

形式:Function<函数过程名>([形参表])

<函数过程名>=<表达式>

End Sub

特点:函数过程名有值、有类型,在过程体内至少赋值一次。

调用形式:<函数过程名> ([实参表])

特点:不能独立存在,必须参加表达式的运算。

3.参数传递

(1)传值方式是将实参的具体值传递给形参。

传值方式是形参前加ByVal关键字,表示值传递。这种传递方式是一种单向的数据传递,即调用时只能由实参将值传递给形参;调用结束不能由形参将操作结果返回给实参。实参可以是常数或表达式。

(2)传地址

传地址方式(ByRet)是将实参在内存的地址传递给形参,也就是实参、形参共用内存内的"地址"。

这种传递方式是一种双向的数据传递,即调用时实参将值传递给形参:调用结束由形参将操作结果返回给实参。当实参要得到返回的结果时,实参只能是变量,不能是常数或表达式。

在过程中具体用传值还是传地址,主要考虑的因素是:若要从过程调用中通过形参返回结果,则要用传地址方式;否则应使用传值方式,减少过程间的相互关联,便于程序的调试。数组、记录类型变量、对象变量只能用地址传递方式。

在VB中,默认是传地址方式。

4.变量的作用域

全局变量:Public关键字开头的变量为全局变量,在整个工程中都有效。

窗体、模块级变量:在通用声明段用Dim或Private关键字声明的变量,在该窗体或模块内有效。

局部变量:在过程中声明的变量,在该过程调用时分配内存空间并初始化,过程调用结束,回收分配的空间。

使用规则见表2.6.1所示。

表2.6.1 变量的作用域

使用范围 局部变量 窗体/模块级变量 全局变量

窗体 标准模块

声时方式 Dim, tatic Dim,Private

声明位置 在过程中 窗体/模块的通用声明段 窗体/模块的通用声明段

能被本模块的其他过程存取 不能 能 能

能被其他模块存取 不能 不能 能,但在变量名前加窗体名 能

静态变量:局部变量声明前加Static关键字,在程序运行的过程中始终保值。

5.过程的递归调用

在调用一个子过程或函数过程中又调用自己,称为递归调用,这样的子过程或函数过程称为递归子过程或递归函数,简化称为递归过程。

构成递归过程的条件:递归结束条件及结束时的值:能用递归形式表示,并且递归向终止条件发展。

6.常用算法

对数值计算方面要求掌握:求最大值(最小值)及下标位置、求和、平均值、最大公约数、最小公倍数、素数、数制转换、高次方程求根(迭代法、二分法)、定积分(矩形法、梯形法、辛卜生法、蒙特卡洛法)。

非数值计算:常用字符串处理函数、排序(选择法、冒泡法、插入法、合并排序)、查找(顺序、二分法)。

6.3 常见错误和难点分析

1.程序设计算法问题

该章程序编写难度较大,主要是算法的构思有困难,这也是程序设计中最难学习的阶段。经验告诉每一位程序设计的初学者,没有捷径可走,多看、多练、知难而进。上机前一定要先编写好程序,仔细分析、检查,才能提高上机调试的效率。每当一个程序通过艰苦的努力调试通过时,那苦尽甘来的喜悦令你一言难尽。

2.确定自定义的过程是子过程还是函数过程

实际上过程是一个具有某种功能的独立程序单位,供多次调用。子过程与函数过程的区别是前者子过程名无值:后者函数过程名有值。若过程有一个返回值,则习惯使用函数过程;若过程无返回值,则使用子过程:若过程返回多个值,一般使用子过程,通过实参与形参的结合带回结果,当然也可通过函数过程名带回一个,其余结果通过实参与形参的结合带回。

3。过程中形参的个数和传递方式的确定

对初学者,在定义过程时不能确定形参的个数和传递方式。

过程中参数的作用是实现过程与调用者的数据通信。一方面,调用者为子过程或函数过程提供初值,这是通过实参传递给形参实现的:另一方面,子过程或函数过程将结果传递给调用者,这是通过地址传递方式实现的。因此,决定形参的个数就是由上述两方面决定的。对初学者,往往喜欢把过程体中用到的所有变量命作为形参,这样就增加了调用者的负担和出错概率:也有的初学者全部省略了形参,则无法实现数据的传递,既不能从调用者得到初值,也无法将计算结果传递给调用者。

VB中形参与实参的结合有传值和传地址两种方式。区别如下:

(1)在定义形式上前者在形参前加即Val关键字。

(2)在作用上值传递只能从外界向过程传入初值,但不能将结果传出:而地址传递既可传入又可传出。

(3)如果实参是数组、自定义类型、对象变量等,形参只能是地址传递。

4.实参与形参类型对应问题

在地址传递方式时,调用过程实参与形参类型要一致。 

相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页