师:同学们好,今天我们一起来学习第四章第一节用解析法设计程序。今天有两个任务,第一,测量高度;第二,小球弹跳问题。关于高度的测量,有一个非常著名的故事,我们通过一个动画来看一下,有什么办法可以测量出金字塔的高度。
生:哈哈,这很简单,直接用尺子量就可以了。
师:错误永远留在这里吧,现在你只有一次机会。
生:只剩下我一个人了,我要冷静下来。对了,影子!我想到了,首先要找一个天气好的日子,在地面上,当人的影子和他的身高一样长的时候,金字塔的影子和它的高度也是一样的。这时只要测量金字塔影子的长度,就可以得出金字塔的高度了。这个答案你满意吗?
师:这个答案大家满意吗?用来求金字塔的高度是可行的。当个人的影子长度与身高相等的时候,测量金字塔的影子最远处到金字塔底边的距离,然后再加上金字塔底边长的一半,就得出金字塔的高度。但是这个方法有一些局限性,并不通用。如果被测量的物体,它的底边长是高度的两倍或者大于高度的两倍,那么在这个时刻它的影子是投不到地面的;又或者这个被测量物体的底部不规则,我们测不到底边长;还有可能被测量物的底部不可到达,这些情况下这个方法都不能使用。同学们有没有更好的测量方案呢?这一节课我们就一起来探索一下。
如图,Mn是竖直于地面的物体,其底部n不可到达。为了测量Mn的高度,我们在地面上选取了一条与Mn在同一平面的水平线段AB为基线,测量得到AB的值为20米。从A点向M点张望的仰角,我们记为Alpha,它的值等于38.4度;从B点向M点张望的仰角记为Beta,等于22.8度。设计程序计算高度Mn。
我们要设计程序来解决问题。在上学期的学习中,我们知道计算机设计程序解决问题一般分为这样5个步骤:首先分析问题,然后设计算法,再编写程序,调试程序,最后得到答案。那今天我们就按照这个思路来解决测量高度的问题。
所以第一步是分析问题,我们要计算Mn的高度,就需要借助已有的知识——三角函数的知识。因为MN垂直于地面,所以三角形AMN和BMN都是直角三角形。在三角形AMN当中,Tan角Alpha等于MN除以AN,所以AN等于MN除以Tan Alpha。同样的,在三角形BMN当中,我们可以得到式子BN = MN除以Tan Beta。两式相减,BN - AN = AB,把这两个式子代入进来,合并同类项,就等于MN(1除以Tan Beta - 1除以Tan Alpha)。因为AB的值我们知道,记为a,所以MN = a除以(Tan Beta的倒数 - Tan Alpha的倒数)。利用这个式子我们就可以求得高度Mn。
接下来我们需要设计算法,这里提醒大家注意一个问题,在VB的正切函数当中,自变量的单位是弧度,而我们的Alpha、Beta是角度,所以我们要先进行一个转换,弧度 = 角度×π÷180。设计算法,有了这个解析式以后,设计算法就很简单了,我们可以先求出两个仰角正切值的倒数差,然后再与AB的长a相除就可以了。
分步骤描述是这样的:第一步,设计输入输出界面,从三个文本框中输入基线长a、仰角Alpha和仰角Beta;第二步,计算Tan Alpha的倒数,用x来表示;第三步,计算Tan Beta的倒数,用y来表示;第四步,计算高度a÷(y - x),最后输出结果。
接下来是编写程序,我们先看界面设计,关于界面设计的知识我们在第二章的时候有详细的介绍和学习,这里再带大家一起复习一下。这里有基线长、仰角Alpha、Beta的输入框,我们还需要添加一个文本框,用来显示计算的结果。添加文本框,修改一下属性,把字体改大一点,把Text属性值改为空。然后对这个文本框做一个标注,告诉用户这个文本框的用途——被测量物体的高度。这是我们的界面计算按钮,用来触发计算。
下面我们根据算法来编写代码。这是一个简单的顺序结构,由计算按钮触发,所以我们双击计算,然后书写代码。第一步从三个文本框中输入基线长、仰角Alpha和仰角Beta,基线长从第一个文本框输入,我们知道Text属性可以返回文本框中的内容,所以Text1.Text返回的就是Text1中的内容,然后将这个内容转换为数值,再付给a。Alpha的值从第二个文本框获取,用英文单词代替Alpha。Beta的值从第三个文本框,即Text3.Text输入。第二步计算Tan Alpha的倒数,用x表示,在x的表达式里有一个π,这里用符号常量来代替,x = 1÷Tan(Alpha×π÷180)。第三步,计算Tan Beta的倒数,y = 1÷Tan(Beta)。第四步,计算Mn的高度 = a÷(y - x),最后输出结果,我们要输出的是Mn的值,输出在第四个文本框里,所以赋值号的左边是Text4,用Text属性来显示最终的运算结果。
接下来我们运行看看,基线长20,Alpha 38.4度,Beta 22.8度,计算,我们得到了这个答案,它的高度17.9,我们就写到小数点后一位。程序编写完成了。
我们思考一个问题,如果输入的两个夹角相等,或者其中一个夹角是90度。当然在实际问题中这是不存在的,但是用户在使用的过程中可能会出现这样的误操作,这都会导致程序非正常结束,甚至会使输出的结果是负数。我们来看看,运行程序,基线长20,仰角,如果两个仰角相等,单击计算,出错,除数为0,对吧?那如果有一个仰角是90度,计算结果是 - 13,不可能,是不是?所以我们在程序中怎样去防范这样的错误呢?提醒一下,大家可以使用基本结构里的选择结构,将用户误操作输入的错误的数据屏蔽掉。如果用户输入的是不合法的数据,我们给出一个提示框:“您输入的数据无效,请检查”。如果输入的数据我们判断是有效的,那我们再开始进行计算。
测量高度问题,我们的第一个任务已经完成了。在这个问题的求解过程中,我们运用了三角函数的知识,在两个直角三角形里分别找出了高度Mn与两个仰角正切值之间的关系,然后用表达式来表示这样的关系,最后通过一系列的计算推导得出解决这个问题所需的表达式,再设计程序求解问题。像这样一种通过分析问题中各要素间的关系,用最简练的语言或形式化的符号来表达它们的关系,得出解决问题所需的表达式,然后设计程序求解问题的方法就称为解析法。
我们可以这样来描述解析法解决问题的步骤:首先分析要素间的关系,其次用最简练的语言或形式化的符号来表达它们的关系,我们称之为抽取数学模型,得出解决问题所需的表达式,概括为建立解析式,然后就跟计算机解决问题的过程相接轨了——设计算法,编写程序,调试程序,最后得到答案。这就是我们的解析法。
