续调用。
动态(自动)变量是指程序运行进入变量所在的子程序,才分配该变量的内存单元,经过处理退出该过程后,该变量占用的内存单元 自动释放,其内存能被其他变量占用。动态变量多用于动态数组。
格式:
STATIC〈变量1〉[()][AS〈类型〉][,〈变量2〉[()][AS〈类型〉]]…
功能:在函数或过程中定义局部变量,并在两次调用之间保留变量的值。
说明:
(1)〈变量〉是过程中要定义的局部变量,可以是简单变量或数组变量。
(2)〈类型〉用来定义对应〈变量〉的数据类型(INTEGER、LONG、SINGLE、DOUBLE、STRING或用户定义类型)。
(3)STATIC语句只能在SUB或FUNCTION过程中使用。
(4)STATIC语句后面列出的变量可以与主程序中用DIM、REDIM或COMMON语句说明的全程变量同名。但是,用STATIC说明的变量优先级高于用DIM、REDIMK或COMMON语句说明的变量,所以,STATIC语句后列出的变量是局部变量,与主程序中定义的同名全程变量无关。
[例9-20] 下面程序在主程序中用DIM定义了全程变量r、n,在子程序中定义了同名的局部变量。
'EXAMPLE 20
DECLARE SUB test()
DIM SHARED r,n
CLS
r=60:n=80:rep=0:num=0
PRINT"r","n","rep","num"
PRINT r,n,rep,num
FOR i=1 TO 10
CALL test
NEXT i
PRINT r,n,rep,num
END
子程序为:
SUB test STATIC
SHARED tep,num
STATIC r,n
r=r+1:n=n+2:rep=r:num=n
程序的运行结果为:
r n rep num
60 80 0 0
60 80 10 20
从程序的运行结果可看出,主程序中定义的全程变量r、n被子程序中定义的局部变量屏蔽起来,在子程序中起作用的是子程序中的r、n,它与主程序中的r、n不是相同的变量。
如果在SUB或FUNCTION语句中不使用STATIC关键字,则为动态变量,即每次调用过程时,都行到新的局部变量。
如在SUB或FUNCTION语句中使用STATIC关键字,则这个过程中所有变量都是静态变量,即在过程调用期间变量的值保持不变。
当在子程序中使用SHARED语句定义共享变量时,可以使STATIC属性无效,即无论在过程定义行(SUB或FUNCTION)中使用了STATIC属性还是省略STATIC属性,只要这个与主程序同名的变量出现在SHARED语句中,这个变量就可以返回到主程序,因而不是局部变量。
在STATIC语句说明的变量与在过程行中用STATIC关键字说明的变量不同。用STATIC语句说明变量绝对保证是局部变量,因为STATIC语句的优先级高于SHARED语句,它可以使SHARED语句的作用无效。
当数组作为局部变量放在STATIC语句中时,在使用之前要标出它的维数。例如:
SUB supp
STATIC array()AS INTEGER
DIM array(-5 TO 8)AS INTEGER
…
END SUB
[例9-21] 下面程序说明了STATIC语句的作用。
主程序为:
'EXAMPLE 21
DECLARE SUB testsub()
CLS
FOR i%=1 TO 5
testsub
NEXT i%
END
子程序为:
SUB testsub
STATIC y
x=x+1:y=y+1
PRINT"x=";x,"y=";y
END SUB
程序的运行结果为:
x=1 y=1
x=1 y=2
x=1 y=3
x=1 y=4
x=1 y=5
程序中x和y都是过程testsub中的局部变量 ,y被说明为STATIC变量,每次调用保持上一次的值,y的值会变化;x未被说明,它是动态变量,每次调用都被重新初始化为0,它的值总是不变。
[例9-22] 分析程序的运行结果。下面子程序中的x$、y$都是局部变量,但x$是动态变量,y$是静态变量。
主程序为:
'EXAMPLE 22
DECLARE SUB star()
CLS
FOR i%=1 TO 5
CALL star
NEXT i%
子程序为:
SUB star
STATIC y$
x$=x$="#":y$=y$="*"
PRINT x$,y$
END SUB
程序运行结果为:
# *
# **
# ***
# ****
# *****
本章共讲了如下的语句:
DEF FN自定义函数、GOSUB子程序、FNCTION子程序、SUB子程序。
下面将它们的功能作一下简单的比较:
1.DEF FN与FUNCTIION的比较
DEF FN在BASIC中只能定义一个单行函数关系。只能在本程序单位中使用。
FUNCTION子程序可以实现单行函数所不能实现的复杂函数关系,函数内部的的有变量都隐含为局部变量,变量的传送方式灵活多样。可以实现递归调用,还可被其他程序模块调用,资源可以共享。
2.GOSUB和SUB子程序的比较
GOSUB子程序中的变量是全局变量,只能在同一个程序中使用。适合小型的程序开发。
SUB子程序中的变量都是局部变量,数据传送更方便,可以实现双向传送。既可“按地址传送”,又可以“按值传送”。很适宜大型的结构化程序的设计。
3.FUNCTION子程序和SUB子程序的比较
(1)共同点是:过程中变量都是局部变量,数据能双向传送。能将通用的过程全并起来组成一个Quick库,供所有程序模块调用,实现资源共享。
(2)不同点:
FUNCTION主要通过函数名返回数据,函数名被赋值后,不能再参加运算。它的数据虽然也能双向传送,但建议初学者尽量不要改变虚参表中各虚参的值,以免引起一些无法预料的问题。
SUB子程序的数据传送主要是通过虚实结合方式,数据传送量多,比FUNCTION子程序更灵活。它能取代FUNCTION的一切功能。
总之,每个过程只完成一个单纯的任务,不要把过多的任务放到一个过程中,当然每一个任务还可以有若干个了任务,因而形成了过程的多层调用,即过程的嵌套。不要只习惯于写一个程序去包罗万象,而要善于去调用过程,利用过程的嵌套调用。当然,对比较简单的程序,有一级调用就够了。但在大型的程序中往往采用多层调用的短的过程集合,通过逐步地实践,这一程序设计的技术是不难掌握的。
1.有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第3个人,又说比第2个人大2岁。问第2个人,说比第1个人大2岁。最后问第1个人,他说是10岁。请问第5个人有多大岁数。
2.用递归法求两个整数m和n的最大公约数。
3.利用RND函数,产生10个随机存放在数组x1()中,再按从大到小的顺序显示出来。
4.编写一个函数,求两个整数的最在公约数。在主程序中给出3个整数a、b、c,通过调用函数求3个整数的最大公约数。
5.求两个数a和b的最大公约数和最小公倍数。要求:最大公约数由一个函数求出,然后求出最小公倍数,最小公倍数和a、b均用全局变量来存放。
6.定义一个求圆面积的用户定义函数,计算8个面积之和,并在函数中累计调用函数的次数。
7.制用户定义函数,输入一个0~6数字,显示汉英对照星期的函数。
8.利用自定义函数,计算某一个字符在字符串中出现的次数。