定制Authorware闰年判断函数

4/8/2006来源:Authorware教程人气:9747

春有百花夏有雨,秋有凉风冬有雪",四季更替谓之"年",在这"年"的概念里隐藏着一个"四年一闰"的说法,也就是所谓的"闰年"。现在世界通行的公历,平年365天,闰年366天,每四年一闰,每满百年少闰一次,到第四百年再闰,即每四百年中有97个闰年。闰年的判断算法虽然简单,却是计算机编程里的一个经典问题,常被程序员编制为通用函数进行各种场合的调用,今天我们就把它引入到Authorware 6.5里,定制一个Authorware的闰年判断函数!

  Authorware 6.5是目前的最新版本,在这个6.5新版本中最引人注目的就是开始支持自定义函数功能,它允许把内部计算图标代码或者存储在外部文本文件的脚本,甚至是字符串自定义为函数--盼望已久的自定义函数功能终于浮现在广大Authorware爱好者面前!虽然相对于高级语言开发平台来说,Authorware 6.5的自定义函数功能显得相对"幼稚",但是它的出现无疑使Authorware的脚本语句变得更加灵活强大,易于管理!我们马上来尝尝鲜,编写一个闰年判断函数For Authorware版本。

  计算图标定义方式

  根据内部计算图标代码定义函数是最基本方法,启动Authorware 6.5,开始创建一个具有非凡意义的自定义函数--闰年判断函数LeapYear。

  1、 新建工程,命名自定义函数

  新建一个"LeapYearFunction.a6p"文件;拖动一个计算图标到流程线上,并命名为"LeapYear",这个名字将成为即将诞生的自定义函数的名称。函数命名需要注意唯一性,不能和其它图标或者函数同名,否则将不能正常调用执行。

  2、 编写闰年判断函数LeapYear

  目前公认的闰年判断算法,满足下列二者之一,即为闰年:

  ① 能被4整除,但不能被100整除
  ② 能被4整除,且能被400整除

  根据这个算法,我们就可以在程序中实现闰年的逻辑判断。打开计算图标"LeapYear",在里面写入以下代码:

if MOD(Args@"LeapYear",400)=0|(MOD(Args@"LeapYear",4)=0 & MOD(Args@"LeapYear",100)<>0) then
Result@"LeapYear":=TRUE
else
Result@"LeapYear":=FALSE
end if

  打开计算图标"LeapYear"的属性对话框(Ctrl+I),把Contains Script Function选项勾上(如图1),这意味着告诉系统把"LeapYear"封装为自定义函数。确定后返回流程,发现计算图标"LeapYear"的图标变化了(如图2),这样自定义函数"LeapYear"就宣告诞生!



图1设置"LeapYear"的属性对话框



图2 函数"LeapYear"的图标变化

此时执行菜单Window >Functions打开函数列表窗口,在Script Icons分类中就可以看到LeapYear自定义函数的"真身"(如图3),你可以在函数描述(Description)文本框里输入函数说明和其它使用信息(也可通过执行菜单Modify > Icon > Description…来输入函数相关说明信息),例如输入:Return:=LeapYear("Year")



图3 自定义函数"LeapYear"

  3、 调用自定义函数LeapYear

  函数编写封装的目的就是为主程序服务,我们立马派遣"LeapYear"上岗。Authorware 6.5中是通过系统函数CallScriptIcon来调用内部计算图标脚本方式定义的函数的。我们编写的闰年判断函数LeapYear为一返回型函数,返回值为True(1)或者False(0),True表示为闰年,False则相反。

  我们继续在计算图标"LeapYear"后添加一交互图标"ShowYear",拖动一计算图标到其右边,选择为文本输入响应交互,并命名为"*"(即接受任何文本输入);打开该计算图标并输入以下代码:

if CallScriptIcon(@"LeapYear",EntryText)=TRUE then
IfLeapYear:="是"
else
IfLeapYear:="否"
end if

  最后我们设置一下显示界面,双击打开交互图标"ShowYear",用文本工具输入{ IfLeapYear },并勾选"Update Displayed Variables"显示属性,存盘后即完成函数的调用工作。



