【VB开源代码栏目提醒】:以下是网学会员为您推荐的VB开源代码-VBNET程序设计实用教程4 - 编程语言,希望本篇文章对您学习有所帮助。
第4章 过 程 用函数过程实现的话费计算程序 四则运算测验程序 十进制到其它进制转换程序 汉诺塔问题 求复杂函数的值 本章项目 通用过程和函数过程的定义、 建立与调用 过程的概念与分类 参数传递 变量的作用域与静态变量 过程的嵌套调用与递归调用 本章要点 第一节第一节 过程的概念过程的概念 过程是完成某一特定功能的一段程序又称子程序。
使用过程的第一个原因是结构化程序设计的需要。
结构化程序设计思想最重要的一点就是把一个复杂
问题分成很多小而独立的问题即把一个大程序分为若干个小程序——模块每个模块完成一部分功能。
如图4-1所示。
对于每个模块需详细定义模块的功能及其接口一个程序员编制其中的一个或多个模块并把模块编写成过程。
摩块编写好后可以把它们组装成应用程序如把“二级子模块11”和“二级子模块12”组合在一起就实现了“一级子模块1”的功能把“二级子模块21”和“二级子模块22”组合在一起就实现了“一级子模块2”的功能把“一级子模块1”和“一级子模块2”组合在一起就实现了软件项目的功能。
组合子模块可以通过调用相应的过程来实现。
软件项目 一级子模块1 一级子模块2 二级子模块11 二级子模块12 二级子模块21 二级子模块22 图4-1 结构化程序
设计模式 使用过程的第二个原因是为了解决
代码的重复。
可以把经常用到的完成某种功能的程序段编写成过程这样做有很多好处例如每当需要完成这一功能时只要调用这个过程即可而不需重复编写
代码如果需要修改这一段
代码只要在该过程里修改即可而调用该过程的程序不必修改。
从本质上说过程就是完成一定功能的程序段。
该程序段有一个名字称为过程名。
并且为过程定义了严格的接口对用户来说不需要了解过程功能的实现过程与语句只需了解它的功能与接口。
若有其它程序要完成该过程的功能可通过过程名调用它过程可多次反复调用但调用时必须符合过程的接口要求。
根据不同的方法过程可以分成不同的种类。
如从使用的角度来看可以把过程分成Sub过程、函数过程和属性过程从定义时有无参数来分可分为有参过程和无参过程根据过程调用时是否有返回值来分可分为有返回值的过程和无返回值的过程根据过程的调用关系可分成主调过程和被调过程所谓主调过程是指调用其它过程的过程所谓被调过程是指被其它过程调用的过程。
在
VB.NET中通常采用第一种分法即把过程分为Sub过程、函数过程和属性过程本章只介绍Sub过程和函数过程Sub过程又可分成事件过程和通用过程。
第二节第二节 四则运算测验程序四则运算测验程序————SubSub过程过程 一、任务4-1描述 编写一个
程序用来随机出十道两位数的“”、“-”、“”、“/”测验题计算机显示每道题后等待用户输入答案并能根据用户输入答案来判断正误并显示答题情况。
程序的设计界面如图4-2所示程序的运行界面如图4-3所示。
程序运行时
计算机将生成一道四则运算题并显示出来两个运算数分别显示在界面上的第一个和第二个文本框中并等待用户在第三个和第四个文本框专用于除法输入余数中输入答案用户输入答案后按“确定”按钮将把用户的答题情况显示在右侧的列表框中并在题目后加上“√”和“×”以表示用户答题是否正确。
图4-2 程序运行界面 图4-3 某时刻程序运行界面 本题的关键有两点一是出题二是判断用户答案的正误。
1出题涉及到产生两个运算数和一个运算符号这些均可用随机数来产生。
可以产生两个两位随机数作为运算数产生一个1到4之间的随机整数作为运算符设1为“”2为“-”3为“”4为“/”。
把运算数直接显示在界面上对于运算符可通过分支语句进行测试把相应的“”、“-”、“”、“÷”显示出来。
2通过Select Case……End Select语句测试产生的运算符是何种运算符对产生的两个运算数作相应运算得到标准答案。
从界面上获取用户输入的答案把标准答案和用户输入的答案相比较如果相等则用户回答正确如果不等则用户回答不正确。
二、任务分析 另外窗体刚显示出来的时候需要出一组题目的第一道题。
每次单击一次确定按钮都要出该组题目的下一道题。
单击“重新开始”按钮将要出下一组的第一道题。
可见“出题”这个操作在程序的实现过程中需要多次使用因此可把它定义成一个通用过程在需要时直接调用即可。
1启动
VB.NET新建一个项目项目类型为“Windows应用程序”项目的存放位臵为“D:VBTASKCH04”项目名为“Task4_1”。
2把Form1窗体的Text属性值设臵为“四则运算测验程序”把它的Name属性值设臵为“frmMaths”。
单击“解决方案资源管理器”中的“Form1.
VB”窗体然后在属性窗口中把它文件名属性设臵为“frmMath.
vb”。
然后执行【项目】→【Task4_1属性】命令在出现的“Task4_1属性页”对话框中把“启动对象”设臵为“frmMath”。
3对照程序设计界面为窗体添加控件并设臵控件的属性。
控件的属性设臵如表4-1所示。
三、任务实现: 控件名 属性名 属性值 说明 GroupBox1 Text quot题目quot 把与答题相关的组件放在一组中 TextBox1 Text quotquot 显示题目中的第一个数 Label1 Text quotlblOpquot 显示运算符号 TextBox2 Text quotquot 显示题目中的第二个数 Label3 Text quotquot 显示“”号 TextBox3 Text quotquot 接收用户输入的答案和、差、积、商 Label4 Text quot……quot 显示“余”号 TextBox4 Text quotquot 接收用户输入的答案除运算的余数 Button1 Text quot确定quot 判断用户答题是否正确并显示答题情况 GroupBox2 Text quot结果quot 把与显示答题结果有关的组件放在一组中 Label5 Text quot答对quot 提示 TextBox5 Text quotquot 显示答对的题目数 Label6 Text quot答错quot 提示 TextBox6 Text quotquot 显示答错的题目数 Button2 Text quot重新开始quot 重新做下一组题本例每组10题 Button3 Text quot结束quot 结束应用程序的运行 表4-1 任务4-1控件属性设置及其功能 说 明 ListBox1为列表框控件列表框控件用来显示一串列表项供用户进行选 择在工具箱中的图标为“”。
4在
代码窗口中定义常量和模块级数组如下。
Const N As Integer 10 Dim Num1 Num2 As Integer 题目中的两个数 Dim Op As Integer 存放运算符1为quotquot2为quot-quot3为quotquot4为quot/quot Dim Standard As Integer 存放标准答案“”、“-”、“”的结果和“/“的商 Dim Standardb As Integer 存放标准答案“/”运算的余数 Dim Answer As Integer 存放用户答案“”、“-”、“”的结果和”/“的商 Dim Answerb As Integer 存入用户答案 ”/“运算的余数 Dim Question As String 存入题目和答题情况 Dim i As Integer 存放当前题目数 Dim RightNum WrongNum As Integer 存放正确的题数和错误的题数 5在上述
代码的后面编写以下
代码。
Private Sub ShowQuestion Dim t As Integer 交换用的中间变量 Num1 10 Rnd 90 ??产生两个两位数 Num2 10 Rnd 90 Op Int1 Rnd 4 产生运算符 TextBox3.Text quotquot : TextBox4.Text quotquot 用户输入答案的编辑框为空 If Op 4 Or Op 2 Then 如果是quot/quot或-运算符 If Num1 lt Num2 Then 如果第一个数小 t Num1 : Num1 Num2 : Num2 t 把两个数交换过来End If End If If Op 4 Then 如果是quot÷quot运算符 Label3.Visible True 显示余符号 TextBox4.Visible True 显示用户输入余数的编辑框 Else ??不是除法 Label3.Visible False 不显示余符号 TextBox4.Visible False 不显示用户输入余数的编辑框 End If TextBox1.Text StrNum1 显示第一个数 TextBox2.Text StrNum2 显示第二个数 Select Case Op 判断运算符的种数 Case 1 加法运算 Label1.Text quotquot 显示运算符 Standard Num1 Num2 得到标准答案 Question StrNum1 quotquot StrNum2 quotquot 产生题目字符串并保存在变量中 Case 2 减法运算 Label1.Text quot-quot 显示运算符 Standard Num1 - Num2 得到标准答案 Question StrNum1 “-” StrNum2 “” ??产生题目字符串并保存在变量中 Case 3 乘法运算 Label1.Text quotquot 显示运算符 Standard Num1 Num2 得到标准答案 Question StrNum1 quotquot StrNum2 quotquot 产生题目字符串并保存在变量中 Case 4 除法运算 Label1.Text quot÷quot 显示运算符 Standard Num1 Num2 得到商的标准答案 Standardb Num1 Mod Num2 得到余数的标准答案 QuestionStrNum1 quot÷quot StrNum2 quotquot 产生题目字符串并保存在变量中 说明 1上述
代码定义了一个名为“ShowQuestion”的通用过程 通用过程是Sub过程的一种在
VB.NET中有两种Sub过程即事件过 程和通用过程。
2上述通用过程的作用是产生两个两位随机数作为运算 数并存放在变量Num1和Num2中产生一个14之间的随机数作为运 算符存放在变量Op中如果运算符是“÷”或“-”且Num1的值小于 Num2的值应把Num1和Num2的值交换如果运算符是“÷”让输入 余数的文本框可见供用户输入余数如果运算符不是“÷”则让 输入余数的文本框不可见最后使用Select Case…End Select语 句测试Op的值来判断对Num1和Num2进行哪一种运算得到标准答案 存放在变量Standard和Standardb中并产生相应的题目字符串 存放在变量Question中。
3在
VB.NET中要使用通用过程必须先定义。
通用过程 可以在窗体或模块中定义。
通用过程的定义格式如下。
格式PrivateFriendPublicProtectedProtected Friend Sub 过程名lt形式参数列表gt lt局部变量和常量说明gt 执行部分 Exit Sub 执行部分 End Sub 功能建立一个由“过程名”标识的通用过程。
说明 ①在Sub和End Sub之间是描述过程操作的一段程序称为子程序体或过程 体。
②以关键字Private开头的通用过程是模块级的私有的过程只能被本 模块内的事件过程或其它过程调用。
以关键字Public选项开头的
常用过程是公 有的或全局的过程在应用程序的任何模块中都可以调用它。
以Friend开头的 通用过程只能在本项目或组件的范围外被其它过程调用。
Protected与类的继 承有关在面向对象的章节中进行介绍。
③过程体由合法的
VB.
NET语句组成过程体中可以含有多个“ Exit Sub”语句程序执行到“Exit Sub”语句时提前退出该过程返回到主调 过程中调用该过程语句的下一条语句。
④“过程名”是标识符过程名必须唯一。
⑤“参数列表”中的参数称为形式参数简称形参它可以是变量 名或数组名。
若有多个参数时各参数之间用逗号分隔。
VB.NET的过程 可以没有参数但一对圆括号不可以省略。
不含参数的过程称为无参过 程带有参数的过程称有参过程。
每个形参的定义格式有以下几种 格式1Optional ByVal 变量名 As 类型说明符 格式2Optional ByRef 变量名 As 类型说明符 格式3ByValByRef ParamArray 参数数组名 As 类型说明符 功能定义形参。
说明ByVal表示其后的形参是按值传递参数或称为“传值”方式。
ByRef表示其后的参数是按引用传递参数或称“传址”方式。
如果形式 参数之前有Optional关键字则表示该参数是一个可选参数。
ParamArray关键字用来声明参数数组参数数组可以用来接受任意多个 实参。
格式1和格式2中的变量名也可以是数组名若是数组名应在其后 加上圆括号“”。
4通用过程可以在窗体中建立也可以在模块中建立。
在窗体中建立通用过程的一般步骤如下 ①在“解决
方案资源管理器”窗口中找到需要的窗体并双击它 ②打开
代码窗口 ③滚动
代码找到文字“Windows 窗体设计器生成的
代码”所在位臵 ④直接在该段文字的下方输入要建立的通用过程。
通用过程还可以定义在模块文件中模块文件是以.
vb为 扩展名的文件。
一个模块
代码是以Module开头以End Module结尾。
可 以将各窗体都公用的过程或函数都放在模块中这样可使程序更加清晰、 易懂、便于维护。
为在模块文件中建立通用过程首先应为项目添加模 块。
为项目添加模块并在模块中建立通用过程的一般步骤如下 ①执行“项目”→“添加模块”命令将会出现如图4-4所示的“添加新 项”对话框。
②在“添加新项”对话框的右边的“模板”框内选中“模块”图标在下 面的“名称”后面的文本框中输入模块文件名图中为“Module1.
vb” 然后按“打开”按钮则将在
代码窗口中显示建立起来的该模块的模板 如图4-5所示。
图4-4 “添加新项”对话框 图4-5 创建的模块文件的模板 ③在图5-6的插入点所在处可以输入要建立的通用过程
代码。
④单击工具栏上的“”、“”按钮或执行“文件”→“保存Module1.
vb”命令都 会把模块文件保存起来同时也保存了建立在其中的通用过程。
6在窗体的空白部分双击将会出现窗体的Load事件过程框架在其中输 入事件过程
代码如下。
Private Sub frmMath_LoadByVal sender As System.Object ByVal e As System.EventArgs Handles MyBase.Load Randomize 随机数初始化 i 1 当前题目为第一题 RightNum 0 答对的题数目为0道 WrongNum 0 答错的题数目为0道 TextBox5.Text “0” : TextBox6.Text “0” ??显示答对答错题数的编 辑框为空 ListBox1.Items.Clear 清除列表框中的内容 ShowQuestion 显示题目 End Sub 说明 1事件过程是一种Sub过程。
当某个对象对一个事件的发生做出 响应时
VB.NET就会自动地执行与该事件相关的事件过程。
上述
代码就 是窗体frmMath的Load事件过程
代码该事件过程在窗体加载时被执行。
2发生某对象的某事件时可能会执行该对象的相应事件过程
代码执行的前提是该对象的相应事件过程已经定义。
事件过程的定义 格式如下。
格式Private Sub 对象名_事件名lt形式参数列表gt 局部变量和常量说明 执行部分 End Sub 功能建立一个事件过程。
说明 ① 一个对象的事件过程名前都有一个“Private”关键字这表示该 事件过程只能在定义的模块中被调用在该模块之外不能被调用即它 的使用范围是模块级的。
②事件过程名是由对象的实际名称Name属性值、下划线和事件 名组合而成的。
其中事件名是
VB为某对象能触发的事件所规定的名称 不能自己命名如Click、Load等都是事件名。
例如在Button1控件上单 击将会调用名字为Button1_Click的事件过程。
③“形式参数列表”表示该事件过程所具有的参数个数和参数类型 由
VB系统的事件本身所决定用户不能随意添加。
如Load事件过程就没 有参数。
3在
VB.NET中建立事件过程有专门的方法其操作步骤如下 ① 打开
代码窗口或称
代码视图、
代码编辑器窗口 双击窗体或控件即可打开“
代码”窗口在
代码窗口的上方有两个 列表框分别为“对象”列表框和“事件过程”列表框 ② 在“
代码”窗口的“对象”列表框中选择一个对象如选择 Button1如图4-6所示。
图4-6 在
代码窗口的对象
列表框中选择对象名 ③在“事件过程”列表框中选择一个事件过程后如选择Click如图4-7所示。
图4-7 在
代码窗口的事件过程列表框中选择事件过程名 选择事件过程后就会在
代码窗口中自动产生该事件过程的模板如 图4-8所示。
此时就可以在插入点处编写在发生Button1_Click事件时应 该执行的
代码了。
图4-8 产生的Button1_Click事件过程模板 事件过程定义与建立在前面章节中的几乎每个任务中都要用到这里不再举例。
4程序中的语句“ShowQuestion”的作用是调用通用过程 “ShowQuestion”。
定义通用过程时通用过程并没有执行通用过程只 有在被调用时才被执行。
在
VB.NET中调用通用过程通常采用以下两种方 法。
①直接使用通用过程名调用通用过程 该方法的语法格式及功能如下 格式通用过程名实际参数列表 功能调用执行“通用过程名”指定的过程。
说明“实际参数列表”的参数要依次传递给通用过程的形参列表 中的形参如果通用过程无形参“实际参数列表”可缺省。
“实际参数 列表”可能有多个参数参数之间用“”分隔开。
②使用Call关键字调用通用过程 该方法的语法格式及功能如下 格式Call 通用过程名实际参数列表 功能调用执行“通用过程名”指定的过程。
说明该方式与①功能完全一样。
该方式由于在过程前面使用了 Call关键字可以使程序的可读性增强使用户一眼就可以看出这是一 个过程调用语句。
如上述
代码中的语句“ShowQuestion”还可以写成 “Call ShowQuestion”。
5某对象的事件过程在发生该对象的相应事件时由
系统自动调 用而通用过程则是在程序中通过过程调用语句调用才能执行通过过 程可以被事件过程、通用过程或函数过程调用把调用其它过程的过程 称为主调过程把被其它过程调用的过程称为被调过程。
7执行程序会发现界面上出现了一道题目但用户不能做题 因为“确定”等按钮的Click事件
代码尚没有编写。
4程序中的语句“ShowQuestion”的作用是调用通用过程 “ShowQuestion”。
定义通用过程时通用过程并没有执行通用过程只 有在被调用时才被执行。
在
VB.NET中调用通用过程通常采用以下两种方 法。
①直接使用通用过程名调用通用过程 该方法的语法格式及功能如下 格式通用过程名实际参数列表 功能调用执行“通用过程名”指定的过程。
说明“实际参数列表”的参数要依次传递给通用过程的形参列表 中的形参如果通用过程无形参“实际参数列表”可缺省。
“实际参数 列表”可能有多个参数参数之间用“”分隔开。
②使用Call关键字调用通用过程 8编写“确定”按钮的Click事件过程
代码如下。
Private Sub Button1_ClickByVal sender As System.Object ByVal e As System.EventArgs Handles Button1.Click If Op 4 Then 如果是除法运算 Answer ValTextBox3.Text 得到用户输入的商 Answerb ValTextBox4.Text 得到用户输入的余数 把用户答案连接到Question中 Question Question TextBox3.Text quot......quot TextBox4.Text If Standard Answer And Standardb Answerb Then ??如果用 户答对了 Question Question quot √quot 在Question后面连接一个quot√quot号 RightNum RightNum 1 答对的题数目加1 Else 如果答错了 Question Question quot ×quot 在Question后面连接一个quot×quot号 WrongNum WrongNum 1 ??答错的题数目加1 End If Else 如果是“”、“-”、“”等运算 Answer ValTextBox3.Text 获取用户输入的答案 Question Question TextBox3.Text 把用户答案连接到Question中 If Standard Answer Then 如果用户答对了 Question Question quot √quot 在Question后面连接一个quot√quot号 RightNum RightNum 1 ??答对的题数目加1 Else 如果答错了 Question Question quot ×quot 在Question后面连接一个quot×quot号 WrongNum WrongNum 1 ??答错的题数目加1 End If End If TextBox5.Text StrRightNum 显示答对题数目 TextBox6.Text StrWrongNum 显示答错题数 Question quotquot CStri quot.quot Question 在Question变量前连上题号 ListBox1.Items.AddQuestion 显示用户回答本题的情况 Question quotquot i i 1 题号加1 If i lt N Then Call ShowQuestion 显示题目 Else MsgBoxquot题目已做完quot quot提示quot Button1.Enabled False 确定按钮不可用 End If End Sub 说明 .