第六章函数和子程序3

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例 已知矩形的两边,求矩形面积。
程序如下: DEF fnc(b,h)=b*h PRINT fnc(4,5) END 运行结果为:20 函数fnc用来求矩形的面积。此函数有两个参数。
有关DEF函数的几点说明(2)
(4)定义函数时表达式中除了有函数自变量外,还可以有其它变量
例 已知三角形三边,求三角形面积。
END FUNCTION
运行结果如下:
18
Age函数共被调用5次,其中Age(5)是主程序调用的,其余4次 是在Age函数中调用的,即递归调用4次。 (参见age.bas)
DECLARE FUNCTION age (n AS INTEGER) PRINT age(5) END
FUNCTION Age (n AS INTEGER)
有关DEF函数的几点说明(1)
(1)自定义函数可以没有参数。
例 没有参数的自定义函数
DEF fnabc$="This is a user defined function." PRINT fnadc$ END
运行时输出:
This is a user defined function (2)函数名也有类型的规定 (3)自定义函数可以有多个参数,各参数之间用逗号相隔。
单行DEF函数
(1)定义单行DEF函数的一般格式
DEF fn<名字>[(参数)]=〈表达式〉
(2)自定义函数名由两部分组成
①“fn”,它是自定义函数的标志,不可缺少;
② <名字>,用户指定的名字
单行DEF函数用一个语句定义一个函数,故又称“语句 函数”。
DEF是Define的缩写,fn是Function(函数)的缩写。这 两项是DEF的语句必须有的,而且其格式是不能变动的 定义了此函数后,在程序中就可以像调用INT、EXP、LOG等 标准函数一样调用它。
用户自定义函数——DEF函数
QBASIC提供两类三种形式的函数。
(1)系统提供的标准函数:sin(x),sqr(x)
(2)用户自己定义的函数:
它又分两种:
①独立作为一个模块的外部函数—— FUNCTION函数。它是一个独立的模块,而不是其它模 块的一部分;
② 模块内使用的自定义函数——DEF函数, 它只在本模块有效。
DECLARE FUNCTION age (n AS INTEGER) PRINT age(5) END
FUNCTION age (n AS INTEGER) IF n = 1 THEN age = 10 EXIT FUNCTION ELSE age = age(n - 1) + 2 END IF
DECLARE FUNCTION fac& (n AS ANY) REM main program DIM m AS INTEGER DIM y AS LONG INPUT "Please input m="; m IF m < 0 THEN
PRINT "Input data error!" END ELSE y = fac&((m)) PRINT m; "!="; y END IF END
IF n = 1 THEN
Age = 10
EXIT FUNCTION
ELSE
Age = Age(n - 1) + 2
END IF
END FUNCTION
n
n
n
n
n
5
4
3
2
1
Age
Age Age Age Age
18
16
14
12
10
例2 利用递归调用求解n!
1
当 n=1或n=0时
n!= n ·(n-1)! 当 n>0 时
FUNCTION fac& (n AS INTEGER) DIM t AS LONG IF (n = 1) OR (n = 0) THEN fac& = 1 EXIT FUNCTION ELSE fac& = n * fac&(n - 1) END IF
END FUNCTION
n 4
t 24
fac& 24
… fn〈名字〉=〈表达式〉
… END DEF
程序如下:
(5)调用函数时参数的个数应和定义函数时参数的个数相同。 如:上例中调用的fns函数时不应写成PRINT fns(a,b,c,s)。
多行DEF函数
例 利用多行DEF函数求 total(n)=1+3+5+…+n的和(即求1到n之 间的奇数之和),total是变量n的函数。 n由键盘输入。
定义多行DEF函数的一般格式为: DEF fn〈名字〉[(参数)]
n
n
3
2
t
t
6Βιβλιοθήκη Baidu
2
fac& 6
fac& 2
n 1
fac& 1
过程递归调用的说明
一个问题要采用递归调用的方法来解决,必须符 合以下三个条件:
可以把要解决的问题转化为一个新的问题, 而这个新的问题的解法仍与原来的解法相同, 只是处理对象有规律的递增或递减;
可以应用这个转化过程使问题得到解决; 必定要有一个明确的结束递归的条件。
求 n ! 的问题可以转化为求n ·(n-1)! 的新问题,而求(n1)! 与求n ! 的解法完全相同,只是运算对象由n 变成了n –1, 这时求n ·(n-1)! 的问题由转化为求n ·(n-1) ·(n-2)! 的 新问题…,每次转化为新问题时,运算对象都减1,照此一 直递归下去,直到n =1结束调用。
程序如下: DEF fns(a,b,c)=SQR(s*(s-a)*(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,b和c的值,s的值由程序中的赋值语句 赋给。
过程的递归调用
在调用一个子程序或函数的过程中又出现直接 或间接调用该子程序或函数本身,称为过程的递归 调用。
程序中不应出现无终止调用,而只应是有限次 数的、有终止的递归调用,这可以用IF条件来控制, 只在某一条件成立时才继续执行递归调用,否则就 不再继续。
下面举一个例子来作说明。
例1 有5个人坐在一起,问第5个人多少岁?他说比 第4个人大2岁。问第4个人的岁数,他说比第3个 人大2岁。问第3个人,又说比第2个人大2岁。问 第2个人,说比第1个人大2岁。最后问第1个人, 他说是10岁。请问第5个人多大?
相关文档
最新文档