图4 调用自定义函数"LeapYear"

  简单的几个步骤就完成计算图标脚本的自定义函数工作,这实在是Authorware 6.5的一个革命性新功能。如果脚本是存储在外部文本文件里,这种情况该如何定义和调用函数呢?下面我们介绍一下外部文本文件的函数定义方式。

文本文件定义方式

  1、 外部文本文件脚本准备工作

  既然脚本存储在外部文本文件里,当然首先得新建一个文本文件,例如"LeapYear.txt",编辑该TXT文本文件并输入以下脚本代码:

if MOD(Args@IconID,400)=0|(MOD(Args@IconID,4)=0 & MOD(Args@IconID,100)<>0) then
Result@IconID:=TRUE
else
Result@IconID:=FALSE
end if

  和上面第一种方法的函数代码比较,你会发现唯一变化的是原来的Args@"LeapYear"被Args@IconID所替代,这样做是为了保证该函数可被任何的计算图标调用,即外部文本文件定义方式考虑到了函数的通用性问题。存盘后这个外部脚本函数就完成了,也就是说这种方式定义的函数一切脚本都存在于外部TXT文本中,比第一种定义方式显得更加灵活和强大,因为Authorware 提供了TXT文本的读写接口,允许我们在Authorware中随时对它进行编辑修改。

  2、 在Authorware 6.5中调用外部脚本函数

  调用任何外部脚本的自定义函数前都必须对外部脚本函数中的变量进行初始化,也就是自变量的创建过程,因为Authorware在运行过程并不具备自动建立变量的功能。

  新建一个"LeapYearFileMethod.a6p"文件,拖入一个计算图标到流程线上并命名为"initialize",在计算图标里输入以下代码:

Args@IconID:=""
Result@IconID:=""

  输入完毕后关闭计算图标代码编辑器时,系统会提示创建这些变量,一一确定后就完成了自定义函数的自变量初始化工作。

  3、 调用自定义函数LeapYear

  和计算图标自定义函数的调用不同,外部文本文件脚本定义的函数调用的是通过系统变量CallScriptFile来完成的,因此我们只要把上面计算图标定义方式第3步骤中的代码替换为以下的代码即可,其它的保持不变:
if CallScriptFile(FileLocation^"LeapYear.txt",EntryText)=TRUE then
IfLeapYear:="是"
else
IfLeapYear:="否"
end if

  这样自定义函数的调用也就完成了,执行效果和计算图标定义方式一样。

  字符串定义方式

  除了上面介绍的两种自定义函数方式外,Authorware 6.5还支持把存储在字符串中的脚本定义为函数,这些字符串可以是文本文件中的字符串行,数据库中的字符串,甚至是加密的字符串(使用前须解密)等,字符串的不同行以Return(回车)分隔。例如上面提到的外部文本文件"LeapYear.txt",我们可以用系统函数ReadExtFile把该文本内容读入赋予一字符串变量script,然后再当做函数来调用;需要注意的是字符串脚本函数是通过CallScriptString系统函数来调用的,具体代码如下:

script := ReadExtFile(FileLocation^"LeapYear.txt")
CallScriptString(script)

  过上面三种自定义函数实现方式的介绍,大家对Authorware 6.5的自定义函数是否有更深刻的认识?

  ·相关小知识--时间历法

  太阳历又称为阳历,是以地球绕太阳公转的运动周期为基础而制定的历法。太阳历的历年近似等于回归年,一年12个月,这个"月",实际上与朔望月无关。阳历的月份、日期都与太阳在黄道上的位置较好地符合,根据阳历的日期,在一年中可以明显看出四季寒暖变化的情况;但在每个月份中,看不出月亮的朔、望、两弦。

  如今世界通行的公历就是一种阳历(格里高利历),平年365天,闰年366天,每四年一闰,每满百年少闰一次,到第四百年再闰,即每四百年中有97个闰年。公历的历年平均长度与回归年只有26秒之差,要累积3300年才差一日。下载源文件