《《VisualBasic程序设计项目化教程》制作简易计算器.ppt》由会员分享,可在线阅读,更多相关《《VisualBasic程序设计项目化教程》制作简易计算器.ppt(55页珍藏版)》请在三一办公上搜索。
1、Visual Basic 程序设计项目化教程,主编 管小清 郭贺彬,项目四 制作简易计算器,项目目标:本项目利用控件数组来设计一个简易的计算器,能够实现加、减、乘、除四则运算;运算的数据可以包括整数和小数,同时对于除法运算还进行数据有效性的验证等。本项目主要用来学习VB中控件数组的画法,控件数组的各个控件的调用,控件数组的事件,Frame控件的使用,IF、Case控制语句的应用。,项目四 制作简易计算器,项目主要知识点:1.Frame控件的使用2.控件数组的使用画法编程3.控件的特殊属性 Alignment Tag4.VB中的运算符以及运算顺序 算术运算符 逻辑运算符 关系运算 5.表达式的运
2、算6.赋值语句(InputBox函数)7.选择程序结构 IFElse语句 Select Case语句8.数据有效性验证的方法,项目四 制作简易计算器,项目实施步骤:阅读相关基础知识界面设计窗体设计控件属性设置程序设计编程初步程序代码程序调试,功能完善,4.1 第1步:基础知识概述,4.1.1 Frame控件Frame 控件为控件提供可标识的分组。当需要在同一窗体内建立几组互独立的控件时,就需要用框架将每一组控件框起来,把控件分成几组。举例说明,用Frame控件将OptionButton分三组显示,如下图4-1所示。用Frame可以美化界面,在视觉上感觉清晰。,图4-1 Frame控件设计的界面
3、,4.1 第1步:基础知识概述,框架内控件的创建方法:为了将控件分组,首先绘制 Frame 控件,然后绘制 Frame 里面的控件。这样就可以把框架和里面的控件同时移动,成为一体。方法1:单击工具箱上的Frame控件,然后用出现的“+”指针,在Form窗体上画出适当大小的Frame框架控件,然后再继续把其他的控件画在Frame框架中适当位置。如果在 Frame 外部绘制了一个控件并试图把它移到框架内部,那么控件将在浮在 Frame 的上部,无法和Frame成为一体,当移动控件的时候,需分别移动 Frame 和控件。这时候通过方法2可以实现控件和框架一体的效果。方法2:将已有控件“剪切”(Ctr
4、l+X)到剪贴板,然后选中框架,使用(Ctrl+V)命令粘贴到框架内,即可实现控件和框架一体的效果。Frame的重要属性参见表4-1。,4.1 第1步:基础知识概述,表4-1 Frame控件的常用属性,4.1 第1步:基础知识概述,4.1.2 控件数组的使用 控件数组是一组具有共同名称和类型和事件过程的控件。它们的事件过程也相同。同一控件数组中的元素有自己的属性设置值。如Label(0),Label(1),Label(2),是控件数组,但Label1,Label2,Label3就不是控件数组。1.建立控件数组的方法控件数组时针对控件建立的,因此与普通数组的定义不一样。建立控件数组有3种方法:方
5、法1:给控件起相同的名称步骤如下:在窗体上画出多个同类型的控件,并决定哪个控件是数组的第一个元素。单击要包含到数组中的某个控件(控件数组的第一个元素表示的控件除外),将其激活;在属性窗口中选择“(名称)”属性,并键入和控件数组第一个元素一样的名称对每个要加到数组中的控件重复步骤,键入与控件数组第一个元素一样的名称。,4.1 第1步:基础知识概述,当对第二个控件键入与第一个控件相同的名称后,VB将显示一个如图4-2所示的对话框,询问是否确实要建立控件数组。单击“是”将建立控件数组,单击“否”将放弃建立控件数组。以后键入其他控件相同的名称时,将不会出现类似的提示框。,图4-2 建立控件数组提示,适
6、用场合:如果要求一个控件数组的绝大多数属性都不同,适用于方法1,可以先设置好各个同类型控件的“(名称)”以外的其他属性值。,4.1 第1步:基础知识概述,方法2:将控件复制并粘贴到窗体等上面在窗体上画一个控件,单击一下将其激活;执行“编辑”菜单中的“复制”命令或Ctrl+C,将该控件放入剪贴板;执行“编辑”菜单中的“粘贴”命令或者Ctrl+V,将显示一个对话框,询问是否建立控件数组,如图4-2所示;单击对话框中的“是”按钮,窗体的左上角将出现一个控件,它就是控件数组的第二个元素。其名称和第一个创建的控件一样,下标索引值为1,而第一个创建的控件的下标索引值自动为0;,4.1 第1步:基础知识概述
7、,将新创建的控件移动到适当的位置,再次使用“粘贴”命令创建下一个控件,作为控件数组的下一个元素重复本操作直到添加了控件数组的所有元素为止。用这种方法创建的控件数组,其中各个控件,其下标索引值和添加到控件数组的次序相同,由于每次都是从第一个控件复制而来,所以,不仅它们的名称和类型是相同的,而且各个控件的大多数属性都相同。适用场合:如果要求控件数组中的各个控件的绝大部分属性都相同,宜采用方法2。,4.1 第1步:基础知识概述,方法3:将控件的Index属性设置为非Null数值(0-32767)在窗体上添加多个同类型的控件;选择一个控件,打开属性窗口将其Index属性设置为032767之间的整数;重
8、复步骤,完成对所有的控件Index属性的修改。注意:各个控件的Index属性值可以连续,也可以不连续,但一定要唯一;在属性窗口中,将所有控件的名称修改为控件数组的名称。适用场合:如果要求用户指定控件数组中各控件的Index属性值,宜用方法3。三种方法可以配合使用,也可以单独使用。,4.1 第1步:基础知识概述,2.控件数组的特点控件数组具有以下特点:相同的控件名称,Name属性相同;控件数组中的控件具有相同的一般属性;所有的控件共用相同的事件过程;控件数组的每一个元素都有一个下标,下标值由Index属性值指定。数组名字有Name决定,而每个元素由Index属性值来确定;控件数组中的控件执行相同
9、的事件过程;控件数组元素通过数组名和括号中的下标来引用;控件数组多用于单选按钮,在一个框架中,有时候可能会有多个单选按钮,可以把这些单选按钮定义为一个数组,然后通过赋值语句使用Index属性或Caption属性。,4.1 第1步:基础知识概述,3.控件数组的使用使用控件数组主要是利用其共享事件过程的特点来简化编程。对当一个已经建立好的控件数组编写事件过程时,为了区别各个控件,VB把控件的Index属性作为过程参数,在过程中通过如下形式引用相应的控件。控件数组名(Index)当控件数组中的控件识别出一个事件已经发生时,VB就会立刻调出控件数组的相应的事件过程,并把可应用的索引号当做附加参数传递给
10、过程。举例控件数组的使用 用方法2建立如图4-3所示界面的按钮数组,要实现单击各个按钮时将按钮的标题显示在text1中。,4.1 第1步:基础知识概述,图4-3 设计按钮数组界面,4.1 第1步:基础知识概述,双击按钮数组进入代码编辑窗口,自动生成如下结构:Private Sub Command1_Click(Index As Integer)End Sub注意观察程序中的参数传递的是控件数组的各个控件的Index属性值,所有的控件共享同一个事件,通过Index来标识不同的控件。在代码结构中间补充实现本功能的代码:Text1.Text=Command1(Index).Caption通过“数组名
11、(Index).属性名”这样的形式来调用使用控件数组中的各个控件,在这个例子中,Index的值是从02。,4.1 第1步:基础知识概述,4.1.3 表达式及运算符运算是对数据进行加工的过程。在程序设计语言中用不同的符号来描述不同的运算形式,这些符号称为运算符或者操作符,运算的对象称为操作数。运算符和操作数可以组成各种类型的表达式,从而实现程序中需要的大量的运算。由运算符将操作数连接起来即构成了各种类型的表达式。表达式描述了对不同类型的操作数以何种顺序进行何种操作,或者说描述了某个求值规则。每个表达式都产生唯一的值。操作数可以是常量、变量、函数、对象等。,4.1 第1步:基础知识概述,表达式的类
12、型由运算符的类型决定,在VB中有4类常用的运算符和表达式:VB中的运算符有4类:第一类:1.算术运算符和算术表达式算术运算符是最常用的运算符,用来对数值型数据执行简单的算术运算,按照优先级别给出算术运算符,如表4-1所示。表4-1 算术运算符,4.1 第1步:基础知识概述,运算顺序根据优先级从高到低,括号改变优先级的高低,括号优先。数学表达式转换为算术表达式举例,见表4-2。表4-2 数学表达式转换为VB表达式,4.1 第1步:基础知识概述,第二类:2.字符串运算符和字符串表达式 VB字符串运算符有两个:“&”和“+”运算符,都是双目运算符,其作用是把两个字符串连接在一起,生成一个较长的字符串
13、。由字符串运算符与运算量构成的表达式称为字符串表达式。“&”和“+”运算符在连接两个字符串时,功能是等价的,但是在某些时候是不一样的,具体参见表4-3.表4-3“&”和“+”运算符的用法,4.1 第1步:基础知识概述,“&”和“+”举例,见表4-4。,表4-4“&”和“+”示例,4.1 第1步:基础知识概述,第三类:3.关系运算符和关系表达式关系运算符也称作比较运算符,用来对两个表达式的值进行比较,比较的结果为逻辑值,如果关系成立,则返回True,否则返回False。在VB中用-1和0表示True和False。关系运算符如表4-5所示。,表4-5 关系运算符,4.1 第1步:基础知识概述,第四
14、类:4.逻辑运算符和逻辑表达式逻辑运算符是用来执行逻辑运算的运算符。常用的有And(与)、Not(非)和Or(或)。逻辑表达式是用逻辑运算符将逻辑变量连接起来的式子。如表4-6所示。,表4-6 逻辑运算符,4.1 第1步:基础知识概述,4.1.4 赋值语句VB具有结构化程序设计的三种结构,即顺序结构、选择结构、循环结构,是程序设计的基础。顺序结构就是各语句按出现的先后次序执行。一般的程序设计语言中,顺序结构的语句主要是赋值语句、输入/输出语句等。在VB中也有赋值语句。形式为:变量名表达式计算右边表达式的值,然后赋给左边的变量。给变量赋值和设定属性是VB编程中常见的两个任务。,4.1 第1步:基
15、础知识概述,例如:n=n+1 计数累加 Text1.Text 清除文本框的内容Text1.Text 欢迎使用VB 文本框显示字符串 赋值语句不允许写成“表达式变量”,虽然赋值号与关系运算符等于号都用“=”表示,VB系统会根据所处的位置自动判断符号的意义。赋值号左边的变量只能是变量,不能是常量、常数符号、表达式。下面均为错误的赋值语句:Now()=x+y 左边是表达式(函数)5=sqr(s)+x+y 左边是常量,4.1 第1步:基础知识概述,4.1.5 选择程序结构 计算机要处理的问题往往是复杂多变的,仅采用顺序结构是不够的。必须利用选择结构等来解决实际应用中的各种问题。VB中提供了多种形式的条
16、件语句来实现选择结构,有If条件语句和Select情况语句等。它们都是对条件进行判断,根据判断结果,选择执行不同的分支。1.第一种分支语句:If语句 IF语句分为三种:单分支结构,双分支结构和多分支结构,分别介绍如下:IfThen语句(单分支结构)格式为:If Then 语句块(可以是一句或多句语句)End If或 If Then,4.1 第1步:基础知识概述,表达式:关系表达式、逻辑表达式,算术表达式,字符表达式。表达式值按非零为True,零为False进行判断。单分支IF语句的执行流程如图4-6所示。,图4-6 单分支IF语句执行流程该语句的作用是当表达式的值为True,执行Then后面的
17、语句块,否则不做任何操作。,4.1 第1步:基础知识概述,例:已知两个数x和y,比较它们的大小,使得x大于y。If xy Then t=x x=y y=t End If 或 If xy Then t=x:x=y:y=t 简单If形式无End If时,只能是一句语句或语句间用冒号分隔,而且必须在一行上书写。,4.1 第1步:基础知识概述,双分支结构:IfThenElse语句结构如下:If 表达式 Then语句块1Else语句块2End If或 If 表达式 Then 语句1 Else 语句2 当表达式的值为True时,执行Then后面的语句块1,否则执行Else后面的语句块2,4.1 第1步:基
18、础知识概述,例子:计算分段函数双分支结构实现:If x0 Then y=sin(x)+sqr(x*x+1)Else y=cos(x)x3+3*x End If,4.1 第1步:基础知识概述,多分支结构:IfThenElseIf 语句 结构:If 表达式1 Then 语句块1 ElseIf 表达式2 Then 语句块2 Else 语句块 n+1 End If作用:根据不同的表达式值确定执行哪个语句块。,4.1 第1步:基础知识概述,多分支IF语句的执行流程如图4-7所示。,图4-7 多分支IF语句执行流程,4.1 第1步:基础知识概述,If语句的嵌套:If语句的嵌套是指If或Else后面的语句块
19、中又包含If语句。If 表达式1 Then If 表达式2 Then End If End If,4.1 第1步:基础知识概述,2.第二种分支结构:select语句语法格式为:Select Case 变量或表达式 Case 表达式列表1 语句块1 Case 表达式列表2 语句块2 Case Else 语句块n+1End Select,4.1 第1步:基础知识概述,表达式列表与变量或表达式的类型必须相同,是下面4种形式之一:表达式 例:A一组用逗号分隔的枚举值 2,4,6,8 表达式1 To 表达式2 60 To 100Is关系运算符表达式 Is 60多分支结构,用Select Case语句比I
20、fThenElseIf语句直观,程序可读性强。但不是所有的多分支结构均可用Select Case语句代替IfThenElseIf语句。,4.2 第2步:界面设计,4.2.1 任务一、建立应用程序用户界面 选择新建工程,进入窗体设计器,首先增加一个框架控件Frame1,选中Frame1后,在其中增加一个文本框控件Text1、两个命令按钮数组Command1(0)Command1(10)、Command2(0)Command2(3)和一个命令按钮Command3。各控件排列如下图4-8所示:,图4-8 界面设计,4.2 第2步:界面设计,注:框架控件一般用在窗体布局中,其作用是对控件进行位置上的限
21、定,通常不对框架进行编程。控件数组是由一组相同类型的控件组成,这些控件共用一个相同的控件名,具有相同的属性设置。数组中每个控件都有唯一的索引号,即下标,下标值有Index属性指定。其所有的Name属性必须相同。控件数组通常用于需要对若干个同类型的控件执行大致相同的操作(如本例中的命令按钮),控件数组共享同样的事件过程。例如,假定一个控件数组含有3个命令按钮,则不管单击哪个,都会调用同一个Click过程。,4.2 第2步:界面设计,4.2.2 任务二:设置对象属性修改Form1的属性:Caption改为:计算器,Max Button 改为:False并调整窗体合适大小。修改Text1的属性:对齐
22、方式(Alignment)改为:1Right Justify。文本(Text1)改为:(无)。修改Command1(0)Command1(10)的属性:标题(Caption)依次改为:1,2,3,4,5,6,7,8,9,0,.。修改Command2(0)Command2(3)的属性:标题(Caption)依次改为:,。修改Command3的属性:标题(Caption)改为:。如下图4-9所示:,图 4-9修改属性后的界面,4.3 第3步:程序代码,4.3.1 任务一:在“通用”过程中“声明”变量首先在“通用”过程中“声明”变量编程思想:用计算器进行运算的时候,至少需要存放两个操作数和一个运算符
23、,所以需要声明三个变量,另外需要设置一个开关变量来指示是否第一次按下运算符,来分情况处理运算的位置:(1)处理用户是连续按下运算符而不按下等号的情况;(2)处理用户按下等号进行计算的情况。,4.3 第3步:程序代码,变量设置如下:Dim v As Boolean 是否第一次按运算符Dim s As String 存放上次按的运算符Dim x As Double 存放第一个操作数Dim y As Double 存放第二个操作数通用过程如下图4-10所示:,图 4-10 在通用部分定义全局变量,4.3 第3步:程序代码,说明:通用过程一般用来声明全局变量,也就是作用范围为整个工程的变量。在程序代码
24、窗口的下拉菜单中选择即可。,4.3 第3步:程序代码,4.3.2 任务二:命令按钮控件数组 Command1()的Click事件代码编程思想:单击09以及小数点时,需要将用户单击的内容显示在计算器中,用Command1(Index).Caption来获取用户按下的键上的字符显示信息。每次用户按下数字键和小数点的时候,系统要都要调用Command1()的click事件,当用户多次按下多个字符键,那么就需要暂存用户以前按下的结果,设置一个临时变量a暂存用户最近按下数字键,程序为:a=Text1.Text 保存以前按下的内容Text1.Text=a&Command1(Index).Caption 和
25、现在按下的键的内容连接在一起显示在text1文本框中。,4.3 第3步:程序代码,当用户按下运算符后,我们要显示第二个运算数,text1中的内容需清除来存放第二个操作数,在此用Form窗体的一个特殊的属性Tag来区分用户是否按下过运算符。如果用户按下过运算符,那么这时需要显示的内容是当前按下键的内容,即Text1.Text=Command1(Index).Caption。特殊情况:当用户单击小数点的时候,按照刚才的代码会直接显示了一个单独的“.”,在此需要对text1显示的内容做补充,即text1的显示内容在小数点的前面补“0”,使得直接按下小数点的时候为前面自动补零。实现代码如下:If In
26、dex=10 Then 单击小数点情况Text1.Text=0 单击小数点的时候需要在点前补“0”显示 Else Text1.Text=Command1(Index).Caption 按下的内容显示text1中 End If当按下运算符后按第一个数字键的时候,需要处理如上两种情况,处理后对Form1.Tag置空,等待下次使用。,4.3 第3步:程序代码,Command1数组的单击事件代码如下:Private Sub Command1_Click(Index As Integer)数字键(09)以及小数点(.)键的Click事件过程If Form1.Tag=T Then 处理用户按下运算符后按下
27、的第一个数字区符号 If Index=10 Then 单击小数点的时候 Text1.Text=0 单击小数点的时候需要在点前补“0”显示 Else Text1.Text=Command1(Index).Caption 按下的内容显示text1中 End If Form1.Tag=Elsea=Text1.Text 保存以前按下的内容 Text1.Text=a&Command1(Index).Caption 连接新按下字符一起显示End IfEnd Sub说明:Tag属性用来返回或者设置一个表达式用来存储程序中需要额外存储的数据与其它属性不同,Tag 属性值不被 Visual Basic 使用;可
28、以用该属性来标识对象。语法:object.Tag=expression,4.3 第3步:程序代码,4.3.3 任务三:命令按钮组Command2()的Click事件代码:编程思想:对于运算符键,有两种情况,一种是用户第一次按下运算符号键的时候,一种是用户不是第一次按下运算符键的时候,需要分情况处理。,4.3 第3步:程序代码,1、当用户第一次按下运算符号的时候,需要做两个处理:把text1中 内容保存为第一个操作数即x=Text1.Text保存运算符号的Index值在s变量中,等待获取第二个操作数后进行运算处理,此时却不必计算,代码为:s=Index;核心代码为:If v Thenx=Text
29、1.Text:v=Not v Else.End If s=Index,4.3 第3步:程序代码,2、当用户不是第一次按下运算符的时候,并且是用户多次按下运算符而没有按下等号的时候,此时需要进行计算处理,包括三项工作:保存第二个操作数到y变量中,以备计算使用;根据s中保存的运算符的Index值,决定执行相应的计算;计算结果保存在x中,作为下一次运算的第一操作数;,4.3 第3步:程序代码,为实现上述功能,双击Command2数组后的核心代码如下:Private Sub Command2_Click(Index As Integer)运算符的加,减,乘,除键的Click事件过程 Form1.Tag
30、=T If v Then x=Text1.Text:v=Not v 保存第一个运算数在x变量中 Else y=Text1.Text 处理多次按下运算符键的情况这时需要对之前按下的数字和运算符号进行对应的计算,把计算结果显示在text1中,4.3 第3步:程序代码,Select Case s Case 0 Text1.Text=x+y Case 1 Text1.Text=x-y Case 2 Text1.Text=x*y Case 3 If y 0 Then Text1.Text=x/y Else MsgBox 不能以0为除数,32,错误 End If End Select x=Text1.Te
31、xt 把text1的内容保存在x中,再次作为第一个操作数参与下一次运算 End If s=Index 保存运算符的Index值,在计算时使用End Sub,4.3 第3步:程序代码,说明:MsgBox语句的格式为:MsgBox,,三个部分的意义如下:提示信息是显示在提示框的文字显示内容,标题显示在提示框的标题栏上,而按钮包括:按钮的数目及形式、使用的图标类型、默认按钮等,3个按钮可以相加达到需要的样式。32是图标类型为VbQuestion问号图标。,4.3 第3步:程序代码,4.3.4 任务四:编写命令按钮Command3的Click事件过程编程思想:用户单击等号以后所需要做的事情包括如下三步
32、:保存第二个操作数到y变量中,以备计算使用;使用s中保存的运算符的Index值,执行相应的计算;计算结果保存在x中,作为下一次运算的第一操作数;把存放第二个操作数的变量y清除,把保存运算符的变量s清除,以备下一次接收新的内容进行下一次计算,v设置为false,意味已经按下过运算符;,4.3 第3步:程序代码,双击Command3按钮的核心代码如下:Private Sub Command3_Click()运算符()的Click的事件过程 Form1.Tag=T:y=Text1.Text 把text1中的值保存在y中作为第二个运算数 Select Case s s中保存的是运算符,当单击运算符的时
33、候s的值已经保存 Case 0 Text1.Text=x+y text1中显示运算后的结果 Case 1 Text1.Text=x-y Case 2 Text1.Text=x*y Case 3 If y 0 Then 被除数是否为0 Text1.Text=x/y Else MsgBox 不能以0为除数,32,错误 End If End Select x=Text1.Text:y=0:v=False:s=5 End Sub,4.3 第3步:程序代码,程序执行效果如下图4-11所示:,图4-11 程序运算结果图,4.4 第4步:程序调试,完善功能,考虑输入“.9”后观察程序运行的结果;输入“8.9
34、-8”观察程序运行结果,如何改进和完善程序?项目总结:Frame控件数组的画法及作用,如何让已有控件包括在Frame中(复制粘贴法)控件数组的三种画法及各自的适用场合控件数组中控件的调用方法:通过“数组名(index)”调用控件数组中的某一控件,各个控件的大部分属性是相同,一个控件数组共享同一个事件合理的控件的排列方式,让界面更美观选择程序结构:块IF结构以及Select Case结构的使用方法,case语句处理多分支结构清晰明了,主意表达式的写法,主意IF语句和Select case语句的结构写完整,4.4 第4步:程序调试,完善功能,复习思考:一、填空题1、是一组具有共同名称和类型和事件过程的控件。它们的事件过程也。2、控件数组具有以下特点:相同的,Name属性相同;控件数组中的控件具有相同的;所有的控件共用相同的事件过程;控件数组 的每一个元素都有一个下标,下标值由 属性值指定。数组名字有 属性值决定,而每个元素由 属性值来确定;控件数组中的控件执行 的事件过程;控件数组元素通过数组名和括号中的 来引用;3、VB具有结构化程序设计的三种结构,即顺序结构、,是程序设计的基础。4、VB字符串运算符有两个:和 运算符,都是双目运算符,其作用是把两个字符串连接在一起,生成一个较长的字符串。,