在数与图(3)中,我们绘制了一次函数、二次函数及三次函数的图形,接下来我们希望绘制更为复杂的函数图形,如下式:
通过改变系数的值,来观察系数对曲线形状的影响。这项任务涉及到大量的运算,对于人类来说,即便是借助于计算器,也是一项繁琐且乏味的工作,但是对于计算机,作重复操作恰好是它所擅长的。
在正式开始编写绘图程序之前,我遇到了一个问题,就是如何在App Inventor中呈现高阶幂函数的表达式,如式(1)所示,对于第一项而言,总不能连续地写8个x*吧。我尝试拼接字串,结果遭遇了巨大的困难。这个对于人类来说非常简单的函数式,要想用程序拼接出来,还是有些难度的。经过一番思考,我似乎找到了一个方法,本文将分享这一方法的实现过程,供读者参考。
一、表格法
在幂函数的表达式中,除了自变量x,系数和指数都是可变的。对于系数而言,需要区别对待正负值,而且还要单独处理系数等于0和±1的情况;对于指数而言,需要单独处理指数是1和0的情况;此外,对于首项,还要考虑正负号的问题(不显示+号)。可变的系数与可变的指数交叉在一起,就构成了多种可能的结果,如果不能清楚地列出所有可能的结果,在使用条件语句编写程序时,就会产生疏漏,或进行重复判断。为此我采用了表格法,将所有可能的结果列举出来,如下表所示。
表1 列举所有可能的结果
上面的表格中列举了所有可能的结果,经观察比较,发现有些结果是相同的(标有背景色的单元格),把这些单元格合并,就得到了下面的表格。表格中的max指的是指数的最大值。
二、流程图法
表格表示的结果还不足以方便地转化为程序,需要将表格的内容翻译成流程图(表格和流程图都是一种语言),结果如图1所示。
图1 将表格内容翻译为流程图
在流程图中,每一个表示条件判断的菱形节点都有一个输入和两个输出,这里没有使用“Y”、“N”来标记逻辑值的真假,而是用颜色来加以区分,为的是让流程图看起来更加简洁,其中绿色表示“真”,红色表示“假”,就象红绿灯一样。图中的空心圆表示流程的起点,实心圆表示流程的终点。
图中略粗一点的黑线指向了实心圆,数一数黑线的数量,共有13条,也就是说有13种可能的结果。
三、从流程图到程序
为了把注意力集中在程序的逻辑上,我们暂时不去考虑用户界面的事情。在App Inventor中创建一个项目,命名为“多项式表达式”,直接切换到编程视图中,创建一个有返回值的过程——单项式表达式,代码如图2所示。
图2 将流程图转化为程序
如果仔细数一下最末梢的“则”和“否则”分支,发现这个数量也是13。所谓“末梢”,指的是那些直接输出字符串的分支(有些分支后面连接的是另一个条件语句)。代码中使用的<sup>...</sup>是html标记,被标记包围的部分显示为上标。
想象一下,如果没有前面的表格法和流程图法,要写出这样一段程序,难度会有多大!
四、用户界面
如图3所示,用户界面中包含了9个文本输入框、两个按钮和1个标签。文本输入框放在水平布局中,名称分别为a到i的9个小写字母,宽度设为充满。标签1的属性设置见图3。
图3 用户界面
五、编写程序
1、全局变量
如图4所示,程序中需要用到以下三个全局变量,注意新版本中可以直接用组件对象为变量赋值,如图中的输入框列表。
图4 程序中的全局变量
2、有返回值过程
(1)随机系数
这是一个生成随机数的过程,随机生成幂函数的系数,并确保首项系数不为零。参数“首项”为逻辑值,当生成首项系数,即a时,参数值为真。代码如图5所示。
图5 有返回值过程——随机系数
(2)多项式表达式
利用图2中的单项式表达式,拼接成多项式表达式,代码如图6所示。
图6 有返回值过程——多项式表达式
3、无返回值过程
前面之所以要引入全局变量“输入框列表”,就是为了能够批量地设置输入框组件的属性。创建一个过程——输入框初始化,利用针对列表的循环语句,批量设置组件属性,代码如图7所示。
图7 无返回值过程——输入框初始化
4、事件处理程序
在屏幕初始化时,调用输入框初始化过程;当生成系数按钮被点击时,生成9个随机数,并填写到9个文本输入框中;当求表达式按钮被点击时,在标签中显示对应的多项式。代码如图8所示。
图8 三个事件处理程序
六、测试
分别选取三组不同的随机系数,求多项式表达式,测试结果如图9所示。
图9 程序的测试结果
美中不足的是,标签组件虽然可以借助html的<sub>标记将指数显示为上标,但是上标的字号并没有因此而变小。另外,上标的部分超出了标签的上部边界。
七、讨论
这是一个与数学计算无关的例子,但却是一个极好的拼字串的例子,更主要的是,当存在多个变动因素,而这些因素会对结果产生错综复杂的影响时,这个例子提供了一个严谨的分析问题、解决问题的方法。
无论是表格、流程图,还是程序,其实都是一种语言,是一种表达方式。我们可以根据被描述事物的特点,来选择表达方式。表格是二维的,当事物存在两个变动项时,表格有能力呈现出完备的结果;流程图是一维的,而程序是按顺序执行的一系列指令,也是一维的,因此,流程图是距离程序最近的语言。
联系客服