null VB.NET程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
实用教程 VB.NET程序设计实用教程第4章 过 程 过 程 过 程用函数过程实现的话费计算程序 四则运算测验程序十进制到其它进制转换程序 汉诺塔问题 求复杂函数的值 本章项目 过 程 过 程通用过程和函数过程的定义、
建立与调用过程的概念与分类 参数传递 变量的作用域与静态变量 过程的嵌套调用与递归调用 本章要点4.1过程的概念4.1过程的概念
过程是完成某一特定功能的一段程序,又称子程序。使用过程的第一个原因是结构化程序设计的需要。结构化程序设计思想最重要的一点就是把一个复杂问题分成很多小而独立的问题,即把一个大程序分为若干个小程序——模块,每个模块完成一部分功能。如图4-1所示。对于每个模块,需详细定义模块的功能及其接口,一个程序员编制其中的一个或多个模块,并把模块编写成过程。 第一节 过程的概念 4.1过程的概念4.1过程的概念
摩块编写好后,可以把它们组装成应用程序,如把“二级子模块11”和“二级子模块12”组合在一起就实现了“一级子模块1”的功能,把“二级子模块21”和“二级子模块22”组合在一起就实现了“一级子模块2”的功能,把“一级子模块1”和“一级子模块2”组合在一起就实现了软件项目的功能。组合子模块可以通过调用相应的过程来实现。 4.1过程的概念 4.1过程的概念
图4-1 结构化程序设计模式4.1过程的概念4.1过程的概念
使用过程的第二个原因是为了解决代码的重复。可以把经常用到的完成某种功能的程序段编写成过程,这样做有很多好处,例如:每当需要完成这一功能时只要调用这个过程即可,而不需重复编写代码;如果需要修改这一段代码,只要在该过程里修改即可,而调用该过程的程序不必修改。
从本质上说,过程就是完成一定功能的程序段。该程序段有一个名字,称为过程名。并且为过程定义了严格的接口,对用户来说不需要了解过程功能的实现过程与语句,只需了解它的功能与接口。若有其它程序要完成该过程的功能,可通过过程名调用它,过程可多次反复调用,但调用时必须符合过程的接口要求。4.1过程的概念4.1过程的概念 根据不同的
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
,过程可以分成不同的种类。如从使用的角度来看,可以把过程分成Sub过程、函数过程和属性过程;从定义时有无参数来分,可分为有参过程和无参过程;根据过程调用时是否有返回值来分,可分为有返回值的过程和无返回值的过程;根据过程的调用关系可分成主调过程和被调过程,所谓主调过程是指调用其它过程的过程,所谓被调过程是指被其它过程调用的过程。在VB.NET中通常采用第一种分法,即把过程分为:Sub过程、函数过程和属性过程,本章只介绍Sub过程和函数过程,Sub过程又可分成事件过程和通用过程。 4.2 四则运算测验程序——Sub过程 4.2 四则运算测验程序——Sub过程 第二节 四则运算测验程序——Sub过程 一、任务4-1描述: 编写一个程序用来随机出十道两位数的“+”、“-”、“*”、“/”测验题,计算机显示每道题后等待用户输入答案,并能根据用户输入答案来判断正误并显示答题情况。程序的设计界面如图4-2所示,程序的运行界面如图4-3所示。程序运行时,计算机将生成一道四则运算题并显示出来(两个运算数分别显示在界面上的第一个和第二个文本框中),并等待用户在第三个和第四个文本框(专用于除法,输入余数)中输入答案,用户输入答案后按“确定”按钮,将把用户的答题情况显示在右侧的列表框中,并在题目后加上“√”和“×”以表示用户答题是否正确。4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程图4-2 程序运行界面4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程图4-3 某时刻程序运行界面 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 本题的关键有两点:一是出题,二是判断用户答案的正误。
(1)出题涉及到产生两个运算数和一个运算符号,这些均可用随机数来产生。可以产生两个两位随机数作为运算数,产生一个1到4之间的随机整数作为运算符,设1为“+”,2为“-”,3为“*”,4为“/”。把运算数直接显示在界面上,对于运算符,可通过分支语句进行测试,把相应的“+”、“-”、“*”、“÷”显示出来。
(2)通过Select Case……End Select语句测试产生的运算符是何种运算符,对产生的两个运算数作相应运算得到
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
答案。从界面上获取用户输入的答案,把标准答案和用户输入的答案相比较,如果相等则用户回答正确,如果不等则用户回答不正确。 二、任务分析:4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 另外,窗体刚显示出来的时候需要出一组题目的第一道题。每次单击一次确定按钮都要出该组题目的下一道题。单击“重新开始”按钮,将要出下一组的第一道题。可见“出题”这个操作在程序的实现过程中需要多次使用,因此可把它定义成一个通用过程,在需要时直接调用即可。 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 1.启动VB.NET,新建一个项目,项目类型为“Windows应用程序”,项目的存放位置为“D:\VBTASK\CH04”,项目名为“Task4_1”。
2.把Form1窗体的Text属性值设置为“四则运算测验程序”,把它的Name属性值设置为“frmMaths”。单击“解决
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
资源管理器”中的“Form1.VB”窗体,然后在属性窗口中把它文件名属性设置为“frmMath.vb”。然后执行【项目】→【Task4_1属性】命令,在出现的“Task4_1属性页”对话框中把“启动对象”设置为“frmMath”。
3.对照程序设计界面,为窗体添加控件并设置控件的属性。控件的属性设置如表4-1所示。三、任务实现:4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程表4-1 任务4-1控件属性设置及其功能 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 说 明
ListBox1为列表框控件,列表框控件用来显示一串列表项,供用户进行选
择,在工具箱中的图标为“”。
4.在代码窗口中定义常量和模块级数组,如下。
Const N As Integer = 10
Dim Num1, Num2 As Integer '题目中的两个数
Dim Op As Integer '存放运算符:1为"+",2为"-",3为"*",4为"/"
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 '存放正确的题数和错误的题数 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 5.在上述代码的后面,编写以下代码。
Private Sub ShowQuestion()
Dim t As Integer '交换用的中间变量
Num1 = 10 + Rnd() * 90 ‘产生两个两位数 Num2 = 10 + Rnd() * 90
Op = Int(1 + Rnd() * 4) '产生运算符
TextBox3.Text = "" : TextBox4.Text = "" 用户输入答案的编辑框为空
If (Op = 4) Or (Op = 2) Then '如果是"/"或'-'运算符
If Num1 < Num2 Then '如果第一个数小
t = Num1 : Num1 = Num2 : Num2 = t '把两个数交换过来End If
End If If (Op = 4) Then '如果是"÷"运算符
Label3.Visible = True '显示余符号
TextBox4.Visible = True '显示用户输入余数的编辑框
Else ‘不是除法 Label3.Visible = False '不显示余符号
TextBox4.Visible = False '不显示用户输入余数的编辑框
End If TextBox1.Text = Str(Num1) '显示第一个数
TextBox2.Text = Str(Num2) '显示第二个数
Select Case Op '判断运算符的种数 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 Case 1 '加法运算
Label1.Text = "+" '显示运算符
Standard = Num1 + Num2 '得到标准答案
Question = Str(Num1) + "+" + Str(Num2) + "=" '产生题目字符串并保存在变量中
Case 2 '减法运算
Label1.Text = "-" '显示运算符
Standard = Num1 - Num2 '得到标准答案
Question = Str(Num1) + “-” + Str(Num2) + “=” ‘产生题目字符串并保存在变量中
Case 3 '乘法运算
Label1.Text = "*" '显示运算符
Standard = Num1 * Num2 '得到标准答案
Question = Str(Num1) + "*" + Str(Num2) + "=" '产生题目字符串并保存在变量中
Case 4 '除法运算
Label1.Text = "÷" '显示运算符
Standard = Num1 \ Num2 '得到商的标准答案
Standardb = Num1 Mod Num2 '得到余数的标准答案
Question=Str(Num1) + "÷" + Str(Num2) + "=" '产生题目字符串并保存在变量中4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 说明:
(1)上述代码定义了一个名为“ShowQuestion”的通用过程,
通用过程是Sub过程的一种,在VB.NET中有两种Sub过程,即事件过
程和通用过程。
(2)上述通用过程的作用是:产生两个两位随机数作为运算
数并存放在变量Num1和Num2中,产生一个1~4之间的随机数作为运
算符,存放在变量Op中;如果运算符是“÷”或“-”且Num1的值小于
Num2的值,应把Num1和Num2的值交换;如果运算符是“÷”,让输入
余数的文本框可见,供用户输入余数,如果运算符不是“÷”,则让
输入余数的文本框不可见;最后使用Select Case…End Select语
句测试Op的值来判断对Num1和Num2进行哪一种运算,得到标准答案
(存放在变量Standard和Standardb中)并产生相应的题目字符串
(存放在变量Question中)。
(3)在VB.NET中,要使用通用过程,必须先定义。通用过程
可以在窗体或模块中定义。通用过程的定义
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
如下。 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 [格式]:[Private|Friend|Public|Protected|Protected Friend] Sub
过程名(<形式参数列表>))
[<局部变量和常量说明>]
执行部分
[Exit Sub]
执行部分
End Sub
[功能]:建立一个由“过程名”标识的通用过程。
[说明]:
①在Sub和End Sub之间是描述过程操作的一段程序,称为子程序体或过程
体。
②以关键字Private开头的通用过程是模块级的(私有的)过程,只能被本
模块内的事件过程或其它过程调用。以关键字Public选项开头的常用过程是公
有的或全局的过程,在应用程序的任何模块中都可以调用它。以Friend开头的
通用过程只能在本项目或组件的范围外,被其它过程调用。Protected与类的继
承有关,在面向对象的章节中进行介绍。 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 ③过程体由合法的VB.NET语句组成,过程体中可以含有多个“ Exit
Sub”语句,程序执行到“Exit Sub”语句时提前退出该过程,返回到主调
过程中调用该过程语句的下一条语句。
④“过程名”是标识符,过程名必须唯一。
⑤“参数列表”中的参数称为形式参数(简称形参),它可以是变量
名或数组名。若有多个参数时,各参数之间用逗号分隔。VB.NET的过程
可以没有参数,但一对圆括号不可以省略。不含参数的过程称为无参过
程,带有参数的过程称有参过程。每个形参的定义格式有以下几种:
[格式1]:[Optional] ByVal 变量名 As 类型说明符
[格式2]:[Optional] ByRef 变量名 As 类型说明符
[格式3]:ByVal|ByRef ParamArray 参数数组名() As 类型说明符 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 [功能]:定义形参。
[说明]:ByVal表示其后的形参是按值传递参数或称为“传值”方式。
ByRef表示其后的参数是按引用传递参数,或称“传址”方式。如果形式
参数之前有Optional关键字,则表示该参数是一个可选参数。
ParamArray关键字用来声明参数数组,参数数组可以用来接受任意多个
实参。格式1和格式2中的变量名也可以是数组名,若是数组名应在其后
加上圆括号“()”。
(4)通用过程可以在窗体中建立也可以在模块中建立。
在窗体中建立通用过程的一般步骤如下:
①在“解决方案资源管理器”窗口中,找到需要的窗体并双击它;
②打开代码窗口;
③滚动代码,找到文字“Windows 窗体设计器生成的代码”所在位置;
④直接在该段文字的下方输入要建立的通用过程。 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 通用过程还可以定义在模块文件中,模块文件是以.vb为
扩展名的文件。一个模块代码是以Module开头,以End Module结尾。可
以将各窗体都公用的过程或函数都放在模块中,这样可使程序更加清晰、
易懂、便于维护。为在模块文件中建立通用过程,首先应为项目添加模
块。为项目添加模块并在模块中建立通用过程的一般步骤如下:
①执行“项目”→“添加模块”命令,将会出现如图4-4所示的“添加新
项”对话框。
②在“添加新项”对话框的右边的“模板”框内选中“模块”图标,在下
面的“名称”后面的文本框中输入模块文件名(图中为“Module1.vb”),
然后按“打开”按钮,则将在代码窗口中显示建立起来的该模块的模板,
如图4-5所示。 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程图4-4 “添加新项”对话框 图4-5 创建的模块文件的模板 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 ③在图5-6的插入点所在处可以输入要建立的通用过程代码。
④单击工具栏上的“”、“”按钮或执行“文件”→“保存Module1.vb”命令,都
会把模块文件保存起来,同时也保存了建立在其中的通用过程。
6.在窗体的空白部分双击,将会出现窗体的Load事件过程框架,在其中输
入事件过程代码,如下。
Private Sub frmMath_Load(ByVal 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 Sub4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 说明:
(1)事件过程是一种Sub过程。当某个对象对一个事件的发生做出
响应时,VB.NET就会自动地执行与该事件相关的事件过程。上述代码就
是窗体frmMath的Load事件过程代码,该事件过程在窗体加载时被执行。
(2)发生某对象的某事件时,可能会执行该对象的相应事件过程
代码,执行的前提是该对象的相应事件过程已经定义。事件过程的定义
格式如下。
[格式]:Private Sub 对象名_事件名([<形式参数列表>])
[局部变量和常量说明]
执行部分
End Sub
[功能]:建立一个事件过程。 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 [说明]:
① 一个对象的事件过程名前都有一个“Private”关键字,这表示该
事件过程只能在定义的模块中被调用,在该模块之外不能被调用,即它
的使用范围是模块级的。
②事件过程名是由对象的实际名称(Name属性值)、下划线和事件
名组合而成的。其中事件名是VB为某对象能触发的事件所规定的名称,
不能自己命名,如Click、Load等都是事件名。例如在Button1控件上单
击,将会调用名字为Button1_Click的事件过程。
③“形式参数列表”表示该事件过程所具有的参数个数和参数类型,
由VB系统的事件本身所决定,用户不能随意添加。如Load事件过程就没
有参数。
(3)在VB.NET中,建立事件过程有专门的方法,其操作步骤如下:
① 打开代码窗口(或称代码视图、代码编辑器窗口); 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 双击窗体或控件,即可打开“代码”窗口,在代码窗口的上方有两个
列表框,分别为“对象”列表框和“事件过程”列表框
② 在“代码”窗口的“对象”列表框中选择一个对象,如选择
Button1,如图4-6所示。 图4-6 在代码窗口的对象列表框中选择对象名
③在“事件过程”列表框中选择一个事件过程后,如选择Click,如图4-7所示。 图4-7 在代码窗口的事件过程列表框中选择事件过程名 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 选择事件过程后,就会在代码窗口中自动产生该事件过程的模板,如
图4-8所示。此时就可以在插入点处编写在发生Button1_Click事件时应
该执行的代码了。 图4-8 产生的Button1_Click事件过程模板
事件过程定义与建立在前面章节中的几乎每个任务中都要用到,这里不再举例。 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 (4)程序中的语句“ShowQuestion()”的作用是调用通用过程
“ShowQuestion”。定义通用过程时,通用过程并没有执行,通用过程只
有在被调用时才被执行。在VB.NET中调用通用过程通常采用以下两种方
法。
①直接使用通用过程名调用通用过程
该方法的语法格式及功能如下:
[格式]:通用过程名([实际参数列表])
[功能]:调用执行“通用过程名”指定的过程。
[说明]:“实际参数列表”的参数要依次传递给通用过程的形参列表
中的形参,如果通用过程无形参,“实际参数列表”可缺省。“实际参数
列表”可能有多个参数,参数之间用“,”分隔开。
②使用Call关键字调用通用过程 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 该方法的语法格式及功能如下:
[格式]:Call 通用过程名([实际参数列表])
[功能]:调用执行“通用过程名”指定的过程。
[说明]:该方式与①功能完全一样。该方式由于在过程前面使用了
Call关键字,可以使程序的可读性增强,使用户一眼就可以看出这是一
个过程调用语句。如上述代码中的语句“ShowQuestion()”还可以写成
“Call ShowQuestion()”。
(5)某对象的事件过程在发生该对象的相应事件时由系统自动调
用,而通用过程则是在程序中通过过程调用语句调用才能执行,通过过
程可以被事件过程、通用过程或函数过程调用,把调用其它过程的过程
称为主调过程,把被其它过程调用的过程称为被调过程。
7.执行程序,会发现界面上出现了一道题目,但用户不能做题,
因为“确定”等按钮的Click事件代码尚没有编写。 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 (4)程序中的语句“ShowQuestion()”的作用是调用通用过程
“ShowQuestion”。定义通用过程时,通用过程并没有执行,通用过程只
有在被调用时才被执行。在VB.NET中调用通用过程通常采用以下两种方
法。
①直接使用通用过程名调用通用过程
该方法的语法格式及功能如下:
[格式]:通用过程名([实际参数列表])
[功能]:调用执行“通用过程名”指定的过程。
[说明]:“实际参数列表”的参数要依次传递给通用过程的形参列表
中的形参,如果通用过程无形参,“实际参数列表”可缺省。“实际参数
列表”可能有多个参数,参数之间用“,”分隔开。
②使用Call关键字调用通用过程 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 8.编写“确定”按钮的Click事件过程代码,如下。
Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button1.Click
If Op = 4 Then '如果是除法运算
Answer = Val(TextBox3.Text) '得到用户输入的商
Answerb = Val(TextBox4.Text) '得到用户输入的余数
'把用户答案连接到Question中
Question = Question + TextBox3.Text + "......" +
TextBox4.Text
If (Standard = Answer) And (Standardb = Answerb) Then ‘如果用
户答对了
Question = Question + " √" '在Question后面连接一个"√"号
RightNum = RightNum + 1 '答对的题数目加1
Else '如果答错了 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 Question = Question + " ×" '在Question后面连接一个"×"号
WrongNum = WrongNum + 1 ‘答错的题数目加1 End If
Else '如果是“+”、“-”、“*”等运算
Answer = Val(TextBox3.Text) '获取用户输入的答案
Question = Question + TextBox3.Text '把用户答案连接到Question中
If (Standard = Answer) Then '如果用户答对了
Question = Question + " √" '在Question后面连接一个"√"号
RightNum = RightNum + 1 ‘答对的题数目加1 Else '如果答错了
Question = Question + " ×" '在Question后面连接一个"×"号
WrongNum = WrongNum + 1 ‘答错的题数目加1 End If
End If
TextBox5.Text = Str(RightNum) '显示答对题数目
TextBox6.Text = Str(WrongNum) '显示答错题数
Question = "(" + CStr(i) + ")." + Question '在Question变量前连上题号
ListBox1.Items.Add(Question) '显示用户回答本题的情况
Question = "" i = i + 1 '题号加1
If i <= N Then Call ShowQuestion() '显示题目 Else
MsgBox("题目已做完!", , "提示")
Button1.Enabled = False '确定按钮不可用
End If End Sub4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 说明:
上述代码的作用是先判断运算符是否是“÷”运算,如果是则获取用户
输入的商和余数,并把它们连接到题目字符串中(Question),形成用
户的答案信息,然后判断用户答案和标准答案是否一致,若不一致则把
“×”连接到题目字符串之后,并把答错题目数加1,如果一致则把“√”
连接到题目字符串之后,并把答对题目数加1。如果不是“÷”运算,就
不需获取用户输入的余数信息,其它的处理都是一样的。接着显示答错、
答对题目数并把题目信息字符串Question添加到列表框中显示出来。最
后判断是否已经做满了10道题,如果不满10道题,则调“ShowQuestion”
显示下一道题,否则使“确定”按钮不可用。
9.编写“重新开始”按钮的Click事件过程代码,如下。 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Randomize() '随机数初始化
i = 1 '当前题目为第一题
RightNum = 0 '答对的题数目为0道
WrongNum = 0 '答错的题数目为0道
TextBox5.Text = "0" : TextBox6.Text = "0" '显示答对答错的编辑框为空
ListBox1.Items.Clear() '清除列表框中的内容
ShowQuestion() '显示题目
Button1.Enabled = True '“确定”按钮可用
End Sub
说明:
该过程的作用是对各变量进行初始化,然后调用“ShowQuestion”过程显示
第一道题。
10.编写“退出”按钮的事件过程代码,保存项目。然后运行程序,对程序
的功能进行测试直到正确无误。至此本任务全部完成。 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 归纳说明:
过程是结构化模块化程序设计的需要,同时使用过程
也可以使代码得到重用(多次被调用),使程序编写变得
简单。在VB.NET中有两类过程:Sub过程(又称子过程)和
Function过程(又称函数过程),Sub过程又可分成两类:
通用过程和事件过程。在本任务的实现过程中,详细讲解
了事件过程的概念、定义语句与创建方法,讲解了通用过
程的概念、定义语句、创建方法和调用方法。并讲解了事
件过程和通用过程的区别:事件过程由系统在发生对应事
件时执行,而通用过程则是由过程调用语句调用执行。 4.2 四则运算测验程序——Sub过程4.2 四则运算测验程序——Sub过程 思考与实训:
1.为什么要使用过程?在VB.NET中,有哪几类过程?
2.事件过程和通用过程的主要区别是什么?
3.仔细思考为什么本任务要编写一个ShowQuestion过程?如果没
有编写该过程,程序应该怎么编?
4.编写一个通用过程,用来在Label1标签中显示十行“欢迎您参加
Visual Basic培训班。”欢迎信息,然后在Button1按钮的Click事件过
程代码中调用该过程显示出欢迎信息。
5.编写一个实现如下功能的通用过程:要求用户输入姓名,然后
输出若干行如下信息:“欢迎***同志参加VB.NET讨论会!”,输出的行
数由用户决定。然后编写程序调用该过程进行验证。
提示:通用过程应该有两个参数,一个参数用来接收用户名,一个参数用
来接收要显示的行数。与本任务中的ShowQuestion过程不一样,ShowQuestion
是一个无参过程,而题中的过程是一个有参过程,请参照过程的定义语句格式
和调用语句格式定义过程和调用过程。 4.3 用Function过程实现话费计算程序 4.3 用Function过程实现话费计算程序 任务4-3描述:
编写程序把任意十进制数转换成N进制数(N<=16)。要求:数制转换用过程来实现。程序设计界面如图4-14所示,程序运行界面如图4-15所示。
图4-14 程序设计 图4-15 程序运行界面4.3 用Function过程实现话费计算程序 4.3 用Function过程实现话费计算程序 任务分析:
为把十进制数NUM转换为N进制数,可采用除N取余法,具体实现过程可描述如
下:
(1)定义一个由十六个元素组成的字符数组,给它的元素分别赋“0”~“9”、
“A”~“F”,用来表示对应的进制数的字符(本题只考虑到十六进制)。该字符集
把它称为转换字符集,其中的字符称为转换字符。
(2)十进制数NUM除以N后得到一个余数,以该余数作为下标从(1)中定义
的数组中取出相应数组元素中的字符,该字符就用转换后的一位数字的符号表
示。
(3)定义一个存放结果的字符串数组。用NUM的值除N取余数,根据余数得到
转换字符(方法如第(2)步所述),把转换字符按序存放到存放结果的字符串
数组中,把NUM值除以N的商赋给NUM;再用NUM的值除N取余数, 根据余数得到转
换字符,把转换字符按序存放到存放结果的字符串数组中,……反复进行,直
到NUM的值为0时为止。此时把存放结果的字符串数组中的数据反序存放,就是
转换的结果
4.3 用Function过程实现话费计算程序4.3 用Function过程实现话费计算程序 任务实现:
1.启动VB.NET,新建一个项目,项目类型为“Windows应用程序”,项目的存放位置为“D:\VBTASK\CH04”,项目名为“Task4_3”。
2.把Form1窗体的Text属性值设置为“十进制数转换为其它进制数”,把它的Name属性值设置为“frmTenToOther”。单击“解决方案资源管理器”中的“Form1.VB”窗体,然后在属性窗口中把它文件名属性设置为“frmTenToOther.vb”。然后执行【项目】→【Task4_3属性】命令,在出现的“Task4_3属性页”对话框中把“启动对象”设置为“frmTenToOther”。
3.对照程序设计界面,为窗体添加控件并设置控件的属性。控件的属性设置如表4-2所示。4.3 用Function过程实现话费计算程序4.3 用Function过程实现话费计算程序4.在代码窗口中定义模块级变量,如下。 Dim N As Integer '要转换成几进制
Dim Num As Integer '要转换的十进制数
5.编写一个Trans通用过程,该过程的代码如下。
Private Sub Trans(ByVal Num As Integer, ByVal N As Integer, ByVal Dest() As Char, ByVal StandardSet() As Char)
Dim R, K As Integer 'R存放余数,K表示下标
Dim T As Char '交换用中间变量
Dim I As Integer '数组反序存放的第一个下标
Dest(K) = StandardSet(R) '以N为下标求出字符集中的对应字符并赋值给DEST[K]
K = K + 1 '下标加1
Num = Num \ N '把Num除以N的商赋给Num
Dest(I) = Dest(K)
Dest(K) = T '交换DEST[I]和DEST[K]
I = I + 1 'I的值加1
K = K - 1 'K的值减1
End While
End4.3 用Function过程实现话费计算程序4.3 用Function过程实现话费计算程序 说明:
该过程有四个参数,参数Num表示待转换的十进制数参
数N表示要转换成几进制,参数Dest是一个数组,表示转换
的结果,参数StandardSet表示转换字符集。该过程采用了
数组作为过程的参数。
6.编写文本框TextBox1的LostFocus代码,如下。
Private Sub TextBox1_LostFocus(ByVal sender As
Object, ByVal e As System.EventArgs) Handles
TextBox1.LostFocus
N = Val(TextBox1.Text) '获得要转换为的进制数
Label4.Text = CStr(N) + "进制数"
End Sub
4.3 用Function过程实现话费计算程序4.3 用Function过程实现话费计算程序
说明:
文本框控件能够响应LostFocus事件,该事件是在对象失去焦点时发生。上述代码的作用是当TextBox1对象失去焦点时,把用户输入的数存放到N中,并在Label4标签中显示出来。
7.运行程序,在TextBox1中输入16,然后把焦点移到下一个文本框中,会发现Label4标签显示的文字变为“16进制数:”。
8.编写文本框TextBox2的LostFocus代码,如下。
Private Sub TextBox2_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox2.LostFocus
Num = Val(TextBox2.Text) '获得要转换的数
End Sub
说明:
上述代码的作用是当TextBox2失去焦点时,把用户输入的待转换的数存放到变量Num中去。4.3 用Function过程实现话费计算程序4.3 用Function过程实现话费计算程序9.编写Button1按钮的Click事件过程代码,如下。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim I As Integer '循环变量
Dim CharSet(15) As Char '存放转换字符集的字符数组
Dim DestCharSet(100) As Char '存放转换的结果的字符数组
Dim DestString As String '存放转换结果的字符串
For I = 0 To 100 '给存放结果的字符串数组的每个元素赋初值chr(0)
DestCharSet(I) = Chr(0)
Next I
For I = 0 To 9 '给存放转换字符集的字符数组前10个元素赋初值"0"~"9"
CharSet(I) = Chr(I + 48) Next I
4.3 用Function过程实现话费计算程序4.3 用Function过程实现话费计算程序For I = 0 To 5 '给存放转换字符集的字符数组后6个元素赋初值"A"~"F"
CharSet(10 + I) = Chr(Asc("A") + I)
Next I
'调用Trans过程,把Num转换成N进制数,结果存放到DestCharSet字符数组中
Call Trans(Num, N, DestCharSet, CharSet)
I = 0 '变量i的值设为0,是第一个元素的下标
DestString = "" '存放转换结果的字符串赋初值为空串
While DestCharSet(I) <> Chr(0) '如果DestCharSet[i]中存放的是一个有效字符
DestString = DestString + DestCharSet(I) '把该字符连接到结果字符串DestString中
I = I + 1 'i的值加1
End While TextBox3.Text = DestString '显示转换结果字符串
End Sub4.3 用Function过程实现话费计算程序4.3 用Function过程实现话费计算程序 说明:
(1)语句“Call Trans(Num, N, DestCharSet, CharSet)”的作用是调用过程Trans把十进制数Num转换成N进制,转换结果存放在DestCharSet字符串数组中。
(2)数组可以作为函数的参数,数组作为形式参数的一般定义形式如下:
ByVal 形参数组名() As 类型说明符 或 ByRef 形参数组名() As 类型说明符
如本任务中的过程定义:
Private Sub Trans(ByVal Num As Integer, ByVal N As Integer, ByVal Dest() As Char, ByVal StandardSet() As Char)
其中,Dest和StandardSet都是形参数组名。
在调用带用形参数组的过程时,只需将对应的实参数组名放在实参表中即可,实参数组名后面不需带圆括号。
如本任务中的过程调用为:
Call Trans(Num, N, DestCharSet, CharSet)
其中,DestCharSet和CharSet都是实参数组名。
在被调过程中,可以对形参数组用Redim重新定义大小。若形参数组是按值传递的参数,则在被调过程中无论是改变形参数组元素的值还是重新定义形参数组的大小,均不会影响对应的实参数组。若形参数组是按引用传递的参数,则在被调函数中改变了形参数组某元素的值也将影响到实参数组对应元素的值,若在被调函数中改变了形参数组的大小,则实参数组的大小也随之改变。 4.3 用Function过程实现话费计算程序4.3 用Function过程实现话费计算程序 10.编写“退出”按钮的事件过程代码,保存项目。然后运行程序,对程序的功能进行测试直到正确无误。至此本任务全部完成。
归纳说明:
使用变量作为过程的参数,一个变量只能传递一个数据。当需要在过程之间传递多个数据时,可使用数组作为函数的参数。在本任务的实现过程中,主要讲解了数组作为形参的定义方法是“数名组() As 数据类型”,讲解了在调用过程时对应的实参数组只要写数组名即可。通过本任务的学习,读者也能够根据需要灵活地使用数组作为过程的参数。4.3 用Function过程实现话费计算程序4.3 用Function过程实现话费计算程序 拓展与提高:
数组可以作为形参,当形参数组前有ParamArray关键字则表明该数组是参数数组,通过参数数组可以向函数传递个数变化的参数。关于参数数组,需掌握以下几点。
(1)若形参表中含一个参数数组,则该参数数组必须位于形参列表的最后;
(2)参数数组必须是一维数组;
(3)不允许将ParamArray关键字与ByRef关键字组合起来使用;
(4)与参数数组对应的实参可以是同一类型的数组名,也可以是任意多个与该数组的元素属于同一类型的变量;
(5)除了允许调用中有数目可变的参数外,参数数组与同类型的一个或多个值参完全相同。但如果传给参数数组的是一个数组名,就相当于按地址传递;
(6)参数数组也是一个隐式的可选参数。4.3 用Function过程实现话费计算程序4.3 用Function过程实现话费计算程序 例如,在窗体上添加一个名称为Button1的按钮和一个名称为Label1的标签控件,然后编写如下程序代码。
Private Sub ParamsMeth(ByRef Sum As Integer, ByVal ParamArray Arr() As Integer)
Dim i As Integer
For i = 0 To UBound(Arr, 1) '求和并改变数组arr的各元素值
Sum = Sum + Arr(i) : Arr(i) = Arr(i) * Arr(i)
Next i
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a() As Integer = {1, 2, 3}
Dim i As Integer, s As Integer = 0
ParamsMeth(s, a) '调用方法
Label1.Text = "第一次调用和为:" & s & Chr(10) + Chr(13) '输出调用方法求得的和
For i = 0 To UBound(a, 1) '输出各数组元素
Label1.Text = Label1.Text & "a(" & i & ")=" & a(i) & Chr(10) & Chr(13)
Next i
s = 0
ParamsMeth(s, 23, 45) '再次调用方法
Label1.Text = Label1.Text & "第二次调用和为:" & s '输出求得的和
End Sub4.3 用Function过程实现话费计算程序4.3 用Function过程实现话费计算程序 归纳说明:
函数过程与通用过程一样都是执行一个程序,但函数过程与通用过
程又有不同,就是函数过程能够返回一个值,这个值称为函数返回值或
函数值。在定义过程中使用的参数称为形式参数,在调用过程时使用的
参数称为实际参数。在本任务中,通过两个话费计算函数过程的定义和
调用,详细讲解了函数过程的定义与调用方法。 4.3 用Function过程实现话费计算程序4.3 用Function过程实现话费计算程序拓展与提高:
主调过程在调用被调过程时,需要把实际的数据作为实际参数传递给被调过程的形式参数,我们把这个过程称之为参数传递。需注意的是:过程调用时实际参数的个数、类型和含义应与形式参数的个数、类型和含义一致。
在VB.NET中参数传递有两种方式:按值传递和按引用传递(按地址传递)。
1.按值传递参数
定义形参时,形参前加上“ByVal”表示该形参是按值传递的形参。若参数按值传递,则在过程调用时,VB.NET为形参按其类型分配临时存储空间,并将实参的值复制到临时存储空间中去。换句话说,按值传递时,传递的只是实际参数的拷贝。在被调过程中若改变了形参的值,也仅仅是改变了临时存储空间中的内容,而不会影响实参本身的值。一旦过程执行结束,返回主调过程时,形参占用的临时存储空间被释放,形参的值也就不存在了。 4.3 用Function过程实现话费计算程序4.3 用Function过程实现话费计算程序 可见按值传递参数是一种单向传递,即实参的值能够传
形参,但对形参的改变却无法影响到实参。
图4-9 程序设计界面
例如,假设某程序的设计界面如图4-9所示,第一个文本框和第二个文本框名称分别为TextBox1和TextBox2。程序中定义了一个Swap的通用过程,并在Button1按钮的Click事件过程中对它进行调用,具体代码如下。 4.3 用Function过程实现话费计算程序4.3 用Function过程实现话费计算程序 Private Sub Swap(ByVal a As Integer, ByVal b As Integer) '该过程试图把a和b的值交换过来
Dim t As Integer '中间变量
t = a : a = b : b = t
End Sub
Private Sub Button1_Click(……(省略参数)) Handles Button1.Click
Dim x, y As Integer '存放输入的两个数
x =