版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、,结构化程序主要采用自上而下、逐步细化的设计方法,即先全局后局部、先整体后细节、先抽象后具体的设计方法。,自顶向下、逐步求精:其程序结构是按功能划分为若干个基本模块,这些模块形成一个树状结构;各模块之间的关系尽可能简单,在功能上相对独立;每一个模块内部均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。,结构化程序设计思想,8.1.1模块化的程序设计,程序模块化分图,结构化程序的组织结构:在结构化程序中常用模块化结构来组织程序,一个应用程序的组成,在VB中子过程分为通用过程和事件过程两类,通常将Sub过程、Function过程称为通用过程。,在一些重复性的应用中,把共享
2、的代码定义成过程往往使程序更容易调试和理解。,通用过程:一般由应用程序来调用,不与特定的事件相关联。一般存储在窗体或标准模块中。通用过程的主要目的之一就是对于经常调用的操作不必重复代码,也容易维护应用程序。,主过程调用子过程后,程序进入子过程执行,完成后返回主程序接着执行下面的语句。,事件过程:事件过程通常和窗体相关联,当某个事件发生时调用对应的事件过程,如命令按钮的Click()过程等。,事件过程是VB自动生成的,在“代码编辑器”中从“对象框”中选择一个对象,从“事件框”中选择一个事件,系统就会自动生成对应的事件过程。,1.Sub子过程,以Sub保留字开始的过程称为子过程,子过程通常是为了完
3、成某种特定的功能而编写的,(1)子过程的语法是:,Private|PublicStaticSubname(arglist)过程语句ExitSub过程语句EndSub,可选。决定此过程的作用域。与变量的声明是相同的,若没有指定则默认是公用的。,子过程名,要传递给子过程的参数列表。多个参数用逗号隔开,可选。决定此过程内的变量的生命周期,若没有指定则在过程执行完毕后,过程内的局部变量会消失,8.1.2子程序和函数,Arglist中的参数的语法是:,ByVal|ByRefvarname()Astype,Arglist中的参数的语法参数说明:,ByVal:表示该参数按值传递。即在调用该过程时,传递给过程
4、的是参数的值。,ByRef:表示该参数是按地址传递,即在调用该过程时,传递给过程的是参数在内存中的存放地址,也就是参数本身。ByRef是VisualBasic的默认选项。,varname:参数的名称。,type:可选项。传递给该过程的是参数的数据类型,可以是Byte,Boolean,Integer,Long,Currency,Single,Double,Date,String(只支持变长),Object或Variant。,(2)子过程中所使用的变量(分为两类):,子过程中使用的第一类变量是在过程内显式定义的局部变量;另一类是没有显式定义的变量(除非这一类变量在该过程外更高级别的位置有显式定义,
5、否则也是局部的)。,特别注意:若过程内显式定义的变量和高于其级别的模块级别中定义的变量名称相同,则过程会优先使用过程内定义的变量。,特别注意:不能使用GoSub,GoTo或Return来进入或退出Sub过程。,例8.1:变量定义演示,变量定义演示程序,2.函数过程,类似于系统的内部函数。VB还提供了以Function保留字开始的函数过程,以实现特定的功能。,函数过程的语法是:,Private|PublicStaticFunctionname(参数列表)Astype过程语句name=返回值ExitFunction过程语句name=返回值EndSub,函数过程使用的说明:,在函数过程的语法中,可选
6、的Public,Private以及Static和变量的修饰意义相同。规定了此过程的有效区间和生存周期。,函数过程名以及参数列表的规定和子过程相同。,函数过程中的变量和子过程相同,在函数过程中可以使用外部显示定义的变量,但应注意改变它的值对整个程序造成的影响。,函数过程与子程序最大的区别:函数在其代码执行完退出时返回给调用者一个结果值,调用者能够得到该值并利用它进行其它运算,而子过程只是去做一件不事情,不提供返回值。,8.1.3过程的创建与调用,1.创建和修改过程,创建过程的方法:,选中要添加过程的代码窗口,通过“工具”菜单中的“添加过程”选项来完成新过程的创建。,对于熟练的编程人员,可以直接在
7、代码窗口内按照规定的语法格式输入过程名和参数,系统会自动使用“EndSub”或“EndFunction”来补充全过程。,要在当前模块中查看现有的通用过程,可以在“代码”窗口的“对象框”中选择“通用”,然后在“过程框”中选择对应的程序;查看事件过程,可以在“代码”窗口的“对象框”中选择适当的对象,然后在“过程框”中选择现有的过程;如果想查看其它模块的过程,可以使用“对象浏览器”。,2.调用过程,调用Sub子过程的两种方法:,直接使用过程名调用:,使用Call语句调用:,Call过程名(参数列表),注意:当用Call调用语句时,参数必须在括号内。若省略Call关键字,则必须省略参数两边的括号。,过
8、程名参数列表,注意:因为子过程不返回值,所以以上两种调用方法都是单独的可执行语句,不能作为表达式的一部分参与运算或者赋值。,求长方形面积,时间延时示例程序,调用函数过程的方法:,除了可以使用调用子过程的两种方法调用函数过程之外,还可以像调用VB内部函数的方法一样,直接书写函数作为表达式的一部分。,注意:若需要调用其它模块内的过程,只需在过程名前加上模块名和“.”即可:模块名.过程名(参数列表),例8.2:编写函数求解1!+2!+3!+4!+N!,其中N由程序输入,例8.2程序,求最大公约数函数,伪随机数的生成方法,再次强调子过程和函数过程的区别:通常子过程可以完成用户指定的功能,但子过程不返回
9、值;利用函数过程即可以得到一个值的返回,在程序的任何地方都可以用“函数过程名=返回值”来给函数过程名赋值。Astype参数规定了过程返回值的类型,默认为变体类型。,例8.3:编写过程完成两个整数的互换与求和,例8.3示例程序,8.1.4参数传递,通常过程和调用它的主过程之间都存在着数据传递,这在使用函数过程的时候更为明显,VB使用参数列表这一形式来完成这个传递过程。,过程本身使用的参数列表称为“形参”,而主程序传递给过程的真正参数称为“实参”,过程在被调用的时候,用实参代替本身的形参,从而完成对真正数据的操作。,在“实参”代替“形参”的传递过程中,VB提供了两种传递方式:按数值传递和按地址传递
10、,通过ByVal和ByRef参数来指定。ByRef即按地址传递为默认传递方式。,1.按数值传递参数,在以ByVal参数指定的参数列表中,参数使用的是按值传递,系统会为变量作一个副本,把副本作为真正的参数传递过去,若过程里面改变了这个变量的值,则所作的变动只影响副本而不会影响变量本身。即是单向传递。,例8.4:演示调用前和调用后的变量的变化,例8.4示例程序,P99按值传递参数示例程序,2.按地址传递参数,与按值传递相反。若参数采取的是ByRef传递,那么传递给过程的将是真正实参本身,过程中对形参的改变都将永远改变实参的值。此种参数传递方式在VB中比较少用。,特别说明:为什么按地址传递参数将永远
11、改变实参的值?因为此种参数传递方式,实质是过程在被调用的瞬时,形参和实参共同占用内存单元,这样,若在过程中形参的值被改变,即是实参的值改变。,例8.5:与例8.4类似,改变AddX子过程的参数传递方式,观察程序运行的结果,例8.5示例程序,3.数组在参数传递和返回值中的应用,数组作为函数参数示例1程序,VB中允许数组作为实参和形参,但数组只能通过传址方式传递,且数组不能使用变体类型数组,在形参和实参列表中,只能放入数组的名称(但括号不能省略),不能放入维数。过程可以使用Lbound和Ubound函数来得到参数数组的上下界。,数组作为函数参数示例2程序,求定积分程序,P100例8-1示例程序,P
12、101例8-2示例程序,P102例8-3示例程序,P103例8-4示例程序,P105例8-5示例程序,P105例8-6示例程序,定义函数时如果参数前加上Optional关键字,就代表此参数是可选的。并且此参数后的所有参数都必须定义为可选的。对于可选参数的使用,常用的方法是给可选参数指定一缺省值。,一般而言,过程中调用的参数个数应该等于过程定义的参数个数。但若在参数前加上ParamArray关键字,过程将可以接受任意个数的参数。,4.SubMain过程,在VB中,SubMain为一个特殊的过程,在缺省情况下,应用程序的第一个窗体被指定为启动窗体,程序运行的表现即由启动窗体显示出来。若需要在显示之
13、前进行一些操作或程序根本就不需要窗体,则可用SubMain过程来实现。,调用SubMain过程的方法:,在“启动对象”下拉列表中,选取SubMain作为启动对象。,从“工程”菜单中,选取“工程属性”中的“通用”选项卡。,在标准模块中书写一个名称为Main的子过程,这样,程序启动后将会第一个执行Main过程,在这个过程里面可以装入需要显示的窗体或进行数据的输入、用户的认证等操作。,特别说明:SubMain过程只有创建在标准模块中才能被指定为启动过程,在其它模块中都不能启动程序。,例8.6:SubMain过程示例(下面代码根据用户名称的不同打开不同的窗体,例8.6示例程序,在程序中,函数的概念与数
14、学中函数的概念类似。函数是一种特定的运算,能完成特定的操作。例如:用于求一个数的平方根、正弦值等。由于这些运算或操作中程序中会经常用到,为此,VisualBasic提供了大量的内部函数供用户在编程时调用。,内部函数按功能可分为数学函数、转换函数、字符串函数和日期函数和格式函数等。,8.2.1数学函数,数学函数用于完成一些基本的数学计算,其中一些函数的名称与数学中相应函数的名称相同。,关于数学函数的一些说明:,在三角函数中,参数以弧度表示。如,函数Sin(30)中的30是指弧度,而不是30。为了将我们熟悉的角度转换为弧度,可以将角度乘以PI/180;若将弧度转换成角度,则将弧度乘以180/PI。
15、其中PI是数学常数,值为3.141592653897932。,Int函数和Fix函数的不同之处在于,若参数n为负数,则Int返回小于或等于该参数的第一个负整数,而Fix则会返回大于或等于该参数的第一个负整数。如Int(-8.4)=-9,而Fix(-8.4)=-8。,常用数学函数,函数Sgn将根据参数n的不同取值,返回不同的值。若n0,则Sgn(n)=1;若n=0,则Sgn(n)=0;若n0,则Sgn(n)=-1。,随机函数Rnd(n)返回一个介于01之间(不包括0和1)的单精度随机数。参数n的值决定了Rnd生成随机数的方式:,(1)若n0,则根据n的值,返回一个特定的随机数。,(2)若n0或省
16、略,则返回随机序列中的下一个随机数。,(3)若n=0,则返回与上一次产生的相同的随机数。,Rnd函数所产生的随机数的序列取决于“种子”的初始值。对最初给定的种子都会产生相同的序列,因为每一次调用Rnd函数都用数列中的前一个数作为下一个数的种子。,使用Randomize(number)语句可初始化随机数生成器,将“种子”的初值指定为参数number的值。,如何使用Rnd函数?,为了使每次调用Rnd函数能产生不同的随机序列,在调用Rnd之前,可先使用无参数的Randomize语句初始化随机数生成器,这样,随机数生成器具有根据系统计时器得到的种子。由于计时器不断变化,因此种子也就在不断变化。通常Ra
17、ndomize语句放在窗体的Load事件过程中。,为了生成某个范围内的随机整数,可使用以下公式:,Int(upperbound-lowerbound+1)*Rnd+lowerbound),随机数范围的上界,随机数范围的下界,8.2.2字符串函数,字符串函数用于完成对字符串的操作与处理,如获得字符串的长度、除去字符串中的空格以及截取字符串等。,关于字符串函数的一些说明:,InStr(n1,s1,s2,n)函数用来返回一个字符串在另一个字符串中第一次出现的位置,若没有则返回0。该函数有四个参数,其中参数s1和s2是必选的,s1指接受搜索的字符串,s2是指要搜索的字符串;参数n1和n是可选的,参数n
18、1用于指定搜索的开始位置,若省略,则从第一个字符开始搜索。,常用字符串函数,如:s1=“XXyXXyXXYXXP”s2=“Y”MyPos=InStr(4,s1,s2,1)从第四个字符开始不区分大小写搜索,值为6MyPos=InStr(1,s1,s2,0)从第一个字符开始区分大小写搜索,值为9MyPos=InStr(s1,s2)从第一个字符开始区分大小写搜索,值为9MyPos=InStr(1,s1,“A”)没有找到“A”,值为0,参数n用于决定是否区分大小写,若n=0或省略,则区分大小写,即执行一个二进制比较;若n=1,则不区分大小写,即执行一个按照原文的比较。如果有n参数,则必须同时有参数n1
19、。,StrComp(s1,s2,n)函数用来返回两个字符串的比较结果,其中参数n的含义与InStr函数中参数n是相同的。若s1小于s2,则值为-1;若s1等于s2,则值为0;若s1大于s2,则值为1。,如:s1=“ABCD”s2=“abcd”MyComp=StrComp(s1,s2,1)返回0,即不区分大小写比较MyComp=StrComp(s1,s2,0)返回-1,即区分大小写比较MyComp=StrComp(s2,s1)返回1,即区分大小写比较,补充:字符串逆序的函数StrReverse(字符串),8.2.3日期函数,日期函数用于操作日期与时间,如获取当前的系统时间,求出某一天是星期几等。
20、,常用日期函数,关于日期函数的一些说明:,Time、Timer、Date、Now等四个函数都是无参函数,用于返回系统当前的日期和时间等。,既可以用Time和Date函数来获取当前的系统时间和日期,也可以使用它们来设置系统的时间与日期。,例8.7:获取并设置系统的日期与时间编写一个小程序,来获取当前的系统日期与时间,并重新设置系统时间为12点整,日期为2000年1月1日。编写窗体的Click事件过程如下:,PrivateSubForm_Click()Print“当前系统时间是:”/*直接调用本函数*/return(2*z);EndFunction,直接递归调用,间接递归调用,注意:递归过程中,使
21、用“栈”结构来存储数据:每调用一次自身,把当前的数据压栈一次,这称为“递推”,而在符合递推结束条件后(即不必再调用自身的时候),会逐次弹出压栈的数据,最终返回到初始调用的地方,称为“回推”。所以递归过程一定要有递推结束的条件,否则会造成压栈过程一直进行下去而导致溢出。,例8.8:有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人多少岁,他说比第3个人大2岁。问第3个人多少岁,又说比第2个人大2岁。问第2个人,说比第1个人大2岁。最后问第1个人,他说是10岁。请问第5个人多大?,显然,这是一个递归问题。要求第5个人的年龄,就必须知道第4个人的年龄,而第4个人的年龄也不知道,要求
22、第4个人的年龄就必须先知道第3个人的年龄,而第3个人的年龄又取决于第2个人的年龄,第2个人的年龄取决于第1个人的年龄。而且每一个人的年龄都比前1人的年龄大2岁。即:,age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10,可以用式子表示为:,回推过程,递推过程,从上图可知,求解可分成两个阶段:,第一阶段是“回推”,即将第n个人的年龄表示为第(n-1)个人年龄的函数,而第(n-1)个人的年龄仍然不知道,还要“回推”到第(n-2)个人的年龄,直到第1个人的年龄。此时age(1)已经知道,不必再向前回推了。,第二阶段,采用“递推”方法,从第1个人的已知年龄推算出第2个人的年龄(12岁),从第2个人的年龄推算出第3个人的年龄(14),一直推算出第5个人的年龄(18岁)为止。,即:一个递归的问题可分为“回推”和“递推”两个阶段。,递归求年龄程序,特别说明:在某一次调用age函数时并不立即得到age(n)的值,而是一次又一次地进行递归调用,到age(1)时才有确定的值,然后再递推出age(2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025~2026学年浙江省嘉兴市高二下学期期末检测生物试卷
- 2025~2026学年江苏省如东县马塘中学高二下学期期末考试生物试卷
- 2026 江苏 退役军人岗事业单位易错点巩固训练卷
- 2026年山东省职业院校技能大赛-高职组(婴幼儿健康养育照护赛项)考试题库(带答案)
- (2026年)幼儿园健康检查计划
- 期中综合素养卷(三)-2026-2027学年六年级语文上册(部编版)
- (2026年)护理质控年度工作计划
- 2026年ICU 重症哮喘呼吸机护理试卷及答案
- 2026年ICU 限制探视护理伦理辨析试卷及答案
- 2026年ICU 护理 PDCA 应用考核试卷及答案
- GB/T 12729.1-2026香辛料和调味品名称
- 2026广东深圳市交易集团限公司选聘28人易考易错模拟试题(共500题)试卷后附参考答案
- 2026年焊工技术比赛模拟试题(含答案)
- 第5课 生命最宝贵 课件(内嵌视频)2026-2027学年道德与法治四年级上册统编版
- 铁矿选矿技术概述培训课件
- 2026中国医生AI行为与态度调研报告抢先版
- 2026报关员面试题目及答案
- 小学一年级同音字大全(带拼音+组词+字义区分课本高频)
- 重庆航天科工集团笔试题
- 中国慢性肾脏病诊疗指南2025版
- 校园食品安全知识竞赛题库(附答案)
评论
0/150
提交评论