第六章子程序和函数.ppt

上传人:仙*** 文档编号:17920626 上传时间:2022-05-27 格式:PPT 页数:49 大小:258.50KB
返回 下载 相关 举报
第六章子程序和函数.ppt_第1页
第1页 / 共49页
第六章子程序和函数.ppt_第2页
第2页 / 共49页
点击查看更多>>
资源描述

《第六章子程序和函数.ppt》由会员分享,可在线阅读,更多相关《第六章子程序和函数.ppt(49页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第六章 函数和子程序独立模块的子程序独立模块的函数局部变量与全局变量STATIC选项和说明过程的递归调用块内子程序和块内函数模块化程序实际的思想根据软件工程学的原理和结构化程序设计的要求,应该将程序根据软件工程学的原理和结构化程序设计的要求,应该将程序分成若干个模块,每一个模块完成一个或几个功能,并给它定分成若干个模块,每一个模块完成一个或几个功能,并给它定义一个唯一的名字,以便调用,这就是所谓的义一个唯一的名字,以便调用,这就是所谓的“模块化模块化”。一个程序就包含一个主模块和若干个子模块。程序的每一个模一个程序就包含一个主模块和若干个子模块。程序的每一个模块可以是子程序或函数。模块又称过程

2、,块可以是子程序或函数。模块又称过程,“执行一个过程执行一个过程”就就是调有一个子程序或函数模块。是调有一个子程序或函数模块。这种做法使程序结构清晰,具有良好的可读性和易维护性。这种做法使程序结构清晰,具有良好的可读性和易维护性。独立模块的子程序()DECLARE SUB star(n AS INTEGER) 说明在程序中要调用一个名为说明在程序中要调用一个名为Star的子程序的子程序REM main program DIM I AS INTEGERFOR I=1 TO 3CALL Star(I) 调用子程序,并将调用子程序,并将I的值传递给的值传递给nNEXT IPRINTENDSUB St

3、ar(n AS INTEGER)DIM I AS INTEGERFOR I=1 TO nPRINT “*”NEXT IPRINTEND SUB独立模块的子程序nQBASIC提供独立模块的子程序和函数,这种子程序和主程序不在同一个模块中。它以SUB语句开头,以END SUB结束;SUB 子程序名(形式参数) 子程序体END SUBn子程序名最长可为40个字符。我们约定子程序名第一个字母用大写,子程序后可以没有形参,此时必须省略括号,变为: SUB 子程序名n形参的类型说明如下:变量名1 AS 类型名,变量名2 AS 类型名,注:如果形参是实型,则AS语可以省略。nSUB和END SUB 之间的语

4、句行称为子程序体,在子程序体内不可出现DATA语句,子程序体中的READ语句会到主程序体中的DATA语句中读取数据;n子程序不能嵌套定义,即在子程序体内不能再 出现SUB语句。子程序的调用(CALL 语句)n子程序调用的两种形式:CALL 子程序名(实际参数)子程序名 实际参数n实参的个数必须与所调用子程序中形参个数相同,实参和形参的类型必须按位置一一对应匹配,如果调用的子程序没有形参,则调用时子程序后面的一对括号必须省略,格式为: CALL 子程序名 或 子程序名;n实参可以是变量、常量、表达式;n主程序DECLARE语句表示本程序中将用子程序,如果在主程序中要调用两个子程序,则应有两个DE

5、CLARE语句。如果调用的子程序没有形参,但DECLARE 语句中子程序后的括号却不能少。DECLARE放在程序中所有可执行语句的前面。如果程序设计者未写DECLARE语句,则QBASIC会根据SUB语句所定义的子程序名和参数自动加上;nDECLARE语句中括弧内参数的个数和类型与子程序形参的个数和类型一致。n在子程序中还可以调用子程序,也可以调用它自身(递归调用)。子程序的输入n在QBASIC环境下,无论在哪个编辑窗口,只要在新一行键入子程序的初始行,如:SUB Star(n AS INTEGER),按回车键;如果已经输入主程序,将窗口Split,在其中的一个窗口中的主程序后键入子程序(该窗

6、口中的主程序会自动清除,而且存盘后另一窗口主程序的前面加DECLARE SUB 子程序名);通过View菜单的SUBs菜单项选择或激活要编辑的子菜单或主程序。模块之间数据传递-虚实结合n主程序或其它调用子程序的程序块称为“调用程序”。n在调用子程序时调用程序的实参和被调用的子程序的形参之间的数据传递,称为“虚实结合”。n在高级语言中,虚实结合有两种方式。(1)值传递方式:即实参把其值传递给形参,这种传递是“单向的”。(2)地址传递方式:这种方式是半实参的地址传递形参,实参与形象共占同一存储单元。定义自定义函数、独立模块的函数和子程序时的自变量称为定义自定义函数、独立模块的函数和子程序时的自变量

7、称为“形式参数形式参数”或或“虚拟参数虚拟参数”,简称,简称“形参或形参或“虚参虚参”。之所以。之所以称它为称它为“形式参数形式参数”,是因为所用的自变量并不是一个实际存在,是因为所用的自变量并不是一个实际存在的变量,在未调用函数时它并不具有确定的值。它只是在形式上的变量,在未调用函数时它并不具有确定的值。它只是在形式上存在的一个变量。在函数时被调用时它将被一个确定的值所代替。存在的一个变量。在函数时被调用时它将被一个确定的值所代替。 形式参数的名字叫什么并不重要。重要的是表达式所表示的函形式参数的名字叫什么并不重要。重要的是表达式所表示的函数关系和调用时所给定的实际参数。数关系和调用时所给定

8、的实际参数。 调用函数时函数名后面括弧中的参数称为调用函数时函数名后面括弧中的参数称为“实际参数实际参数”。它应。它应该是一个确定的值,它可以是常量或表达式。该是一个确定的值,它可以是常量或表达式。如果自定义函数的形象与程序中的变量名相同,它们并不代表如果自定义函数的形象与程序中的变量名相同,它们并不代表同一对象。同一对象。“形参形参”和和“实参实参”按地址传递参数若实参使变量,则调用子程序时,系统不为对应的形参另外开辟存储单元,若实参使变量,则调用子程序时,系统不为对应的形参另外开辟存储单元,而是把实参所占的存储单元的地址传送给子程序,使对应的形参具有相同而是把实参所占的存储单元的地址传送给

9、子程序,使对应的形参具有相同的地址,也就是说,形参将与对应的实参共用存储单元。的地址,也就是说,形参将与对应的实参共用存储单元。(参见参见samp6-2.bas)DECLARE SUB abc(aa!,bb!,xx!,yy!)REM maim programa=21.2 :b=12.1CALL abc(a,b,x,y)PRINT “a=”;a,”b=”;bPRINT “x=”;x,”y=”;yENDSUB abc(aa,bb,xx,yy)xx=aa+bbyy=aa-bbEND SUB21.2a 0 x 0 yaabbxxyy21.2a12.1b33.3x 9.1 yaabbxxyy12.1b按

10、值传递参数如果实参是表达式,在调用子程序时,系统将为对应形参开辟存储单元,如果实参是表达式,在调用子程序时,系统将为对应形参开辟存储单元,实参的值赋给形参变量,如果实参和对应的形参数据类型不一致,将按实参的值赋给形参变量,如果实参和对应的形参数据类型不一致,将按不同类型赋值的规则处理,如果超出范围,系统将报错。不同类型赋值的规则处理,如果超出范围,系统将报错。(参见参见samp6-3.bas) 10 a 20 a 9 b 10 a 1 b 29 a 9 b 1 bDECLARE SUB xyz (a AS INTEGER, b AS INTEGER)REM main programDIM a

11、AS INTEGER, b AS INTEGERa = 10: b = 1CALL xyz(20.3432#, 8.6)PRINT main :, a=; a, b=; bENDSUB xyz (a AS INTEGER, b AS INTEGER) a = b + a PRINT Sub xyz:, a=; a, b=; bEND SUB独立模块子程序举例(参见参见samp6-4.bas)DECLARE SUB Myswap (x AS INTEGER, y AS INTEGER)REM main programDIM a AS INTEGER, b AS INTEGERa = 10: b

12、= 20PRINT (1)a=; a, b=; bCALL Myswap(a, b)PRINT (2)a=; a, b=; bENDSUB Myswap (x AS INTEGER, y AS INTEGER) z = x: x = y: y = zEND SUB例例1 编写子程序编写子程序myswap,其作用是对输入的两个整数进行对调。,其作用是对输入的两个整数进行对调。独立模块子程序举例(参见参见samp6-5.bas)例例2 编写子程序编写子程序order,其作用是对通过实参变量传递到子程序的,其作用是对通过实参变量传递到子程序的任意任意3个数由小到大进行排序后传回主程序。个数由小到大进

13、行排序后传回主程序。DECLARE SUB Myswap (m AS INTEGER, n AS INTEGER)DECLARE SUB Order (x AS INTEGER, y AS INTEGER, z AS INTEGER)REM main programDIM a AS INTEGER, b AS INTEGER, c AS INTEGERINPUT a,b,c=, a, b, cPRINT (1)a=; a, b=; b, c=; cOrder a, b, cPRINT (2)a=; a, b=; b, c=; cENDSUB Myswap (x AS INTEGER, y AS

14、 INTEGER) z = x: x = y: y = zEND SUBSUB Order (x AS INTEGER, y AS INTEGER, z AS INTEGER) IF x y THEN CALL Myswap(x, y) IF x x THEN CALL Myswap(x, z) IF y z THEN CALL Myswap(y, z)END SUB独立模块子程序举例(参见参见samp6-6.bas)例例3 编写子程序用于分解某个数的所有因子,并输出分解的结果。编写子程序用于分解某个数的所有因子,并输出分解的结果。DECLARE SUB fac (k AS INTEGER)R

15、EM main programDIM n AS INTEGERINPUT Please input n=; nIF n = 0 THEN PRINT *Error:n=0 ENDELSE PRINT SGN(n);END IFCALL fac(n)PRINT =; nENDSUB fac (k AS INTEGER) DIM i AS INTEGER k = ABS(k) FOR i = 2 TO k 2 WHILE (k MOD i) = 0) PRINT *; i; k = k i WEND NEXT i IF k 1 THEN PRINT *; k;END SUB独立模块子程序举例(参见

16、参见samp6-7.bas)例例2 编写子程序用于打印指定区间的正弦曲线,要求每隔编写子程序用于打印指定区间的正弦曲线,要求每隔10度打印度打印一个点。一个点。DECLARE SUB sincurve (a AS SINGLE, b AS SINGLE)REM main programINPUT Please input a,b(degree):, a, bIF (a b) THEN SWAP a, bCALL sincurve(a, b)ENDSUB sincurve (a AS SINGLE, b AS SINGLE) DIM x AS INTEGER FOR x = a TO b STE

17、P 10 PRINT x; PRINT TAB(32 + 20 * SIN(x * 3.14159 / 180); * NEXT xEND SUB基本要求n掌握模块化子程序的定义和调用方法;n掌握模块之间数据的传递形式独立模块的函数引例引例DECLARE FUNCTION fmax% (x AS INTEGER, y AS INTEGER)REM main programDIM a AS INTEGER, b AS INTEGER, max AS INTEGERINPUT Plese input a,b=; a, bPRINT a=; a, b=; bmax = fmax%(a, b)PRIN

18、T The max is:; maxENDFUNCTION fmax% (x AS INTEGER, y AS INTEGER) IF (x y) THEN fmax% = x: EXIT FUNCTION ELSE fmax% = y: EXIT FUNCTION END IFEND FUNCTION模块化的函数 FUNCTION函数的结构形式如下:函数的结构形式如下: FUNCTION函数名函数名形参表列形参表列STATIC LET函数名函数名=表达式表达式 END FUNCTION在函数语句体中,函数名应至少被赋值一次在函数语句体中,函数名应至少被赋值一次;在函数体中函数名可以被赋值,但

19、不能参加运算或用作输出在函数体中函数名可以被赋值,但不能参加运算或用作输出;函数名具有类型的属性,它可以是整型、实型、双精度型、长整型或字符串型函数名具有类型的属性,它可以是整型、实型、双精度型、长整型或字符串型;函数以函数以FUNCTION语句作为开头的标志,以语句作为开头的标志,以END FUNCTION作为终止标志作为终止标志;STATIC是一个可选项,用它指定函数中的变量为是一个可选项,用它指定函数中的变量为“静态静态”变量变量;建立一个函数的操作与建立子程序的操作相似;建立一个函数的操作与建立子程序的操作相似;在函数体中不可以再定义独立模块的子程序或函数。在函数体中不可以再定义独立模

20、块的子程序或函数。函数的调用如果在主程序如果在主程序(或其它调用程序中或其它调用程序中)想调用一个函数,只需写出函数名和相应想调用一个函数,只需写出函数名和相应的参数即可,如:的参数即可,如:函数名(实际参数)函数名(实际参数)或或 函数名函数名。调用函数时应注意:调用函数时应注意:在调用程序的开头要加在调用程序的开头要加DECLARE语句。一般形式为:语句。一般形式为: DECLARE FUNCTION 函数名函数名(参数表列参数表列) 如果是无参函数,如果是无参函数,DECLARE语句中不写参数,但括弧不能少。这时一般语句中不写参数,但括弧不能少。这时一般形式为:形式为: DECLARE

21、FUNCTION 函数名函数名 ( )实参的个数与类型与形参一一对应,实参可以是常量、表达式或变量;实参的个数与类型与形参一一对应,实参可以是常量、表达式或变量; FUNCTION函数的虚实结合与子程序的相同。函数的虚实结合与子程序的相同。调用函数时,通常是为了调用函数时,通常是为了得到一个函数值,并不希望改变实参的值,这是可以按值的方式来调用函数,得到一个函数值,并不希望改变实参的值,这是可以按值的方式来调用函数,即用括号把实参变量括起来;即用括号把实参变量括起来; 函数的调用不可以作为一条独立语句,它总是出现再允许表达式出现的地函数的调用不可以作为一条独立语句,它总是出现再允许表达式出现的

22、地方,函数名指定要调用的函数,并由函数名返回一个函数值。方,函数名指定要调用的函数,并由函数名返回一个函数值。 1.编写函数用于判断函数的自变量是否是素数,如果是素数,函数值为1,则打印YES;否则,函数值为0,打印NO。2.按照证歌德巴赫猜想,一个大于5的偶数可以表示为两个素数的和。编写程序判断任意输入的两个数之间的所有偶数都可用两个素数的和表示。n子程序1:规范任意输入的数,使之符合歌德巴赫猜想的条件;n子程序2:利用循环结构,将每一个偶数表示为两个素数的和;n函数1:判断是否为偶数,如果是奇数,其值为1;n函数2:判断一个数是否为素数,如果是素数,其值为1 ;独立模块的函数举例举例局部变

23、量局部变量引例引例 a为局部变量。分别输出主程序中为局部变量。分别输出主程序中a和子程和子程序中序中a的值。的值。 DECLATR SUB Try(n!) a=4 PRINT a in main program is:;a CALL Try(4) END SUB Try(n) PRINT a in subprogram is:;a FOR i=1 TO n PRINT NEXT i END SUB 运行结果如下:运行结果如下: a in main program is:4 a in subprogram is:0 每一个模块,例如主程序、子程序和每一个模块,例如主程序、子程序和FUNCTION

24、函数,如果不加以特别说函数,如果不加以特别说明,它们各自中的变量都只在本模块中有效,或者说它们的作用域只限于本明,它们各自中的变量都只在本模块中有效,或者说它们的作用域只限于本模块。例如主程序中变量模块。例如主程序中变量a的值为的值为4,想直接在子程序输出,想直接在子程序输出a的值的值4,是做不到,是做不到的。的。 可以看出:由于未加特别说明,主程序中的变量可以看出:由于未加特别说明,主程序中的变量a只在主程序中有效。子程只在主程序中有效。子程序中变量序中变量a与主程序中的与主程序中的a不是同一个变量,各自有其存储单元。由于子程序不是同一个变量,各自有其存储单元。由于子程序中的中的a未被赋值,

25、故输出初始化时的值未被赋值,故输出初始化时的值0。 这种只在本模块中有效的变量,称为这种只在本模块中有效的变量,称为局部变量局部变量。 未加特别说明,在主程序中使用的变量也是局部变量,只限于主程序内有未加特别说明,在主程序中使用的变量也是局部变量,只限于主程序内有效,不要以为主程序中的变量在整个程序各模块中都有效。效,不要以为主程序中的变量在整个程序各模块中都有效。 一些一些BASIC版本如版本如BASICA和和GW-BASIC中,由于不提供局部变量,所有中,由于不提供局部变量,所有子程序和自定义函数都和主程序处在同一模块中,而不是分别组织在不同模子程序和自定义函数都和主程序处在同一模块中,而

26、不是分别组织在不同模块中,所以它们都是全局变量。块中,所以它们都是全局变量。局部变量局部变量 全局变量全局变量是指在程序所有模块中都有效的变量,即其作用域为整个程序的变是指在程序所有模块中都有效的变量,即其作用域为整个程序的变量。量。 QBASIC规定可以用规定可以用COMMON SHARED和和DIM SHARED语句对变量或数组语句对变量或数组作全局申明。其格式分别为:作全局申明。其格式分别为: COMMON SHARED变量表列变量表列 DIM SHARED变量表列变量表列 例如:例如: COMMON SHARED x!,y#,z%,w$指出实型变量指出实型变量x!、双精度整型变量、双精

27、度整型变量y#、整型变量、整型变量Z%、字符串变量、字符串变量w$为全局变为全局变量。量。 DIM SHARED a1(15),b2(5,12),c3(4,5,6)指出一维数组指出一维数组a1、二维数组、二维数组b2、三维数组、三维数组c3为全局数组。为全局数组。 COMMON SHARED和和DIM SHARED语句应写在主程序的开头位置,在所语句应写在主程序的开头位置,在所有执行语句之前。有执行语句之前。全局变量全局变量DECLARE SUB try ()DIM SHARED k AS INTEGERk = 99PRINT In main(1)k=; kCALL tryPRINT In m

28、ain(4)k=; kENDSUB try PRINT In sub(2)k=; k k = 77 PRINT In sub(3)k=; kEND SUB全局变量全局变量举例举例运行结果如下:运行结果如下:In main(1)k=99In sub(2)k=99In sub(3)k=77In main(4)k=77过程定义行中的STATIC选项每当调用子程序或函数时,系统将为过程中用到的变量开辟存储单元,并对数值变量赋值0。当调用结束后,过程中的变量不再存在,即不在占有内存。当指定STATIC选项后,过程中的所有变量将占有永久性的存储单元,但第一次调用时,系统为过程中的变量开辟存储单元,并对数值

29、变量赋初值0,调用结束后,这些变量仍然存在,当第二次调用时,系统仍然使用原来的存储单元,上一次保存的值就是它的初值。STATIC选项举例运行结果:运行结果:try1:n= 0 m= 0n= 0 m= 0n= 0 m= 0n= 0 m= 0try2:n= 0 m= 0n= 1 m= 2n= 2 m= 4n= 3 m= 6DECLARE SUB try1 ()DECLARE SUB try2 ()REM main programDIM i AS INTEGERPRINT try1:FOR i = 1 TO 4: CALL try1: NEXT iPRINTPRINT try2:FOR i = 1

30、TO 4: CALL try2: NEXT iPRINTENDSUB try1 PRINT n=; n, m=; m n = n + 1:m = m + 2END SUBSUB try2 STATIC PRINT n=; n, m=; m n = n + 1: m = m + 2END SUB过程体中的STATIC选项再过程体中可以使用STATIC语句指定过程体中的某些某些变量占有占有永久性的存储单元。运行结果运行结果:sub(1):a= 0sub(2):a= 3main(1):a= 100sub(1):a= 3sub(2):a= 7main(2):a= 100DECLARE SUB ss (

31、n AS INTEGER)REM main programDIM SHARED a AS INTEGERa = 100CALL ss(3)PRINT main(1):a=; aCALL ss(4)PRINT main(2):a=; aPRINTENDSUB ss (n AS INTEGER) STATIC a AS INTEGER PRINT sub(1):a=; a a = a + n PRINT sub(2):a=; aEND SUB基本要求n掌握模块化函数的定义和调用方法;n掌握模块之间数据传递方式;n了解局部变量的概念。 在调用一个子程序或函数的过程中又出现直接或间接调用该在调用一个子

32、程序或函数的过程中又出现直接或间接调用该子程序或函数本身,称为过程的递归调用。子程序或函数本身,称为过程的递归调用。 程序中不应出现无终止调用,而只应是有限次数的、有终止程序中不应出现无终止调用,而只应是有限次数的、有终止的递归调用,这可以用的递归调用,这可以用IF条件来控制,只在某一条件成立时才条件来控制,只在某一条件成立时才继续执行递归调用,否则就不再继续。继续执行递归调用,否则就不再继续。 下面举一个例子来作说明。下面举一个例子来作说明。 过程的递归调用过程的递归调用例例1 有有5个人坐在一起,问第个人坐在一起,问第5个人个人多少岁多少岁?他说比第他说比第4个人大个人大2岁。问岁。问第第

33、4个人的岁数,他说比第个人的岁数,他说比第3个人大个人大2岁。问第岁。问第3个人,又说比第个人,又说比第2个人个人大大2岁。问第岁。问第2个人,说比第个人,说比第1个人个人大大2岁。最后问第岁。最后问第1个人,他说是个人,他说是10岁。请问第岁。请问第5个人多大个人多大? 运行结果如下:运行结果如下: 18 Age函数共被调用函数共被调用5次,其中次,其中Age(5)是主程序调用的,其余是主程序调用的,其余4次次是在是在Age函数中调用的,即递归调用函数中调用的,即递归调用4次。次。 (参见参见age.bas)DECLARE FUNCTION age (n AS INTEGER)PRINT a

34、ge(5)ENDFUNCTION age (n AS INTEGER) IF n = 1 THEN age = 10 EXIT FUNCTION ELSE age = age(n - 1) + 2 END IFEND FUNCTIONDECLARE FUNCTION age (n AS INTEGER)PRINT age(5)ENDFUNCTION Age (n AS INTEGER) IF n = 1 THEN Age = 10 EXIT FUNCTION ELSE Age = Age(n - 1) + 2 END IFEND FUNCTION5nAge4nAge3nAge2nAge1n10

35、Age12141618例例2 利用递归调用求解利用递归调用求解n!n!=1当当 n=1或或n=0时时n (n-1)!当当 n0 时时求求 n ! 的问题可以转化为求的问题可以转化为求n (n-1)! 的新问题,而求(的新问题,而求(n-1)! 与求与求n ! 的解法完全相同,只是运算对象由的解法完全相同,只是运算对象由n 变成了变成了n 1,这时求这时求n (n-1)! 的问题由转化为求的问题由转化为求n (n-1) (n-2)! 的的新问题新问题,每次转化为新问题时,运算对象都减,每次转化为新问题时,运算对象都减1,照此一,照此一直递归下去,直到直递归下去,直到n =1结束调用。结束调用。D

36、ECLARE FUNCTION fac& (n AS ANY)REM main programDIM m AS INTEGERDIM y AS LONGINPUT Please input m=; mIF m 0 THEN PRINT Input data error! ENDELSE y = fac&(m) PRINT m; !=; yEND IFENDFUNCTION fac& (n AS INTEGER) DIM t AS LONG IF (n = 1) OR (n = 0) THEN fac& = 1 EXIT FUNCTION ELSE t = n * fac&(n - 1) fac

37、& = t END IFEND FUNCTION4nt3nt2nt1nt26241fac&2fac&6fac&24fac&过程递归调用的说明n一个问题要采用递归调用的方法来解决,必须符合一下三个条件:可以把要解决的问题转化为一个新的问题,而这个新的问题的解法仍与原来的解法相同,只是处理对象有规律的递增或递减; n可以应用这个转化过程使问题得到解决;n必定要有一个明确的结束递归的条件。用户自定义函数用户自定义函数DEF函数函数 QBASIC提供两类三种形式的函数。提供两类三种形式的函数。 (1)系统提供的标准函数系统提供的标准函数:sin(x),sqr(x) (2)用户自己定义的函数用户自己定义

38、的函数: 它又分两种:它又分两种: 模块内使用的自定义函数模块内使用的自定义函数DEF函数,它只在本模函数,它只在本模块有效;块有效; 独立作为一个模块的外部函数独立作为一个模块的外部函数FUNCTION函数。函数。它是一个独立的模块,而不是其它模块的一部分。它是一个独立的模块,而不是其它模块的一部分。单行单行DEF函数函数(1)定义单行定义单行DEF函数的一般格式函数的一般格式 DEF fn(参数参数)=表达式表达式(2)自定义函数名由两部分组成自定义函数名由两部分组成“fn”,它是自定义函数的标志,不可缺少;,它是自定义函数的标志,不可缺少; ,用户指定的名字,用户指定的名字 单行单行DE

39、F函数用一个语句定义一个函数,故又称函数用一个语句定义一个函数,故又称“语句语句函数函数”。 DEF是是Define的缩写,的缩写,fn是是Function(函数函数)的缩写。这两项的缩写。这两项是是DEF的语句必须有的,而且其格式是不能变动的的语句必须有的,而且其格式是不能变动的 定义了定义了此函数后,在程序中就可以像调用此函数后,在程序中就可以像调用INT、EXP、LOG等标准等标准函数一样调用它。函数一样调用它。 (1)自定义函数可以没有参数。自定义函数可以没有参数。 例例 没有参数的自定义函数没有参数的自定义函数 DEF fnabc$=This is a user defined fu

40、nction. PRINT fnadc$ END 运行时输出:运行时输出: This is a user defined function (2)函数名也有类型的规定函数名也有类型的规定 (3)自定义函数可以有多个参数,各参数之间用逗号相隔。自定义函数可以有多个参数,各参数之间用逗号相隔。 例例 已知矩形的两边,求矩形面积。已知矩形的两边,求矩形面积。 程序如下:程序如下: DEF fnc(b,h)=b*h PRINT fnc(4,5) END 运行结果为:运行结果为:20 函数函数fnc用来求矩形的面积。此函数有两个参数。用来求矩形的面积。此函数有两个参数。有关有关DEF函数的几点说明函数的

41、几点说明(1)(4)定义函数时表达式中除了有函数自变量外,还可以有其它变量定义函数时表达式中除了有函数自变量外,还可以有其它变量 例例 已知三角形三边,求三角形面积。已知三角形三边,求三角形面积。 程序如下:程序如下: DEF fne(a,b,c)=SQR(s*(s-1)*(s-b)*(s-c) a=3:b=4:c=5 s=.5*(a+b+c) PRINT fns(a,b,c) END此例在定义函数时,表达式中有四个变量,三个是函数自变量此例在定义函数时,表达式中有四个变量,三个是函数自变量a,b和和c,一,一个是程序变量个是程序变量s。在调用函数时只需给出自变量。在调用函数时只需给出自变量a

42、,b和和c的值,的值,s的值由程序的值由程序中的赋值语句赋给。中的赋值语句赋给。 (5)调用函数时参数的个数应和定义函数时参数的个数相同。调用函数时参数的个数应和定义函数时参数的个数相同。 如:上例中调用的如:上例中调用的fns函数时不应写成函数时不应写成PRINT fns(a,b,c,s)。有关有关DEF函数的几点说明函数的几点说明(2) 定义多行定义多行DEF函数的一般格式为:函数的一般格式为: DEF fn名字名字(参数)(参数) fn名字名字=表达式表达式 END DEF 定义多行定义多行DEF函数,以函数,以DEF语句开头,语句开头,以以END DEF结尾,在此两者之间为定义结尾,在

43、此两者之间为定义的函数关系,称为函数体,可以出现任的函数关系,称为函数体,可以出现任意合法的意合法的QBASIC语句。语句。 在定义的函数体中,至少应给函数名在定义的函数体中,至少应给函数名赋一次值。函数的值通过函数名带回到赋一次值。函数的值通过函数名带回到调用处。调用处。多行多行DEF函数函数例例 利用多行利用多行DEF函数求函数求total(n)=1+3+5+n的和的和(即求即求1到到n之间之间的奇数之和的奇数之和),total是变量是变量n的函数。的函数。n由由键盘输入。键盘输入。 程序如下:程序如下: DEF fntotal (n) total=0 FOR k=1 TO n STEP

44、2 total=total+k NEXT k fntotal=total END DEF INPUTn=;n PRINT fntotal(n) END 运行结果如下:运行结果如下: n=? 100 2500(1)定义自定义函数的语句可以放在程序中的任何位置,但必须先定义才能调)定义自定义函数的语句可以放在程序中的任何位置,但必须先定义才能调用它。习惯上把它放在程序的开头。程序如果写成下面这样是错误的。用它。习惯上把它放在程序的开头。程序如果写成下面这样是错误的。 INPUT n=;n PRINT fntotal(n) DEF fntotal (n) total=0 FOR k=1 TO n S

45、TEP2 total=total+k NEXT k fntotal=total END DEF END因为在因为在PRINT语句中出现语句中出现fntotal函数名,而事先并未定义过此函数,程序无法辩函数名,而事先并未定义过此函数,程序无法辩别它,如果把别它,如果把PRINT语句调到语句调到END语句之前就对了。此时语句之前就对了。此时INPUT语句可以仍然语句可以仍然在在DEF语句之前。语句之前。(2)函数的定义可以嵌套,即在定义一个函数时可以出现另一个已定义的函数。)函数的定义可以嵌套,即在定义一个函数时可以出现另一个已定义的函数。使用自定义函数时应注意的问题使用自定义函数时应注意的问题

46、GOSUB-RETURN语句语句 GOSUB是是GOto SUBroutine的缩写,意为:转到的缩写,意为:转到“子例行程序子例行程序”去执去执行,行,routine是是“例行例行”的意思,执行一个子程序如同改造一件的意思,执行一个子程序如同改造一件“例行公例行公事事”一样。一样。Subroutine译为子例行程序简称译为子例行程序简称“子例程子例程”。QBASIC把块内把块内子程序称为子程序称为“子例程子例程”(Subroutine),而把模块子程序称为子程序,而把模块子程序称为子程序(Subprogram)。 GOSUB语句语句(也称为也称为“转子语句转子语句”)将流程转到内子程序将流程

47、转到内子程序(即子例程即子例程)的的第一行。然后执行块内子程序中的语句。子程序最后一个语句为第一行。然后执行块内子程序中的语句。子程序最后一个语句为RETURN语句,它的作用是:使流程返回到调用程序。语句,它的作用是:使流程返回到调用程序。 GOSUB语句的一般格式为:语句的一般格式为: GOSUB子例程第一行行号或标号子例程第一行行号或标号 RETURN语句的一般格式:语句的一般格式: RETURN块内子程序块内子程序子例程子例程块内子程序块内子程序举例举例10 REN NAIN PROGRAM20 PRINT “$1”30 GOSUB 10040 PRINT “$2”50 GOSUB 20

48、060 GOTO 999100 REM SUB-1110 PRINT “*1”120 RETUREN200 REM SUB-2210 PRINT “*2”220 RETURN999 END运行结果:运行结果:$1*1$2 *2(1)主程序和块内子程序是连续书写的主程序和块内子程序是连续书写的它们是在同一个模块之间,如果一个程序包含多个子例程,主程序和它们是在同一个模块之间,如果一个程序包含多个子例程,主程序和所有子例程都写在同一个模块中。子例程的范围从所有子例程都写在同一个模块中。子例程的范围从GOSUB语句指定的行语句指定的行号或标号开始,到号或标号开始,到RETURN语句结束。语句结束。(

49、2)变量在整个程序中有效变量在整个程序中有效 例如,主程序中的变量例如,主程序中的变量n与块内子程序中的变量与块内子程序中的变量n是同一对象。是同一对象。n开始开始等于等于3,在调用子例程时,在调用子例程时,FOR语句中的语句中的n也就是主程序中的也就是主程序中的n,其值为,其值为3。同样,子例程中变量同样,子例程中变量p用来存放求出来的用来存放求出来的n!值,当子例程执行完毕流程返值,当子例程执行完毕流程返回到主程序时,语句回到主程序时,语句“s=s+p”中的中的p就是子例程中的就是子例程中的p,p的值累加到变量的值累加到变量s中。中。用用GOSUB语句调用块内子程序,是一些语句调用块内子程

50、序,是一些BASIC版本提供的调用子程序版本提供的调用子程序的唯一方法,的唯一方法,QBASIC之所以保留它仅仅是为了与第二代之所以保留它仅仅是为了与第二代BASIC兼容。兼容。 关于块内子程序应该注意的两点关于块内子程序应该注意的两点 其一般格式为:其一般格式为: ON数值表达式数值表达式GOSUB子例程子例程1,子例程,子例程2子例程子例程n ON GOSUB语句的用法是根据语句的用法是根据ON后面表达式的值来决定执行哪个子例程。后面表达式的值来决定执行哪个子例程。若表达式的值为若表达式的值为1,则执行子例程,则执行子例程1,值为,值为2,则执行子例程,则执行子例程2其余类推。其余类推。执

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