数与图(4)——多项式表达式

在数与图(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>标记将指数显示为上标,但是上标的字号并没有因此而变小。另外,上标的部分超出了标签的上部边界。

七、讨论

这是一个与数学计算无关的例子,但却是一个极好的拼字串的例子,更主要的是,当存在多个变动因素,而这些因素会对结果产生错综复杂的影响时,这个例子提供了一个严谨的分析问题、解决问题的方法。

无论是表格、流程图,还是程序,其实都是一种语言,是一种表达方式。我们可以根据被描述事物的特点,来选择表达方式。表格是二维的,当事物存在两个变动项时,表格有能力呈现出完备的结果;流程图是一维的,而程序是按顺序执行的一系列指令,也是一维的,因此,流程图是距离程序最近的语言。

(0)

相关推荐

  • Java基础用IDEA创建项目

    集成开发环境 IDEA是一个专门针对Java的集成开发工具(IDE),由Java语言编写.所以,需要有JRE运行环境并配置好环境变量.它可以极大地提升我们的开发效率.可以自动编译,检查错误. 创建项目 ...

  • 如何计算前n个整数的p次幂的和?证明伯努利幂和

    瑞士的伯努利家族共有八位世界著名的数学家,雅各布·伯努利(Jacob Bernoulli)便是其中之一.1713年,雅各布·伯努利提出了前n个整数的p次幂之和的表达式.他的解是n的(p+1)次多项式, ...

  • 超越函数是指那些不满足任何以多项式作系数...

    超越函数是指那些不满足任何以多项式作系数的多项式方程的函数.说的更技术一些,单变量函数若为代数独立于其变量的话,即称此函数为越超函数.变量之间的关系不能用有限次加.减.乘.除.乘方.开方运算表示的函数 ...

  • 数与图(6)——多项式乘法

    在上一篇文章<数与图(5)>中,我们实现了合并同类项操作,而合并同类项是多项式乘法的基础,本文在此基础上,用程序实现多项式的乘法运算. 首先将上一篇文章的项目"合并同类项&quo ...

  • 数与图(7)——求多项式的值

    在上一篇<数与图(6)>中,我们实现了多项式的乘法,但是遗留了一个很重要的问题--如何验证程序的正确性呢?在这篇文章中,我们尝试给定一个x的值,用两种方法求多项式的值,即,同时将x的值带入 ...

  • 数与图(1)

    App Inventor的画布组件,相当于一个平面直角坐标系,画布上的任何一点都可以用一对坐标(x,y)加以描述,而画布具有画笔的功能,可以在指定位置绘制点.线.圆等基本图形,这就使得开发者可以用程序 ...

  • 数与图(2)

    在上一篇文章『数与图(1)』中我们遗留下一个问题,当坐标轴的原点不在画布范围内时,程序会报错,现在我们就来解决这个问题. "原点不在画布范围内"可能有三种不同的情况: (1)x轴原 ...

  • 数与图(2)修正版

    说明:此前发送的『数与图(2)』缺少图1,现将图1补上,重新发送,给您带来的不便,请多包涵. 在上一篇文章『数与图(1)』中我们遗留下一个问题,当坐标轴的原点不在画布范围内时,程序会报错,现在我们就来 ...

  • 数与图(3)

    在前两篇文章(数与图(1).数与图(2))中,我们完成了对坐标系的绘制,现在可以在坐标系中绘制函数图像了. 在高中数学课本里,函数被表示为y=f(x),在函数的定义域内,每一个x值,都有唯一的y值与其 ...

  • 数与图(5)——合并同类项

    在上一篇文章<数与图(4)>中,我们拼写出多项式表达式,其难点在于如何处理众多可能的条件分支.本篇文章继续讨论与多项式有关的代数运算--合并同类项. 拥有初中数学基础的读者都知道合并同类项 ...

  • 数与图(8)——计算的代价

    在<数与图(7)>中,我们通过求多项式的值,检查出程序的bug,于是从最靠近结果的部分开始,追溯错误产生的原因,找到并最终改正了错误.本篇文章继续讨论求值的问题,我们要来评价一下计算的代价 ...

  • 数与图(9)——幂函数曲线

    在<数与图(3)>中我们分别绘制了一次函数.二次函数及三次函数的曲线,本篇文章中,我们将绘制6次函数的曲线,函数的表达式为 y = (x+3.6)*(x+2.5)*(x+1)*(x-0.5 ...